微服务架构-实现技术之具体实现工具与框架7:Spring Cloud Zuul原理与注意事项


微服务架构-实现技术之具体实现工具与框架7:Spring Cloud Zuul原理与注意事项

 

https://github.com/Netflix/zuul/wiki)

  1.   Zuul is the front door for all requests from devices and web sites to the backend of
  2.   the Netflix streaming application.

Zuul是从设备和网站到后端应用程序所有请求的前门,为内部服务提供可配置的对外URL到服务的映射关系,基于JVM的后端路由器。其底层基于Servlet,本质组件是一系列Filter所构成的结构链,也就是说Zuul的逻辑引擎与Filter可用其他基于JVM的语言编写,比如Groovy。基本具备以下功能:认证和鉴权+压力控制+金丝雀测试+动态路由+负载均衡+静态响应处理+主动流量控制+限流+文件上传+参数转换+其他逻辑与业务处理等。

我们必须对其原理和功能有充分认识,这样可以对它的某些特性进行优化且进行二次开发,定制适合自己应用的独特功能。在此,需注意一点,Zuul 1.0 是建立在Servlet上的同步阻塞架构,故在使用时对这部分的优化工作是必要的,Zuul 2.0 是建立在Servlet上的异步非阻塞架构,已经开源,但是Spring Cloud中国社区的笔者已通过官方Issue询问过Spring Cloud是否整合Zuul 2.0,得到的答案时否定的,所以,相对于第一代网关Zuul而言,Spring Cloud的第二代网关中间件Spring Cloud Gateway必将大放异彩。

/routes/details) +  /filters)。在 /filters 接口中会返回很多的 Filter 信息,包括:类路径、执行顺序、是否被禁用、是否静态。可以组合成如下图:

各内置Filter的详细说明如下表:

名称类型次序描述
ServletDetectionFilter pre -3 该过滤器用于检查请求是否通过Spring Dispatcher。检查后,通过isDispatcherServletRequest设置布尔值。
Servlet30WrapperFilter pre -2 适配HttpServletRequest为Servlet30RequestWrapper对象
FromBodyWrapperFilter pre -1 解析表单数据,并为请求重新编码。
DebugFilter pre 1 Debug路由标识,顾名思义,调试用的过滤器,可以通过zuul.debug.request=true,或在请求时,加上debug=true的参数,例如$ZUUL_HOST:ZUUL_PORT/path?debug=true 开启该过滤器。这样,该过滤器就会把RequestContext.setDebugRouting() 、RequestContext.setDebugRequest() 设为true。
PreDecorationFilter pre 5 该过滤器根据提供的RouteLocator确定路由到的地址,以及怎样去路由。该路由器也可为后端请求设置各种代理相关的header。
RibbonRoutingFilter route 10 该过滤器使用Ribbon,Hystrix和可插拔的HTTP客户端发送请求。
SimpleHostRoutingFilter route 100 该过滤器通过Apache HttpClient向指定的URL发送请求。URL在RequestContext.getRouteHost() 中。
SendForwardFilter route 500 该过滤器使用Servlet RequestDispatcher转发请求,转发位置存储在RequestContext.getCurrentContext().get("forward.to") 中。
SendResponseFilter post 1000 将Zuul所代理的微服务的的响应写入当前响应。
SendErrorFilter error 0 如果RequestContext.getThrowable() 不为null,那么默认就会转发到/error,也可以设置error.path属性修改默认的转发路径。

以上是使用 @EnableZuulProxy 注解后安装的 Filter,如果使用 @EnableZuulServer 将缺少 PreDecorationFilter、RibbonRoutingfilter、SimpleHostRoutingFilter。

如果你不想使用原生的这些功能,可以采取替代实现的方式,覆盖掉其原生代码,也可以采取禁用策略,语法如下:

zuul...disable=true
比如要禁用 SendErrorFilter,在配置文件中添加 zuul.SendErrorFilter.error.disable=true即可。

