微服务架构-实现技术之具体实现工具与框架7:Spring Cloud Zuul原理与注意事项
微服务架构-实现技术之具体实现工具与框架7:Spring Cloud Zuul原理与注意事项
https://github.com/Netflix/zuul/wiki)
-
Zuul is the front door for all requests from devices and web sites to the backend of
-
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.
比如要禁用 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)
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-tomcatartifactId>
- exclusion>
- exclusions>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-undertowartifactId>
- dependency>
Undertow主要参数配置说明如下:
- server:
- port: 8081
- # 下面是配置undertow作为服务器的参数
- undertow:
- # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
- io-threads: 4
- # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
- worker-threads: 20
- # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
- # 每块buffer的空间大小,越小的空间被利用越充分
- buffer-size: 1024
- # 是否分配的直接内存
- 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.