如何将Spring Cloud Zuul网关修改为短连接?
推荐学习
- 肝了十天半月 , 献上纯手绘“Spring/Cloud/Boot/MVC”全家桶脑图
- 一箭双雕!Alibaba架构师 , 纯手打Cloud+Boot微服务架构笔记
文章插图
一、问题分析之前在用zuul网关的时候 , 请求几次然后连接就断开了 。 原因是因为http1.1之后 , 默认走的都是connection=keep-alive 长连接 。 但没有心跳维持 , 每1分钟断开一次 。 但RestFul一般都是走短连接就行了 。 因此想着只要修改头部connection属性就行了.
就是在过滤器中修改Zuul的RequestContext ctx对象
//设置请求为短连接ctx.addZuulRequestHeader("connection", "close");
再次请求之后发现文章插图
纳尼 , 怎么还是长连接 。 那么说明可能是我的设置没有生效或者被覆盖掉了 。 遇到问题 , 除了度娘 , 跟着源码走一遭也是最好的方式 。 花了大半天时间 , 终于让我找到原因了 。
原因是代理类ProxyRequestHelper里面有段逻辑 。
public boolean isIncludedHeader(String headerName) {String name = headerName.toLowerCase();RequestContext ctx = RequestContext.getCurrentContext();if (ctx.containsKey(IGNORED_HEADERS)) {Object object = ctx.get(IGNORED_HEADERS);if (object instanceof Collection}}switch (name) {case "host":if(addHostHeader) {return true;}case "connection":case "content-length":case "server":case "transfer-encoding":case "x-application-context":return false;default:return true;} }
如果头部存在"connection": "content-length": "server": "transfer-encoding": "x-application-context"这些头的话都被跳过 。 不会被设置成功 。 应该是zuul自己的一个机制吧 。二、解决方式【如何将Spring Cloud Zuul网关修改为短连接?】那么问题找到了 , 该怎么修改呢?那么只能自定义路由了 。 继承并重写这个类 。
1、实现自定义路由配置CustomZuulConfig
@Componentpublic class CustomZuulConfig {@AutowiredZuulProperties zuulProperties;@Value("${servletPath}")private String servletPath;@Beanpublic CustomRouteLocator routeLocator() {CustomRouteLocator routeLocator = new CustomRouteLocator(servletPath, this.zuulProperties);return routeLocator;} }
2、实现自定义请求代理工具类 重写isIncludedHeader方法 。public class CustomRequestHelper extends ProxyRequestHelper {@Overridepublic boolean isIncludedHeader(String headerName) {String name = headerName.toLowerCase();RequestContext ctx = RequestContext.getCurrentContext();if (ctx.containsKey(IGNORED_HEADERS)) {Object object = ctx.get(IGNORED_HEADERS);if (object instanceof Collection}}switch (name) {case "content-length":case "host":case "server":case "transfer-encoding":case "x-application-context":return false;default:return true;}}}
3、重写实现代理配置类@Configuration@EnableZuulProxypublic class CustomZuulProxyConfig extends ZuulProxyAutoConfiguration {@Bean@Overridepublic SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper, ZuulProperties zuulProperties,ApacheHttpClientConnectionManagerFactory connectionManagerFactory,ApacheHttpClientFactory httpClientFactory) {CustomRequestHelper customRequestHelper = new CustomRequestHelper();return new SimpleHostRoutingFilter(customRequestHelper, zuulProperties, connectionManagerFactory,httpClientFactory);} }
然后重新启动 , 查看请求头 。文章插图
修改成功 。 所以说 , 学会通过看源码查问题 , 还是很重要的哈~
作者:Dark_King_
原文链接:
- 空调|让格力、海尔都担忧,中国取暖“新潮物”强势来袭,空调将成闲置品?
- 采用|消息称一加9系列将推出三款新机,新增一加9E
- 美国|英国媒体惊叹:165个国家采用北斗将GPS替代,连美国也不例外?
- 通气会|12月4~6日,2020中国信息通信大会将在成都举行
- 页面|如何简单、快速制作流程图?上班族的画图技巧get
- 培育|跨境电商人才如何培育,长沙有“谱”了
- 黑莓(BB.US)盘前涨逾32%,将与亚马逊开发智能汽车数据平台|美股异动 | US
- 荣耀V30|麒麟990+40W快充,昔日猛将彻底沦为清仓价?网友:太遗憾
- 抖音小店|抖音进军电商,短视频的商业模式与变现,创业者该如何抓住机遇?
- 网络覆盖|爱立信:2020年底,将有超过10亿人口获得5G网络覆盖