java_微服务10SpringCloud常见问题之Zuul

zuul服务网关

Zuul与Nginx的性能对比

Netflix Zuul与Nginx的性能对比:https://blog.didispace.com/zuul-vs-nginx-performance/
Zuul的原始性能非常接近于Nginx。事实上,在启动预热之后,测试结果甚至略好一些(重申免责声明-这并非一个严肃的基准性能测试)。Nginx显示出更多的可预测性能(变化较小),可悲的是在Zuul预热期间,我们经历了一些小故障(150000个请求中的2个,但是您的微服务应该是容错机制的,对吧?)。
所以,如果您考虑使用一些Zuul的额外功能,或者希望通过它与其他Netflix服务集成(比如Eureka)获得更多的服务能力,Zuul看起来非常有希望作为简单反向代理的替代产品。也许这也是Netflix使用的原因,所以您也可以尝试一下。

Zuul处理Cookie和重定向

会话保持问题
所以解决该问题的思路也很简单,我们只需要通过设置sensitiveHeaders即可,设置方法分为两种:
全局设置:

1
zuul.sensitive-headers=

指定路由设置:

1
2
zuul.routes.<routeName>.sensitive-headers=
zuul.routes.<routeName>.custom-sensitive-headers=true

重定向问题
在使用Spring Cloud Zuul对接Web网站的时候,处理完了会话控制问题之后。往往我们还会碰到如下图所示的问题,我们在浏览器中通过Zuul发起了登录请求,该请求会被路由到某WebSite服务,该服务在完成了登录处理之后,会进行重定向到某个主页或欢迎页面。此时,仔细的开发者会发现,在登录完成之后,我们浏览器中URL的HOST部分发生的改变,该地址变成了具体WebSite服务的地址了。这就是在这一节,我们将分析和解决的重定向问题
出现该问题的根源是Spring Cloud Zuul没有正确的处理HTTP请求头信息中的Host导致。在Brixton版本中,Spring Cloud Zuul的PreDecorationFilter过滤器实现时完全没有考虑这一问题,它更多的定位于REST API的网关。所以如果要在Brixton版本中增加这一特性就相对较为复杂,不过好在Camden版本之后,Spring Cloud Netflix 1.2.x版本的Zuul增强了该功能,我们只需要通过配置属性zuul.add-host-header=true就能让原本有问题的重定向操作得到正确的处理。关于更多Host头信息的处理,读者可以参考本文之前的分析思路,可以通过查看PreDecorationFilter过滤器的源码来详细更多实现细节。

Zuul之饥饿加载模式

参考:https://blog.csdn.net/qq_24313635/article/details/103923708

1
zuul.ribbon.eager-load.enabled=true

但是,可能你尝试一下之后会发现,并没有起效?为什么呢?这是由于Spring Cloud Zuul中实现eager-load的时候同Ribbon中一样,都需要指定具体哪些服务需要饥饿加载。那么在Spring Cloud Zuul中如何具体指定呢?
在Spring Cloud Zuul的饥饿加载中没有设计专门的参数来配置,而是直接采用了读取路由配置来进行饥饿加载的做法。所以,如果我们使用默认路由,而没有通过配置的方式指定具体路由规则,那么zuul.ribbon.eager-load.enabled=true的配置就没有什么作用了。
因此,在真正使用的时候,我们可以通过zuul.ignored-services=*来忽略所有的默认路由,让所有路由配置均维护在配置文件中,以达到网关启动的时候就默认初始化好各个路由转发的负载均衡对象。此处没有配制出所有的路由,只配置了一个feign路由做测试:

1
2
3
4
5
zuul.ribbon.eager-load.enabled=true
zuul.ignored-services=*

zuul.routes.api-feign.path=/feign/**
zuul.routes.api-feign.service-id=feign

1
2
ribbon.eager-load.enabled=true
ribbon.eager-load.clients=hello-service, user-service

sensitiveHeaders和ignoredHeaders

sensitiveHeaders:会过滤客户端请求中的和该配置项匹配的headers
比如:

1
2
zuul:    
sensitiveHeaders: X-ABC

如果客户端在发请求是带了X-ABC,那么X-ABC不会传递给下游服务

ignoredHeaders:会过滤服务之间通信附带的headers
比如:

1
2
zuul:  
ignoredHeaders: X-ABC

如果客户端在发请求是带了X-ABC,那么X-ABC依然会传递给下游服务。但是如果下游服务再转发就会被过滤

还有一种情况就是客户端带了X-ABC,在ZUUL的Filter中又addZuulRequestHeader(“X-ABC”, “new”),
那么客户端的X-ABC将会被覆盖,此时不需要sensitiveHeaders。如果设置了sensitiveHeaders: X-ABC,那么Filter中设置的X-ABC依然不会被过滤。

参考

Spring cloud系列之Zuul配置项中sensitiveHeaders和ignoredHeaders:https://blog.csdn.net/xll_csdn/article/details/85992522

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×