https://blog.csdn.net/a5518007/article/details/73531329。

  • 初始化:tomcat初始化线程数为32,undertow为19
  • 运行时间:tomcat运行时间为36秒,undertow为22秒
  • 结果对比:
  •          tomcat错误率0%,平均响应时间为3.45秒,99%响应时间在9.14秒内,最长响应时间为11.88秒,吞吐量为545/sec
  •          undertow错误率0%,平均响应时间为2.09秒,99%响应时间在3.99秒内,最长响应时间为5.21秒,吞吐量为897/sec

这里,可以将Spring Boot内嵌容器Tomcat替换为Undertow,Undertow提供阻塞或基于XNIO的非阻塞机制(包的大小不足1MB,内嵌模式运行时堆内存只有4MB)

  1.  
  2.   <dependency>
  3.   <groupId>org.springframework.bootgroupId>
  4.   <artifactId>spring-boot-starter-webartifactId>
  5.   <exclusions>
  6.   <exclusion>
  7.   <groupId>org.springframework.bootgroupId>
  8.   <artifactId>spring-boot-starter-tomcatartifactId>
  9.   exclusion>
  10.   exclusions>
  11.   dependency>
  12.   <dependency>
  13.   <groupId>org.springframework.bootgroupId>
  14.   <artifactId>spring-boot-starter-undertowartifactId>
  15.   dependency>

Undertow主要参数配置说明如下:

  1.   server:
  2.   port: 8081
  3.   # 下面是配置undertow作为服务器的参数
  4.   undertow:
  5.   # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
  6.   io-threads: 4
  7.   # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
  8.   worker-threads: 20
  9.   # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
  10.   # 每块buffer的空间大小,越小的空间被利用越充分
  11.   buffer-size: 1024
  12.   # 是否分配的直接内存
  13.   direct-buffers: true

以上具体调优值的取值应以具体情况来定。

https://blog.csdn.net/xiaojin21cen/article/details/78654652

https://www.cnblogs.com/amosli/p/3970810.html.

Zuul提供了Groovy的编译类com.netflix.zuul.groovy.GroovyCompiler,结合com.netflix.zuul.groovy.GroovyFileFilter类,可以使用Groovy来编写自定义的Filter。

在Zuul有没有存在的必要????-------------它可以不用编译(不用打进工程包),可以放在服务器上任意位置,可以再任何时候修改由它编写的Filter,且修改后还不用重启服务器,相当实用!!!(后续博客提供实战代码)

https://blog.csdn.net/xiaofeng10330111/article/details/86772740#%E5%9B%9B%E3%80%81%E6%9C%8D%E5%8A%A1%E9%99%90%E6%B5%81.

https://blog.csdn.net/wo18237095579/article/details/83543592.

【4】http://www.fmi.com.cn/index.php?m=content&c=index&a=show&catid=9&id=618616.

【5】http://www.itmuch.com/spring-cloud/zuul/zuul-ha/.

【6】https://blog.csdn.net/rickiyeat/article/details/78906366.

【7】https://blog.csdn.net/weixin_38187317/article/details/81532560?utm_source=blogxgwz2.

【8】https://www.cnblogs.com/interfacehwx/p/9920816.html.

【9】https://blog.csdn.net/forezp/article/details/76211680.

【10】https://blog.csdn.net/songhaifengshuaige/article/details/74188106.

【11】https://yq.aliyun.com/articles/637871.

【12】https://www.jianshu.com/p/e8dec95c4326.

【13】https://www.cnblogs.com/amosli/p/3970810.html.

【14】https://blog.csdn.net/chrise_/article/details/78915229.

【15】https://www.cnblogs.com/flashsun/p/7424071.html.

【16】https://www.cnblogs.com/gavincoder/p/8999954.html.

【17】https://www.cnblogs.com/cjsblog/p/9277677.html.

【18】http://blog.sina.com.cn/s/blog_941cfba00102xvlh.html.

【19】https://blog.csdn.net/qq_26440803/article/details/82917766.

微服务架构-实现技术之具体实现工具与框架7:Spring Cloud Zuul原理与注意事项

微服务架构-实现技术之具体实现工具与框架7:Spring Cloud Zuul原理与注意事项

微服务架构-实现技术之具体实现工具与框架7:Spring Cloud Zuul原理与注意事项