詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法
一、問題分析
之前在用zuul網(wǎng)關(guān)的時候,請求幾次然后連接就斷開了。原因是因為http1.1之后,默認(rèn)走的都是connection=keep-alive 長連接。但沒有心跳維持,顧1分鐘斷開一次。但RestFul一般都是走短連接就行了。因此想著只要修改頭部connection屬性就行了.
就是在過濾器中修改Zuul的RequestContext ctx對象
//設(shè)置請求為短連接 ctx.addZuulRequestHeader("connection", "close");
再次請求之后發(fā)現(xiàn)
?納尼,怎么還是長連接。那么說明可能是我的設(shè)置沒有生效或者被覆蓋掉了。遇到問題,除了度娘,跟著源碼走一遭也是最好的方式?;舜蟀胩鞎r間,終于讓我找到原因了。
原因是代理類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"這些頭的話都被跳過。不會被設(shè)置成功。應(yīng)該是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); } }
然后重新啟動,查看請求頭。
?修改成功。所以說,學(xué)會通過看源碼查問題,還是很重要的哈~
到此這篇關(guān)于詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法的文章就介紹到這了,更多相關(guān)Spring Cloud Zuul短連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringCloud之Zuul網(wǎng)關(guān)原理及其配置講解
- SpringCloud網(wǎng)關(guān)(Zuul)如何給多個微服務(wù)之間傳遞共享參數(shù)
- 關(guān)于服務(wù)網(wǎng)關(guān)Spring Cloud Zuul(Finchley版本)
- 解決spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問題
- SpringCloud Zuul實現(xiàn)負(fù)載均衡和熔斷機制方式
- SpringCloud如何實現(xiàn)Zuul集群(負(fù)載均衡)
- spring cloud zuul 與 sentinel的結(jié)合使用操作
- SpringCloud zuul 網(wǎng)關(guān)如何解決跨域問題
- Spring?Cloud詳細(xì)講解zuul集成Eureka流程
相關(guān)文章
Java List簡介_動力節(jié)點Java學(xué)院整理
Java中可變數(shù)組的原理就是不斷的創(chuàng)建新的數(shù)組,將原數(shù)組加到新的數(shù)組中,下文對Java List用法做了詳解。需要的朋友參考下吧2017-05-05SpringBoot整合Scala構(gòu)建Web服務(wù)的方法
這篇文章主要介紹了SpringBoot整合Scala構(gòu)建Web服務(wù)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Maven本地倉庫的配置以及修改默認(rèn).m2倉庫位置
今天小編就為大家分享一篇關(guān)于Maven本地倉庫的配置以及修改默認(rèn).m2倉庫位置的文章,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10mybatis.type-aliases-package的作用及用法說明
這篇文章主要介紹了mybatis.type-aliases-package的作用及用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01java實現(xiàn)HmacSHA256算法進(jìn)行加密方式
這篇文章主要介紹了java實現(xiàn)HmacSHA256算法進(jìn)行加密方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08