詳解Spring Cloud Zuul網(wǎng)關修改為短連接方法
一、問題分析
之前在用zuul網(wǎng)關的時候,請求幾次然后連接就斷開了。原因是因為http1.1之后,默認走的都是connection=keep-alive 長連接。但沒有心跳維持,顧1分鐘斷開一次。但RestFul一般都是走短連接就行了。因此想著只要修改頭部connection屬性就行了.
就是在過濾器中修改Zuul的RequestContext ctx對象
//設置請求為短連接 ctx.addZuulRequestHeader("connection", "close");
再次請求之后發(fā)現(xiàn)
?納尼,怎么還是長連接。那么說明可能是我的設置沒有生效或者被覆蓋掉了。遇到問題,除了度娘,跟著源碼走一遭也是最好的方式。花了大半天時間,終于讓我找到原因了。
原因是代理類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 && ((Collection<?>) object).contains(name)) { return false; } } 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自己的一個機制把。
二、解決方式
那么問題找到了,該怎么修改呢?那么只能自定義路由了。繼承并重寫這個類。
1、實現(xiàn)自定義路由配置CustomZuulConfig
@Component public class CustomZuulConfig { @Autowired ZuulProperties zuulProperties; @Value("${servletPath}") private String servletPath; @Bean public CustomRouteLocator routeLocator() { CustomRouteLocator routeLocator = new CustomRouteLocator(servletPath, this.zuulProperties); return routeLocator; } }
2、實現(xiàn)自定義請求代理工具類 重寫isIncludedHeader方法。
public class CustomRequestHelper extends ProxyRequestHelper { @Override 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 && ((Collection<?>)object).contains(name)) { return false; } } switch (name) { case "content-length": case "host": case "server": case "transfer-encoding": case "x-application-context": return false; default: return true; } } }
3、重寫實現(xiàn)代理配置類
@Configuration @EnableZuulProxy public class CustomZuulProxyConfig extends ZuulProxyAutoConfiguration { @Bean @Override public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper, ZuulProperties zuulProperties, ApacheHttpClientConnectionManagerFactory connectionManagerFactory, ApacheHttpClientFactory httpClientFactory) { CustomRequestHelper customRequestHelper = new CustomRequestHelper(); return new SimpleHostRoutingFilter(customRequestHelper, zuulProperties, connectionManagerFactory, httpClientFactory); } }
然后重新啟動,查看請求頭。
?修改成功。所以說,學會通過看源碼查問題,還是很重要的哈~
到此這篇關于詳解Spring Cloud Zuul網(wǎng)關修改為短連接方法的文章就介紹到這了,更多相關Spring Cloud Zuul短連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringCloud之Zuul網(wǎng)關原理及其配置講解
- SpringCloud網(wǎng)關(Zuul)如何給多個微服務之間傳遞共享參數(shù)
- 關于服務網(wǎng)關Spring Cloud Zuul(Finchley版本)
- 解決spring cloud zuul與nginx的域名轉發(fā)問題
- SpringCloud Zuul實現(xiàn)負載均衡和熔斷機制方式
- SpringCloud如何實現(xiàn)Zuul集群(負載均衡)
- spring cloud zuul 與 sentinel的結合使用操作
- SpringCloud zuul 網(wǎng)關如何解決跨域問題
- Spring?Cloud詳細講解zuul集成Eureka流程
相關文章
mybatis.type-aliases-package的作用及用法說明
這篇文章主要介紹了mybatis.type-aliases-package的作用及用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01java實現(xiàn)HmacSHA256算法進行加密方式
這篇文章主要介紹了java實現(xiàn)HmacSHA256算法進行加密方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08