詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法
一、問(wèn)題分析
之前在用zuul網(wǎng)關(guān)的時(shí)候,請(qǐng)求幾次然后連接就斷開(kāi)了。原因是因?yàn)閔ttp1.1之后,默認(rèn)走的都是connection=keep-alive 長(zhǎng)連接。但沒(méi)有心跳維持,顧1分鐘斷開(kāi)一次。但RestFul一般都是走短連接就行了。因此想著只要修改頭部connection屬性就行了.
就是在過(guò)濾器中修改Zuul的RequestContext ctx對(duì)象
//設(shè)置請(qǐng)求為短連接
ctx.addZuulRequestHeader("connection", "close");再次請(qǐng)求之后發(fā)現(xiàn)

?納尼,怎么還是長(zhǎng)連接。那么說(shuō)明可能是我的設(shè)置沒(méi)有生效或者被覆蓋掉了。遇到問(wèn)題,除了度娘,跟著源碼走一遭也是最好的方式。花了大半天時(shí)間,終于讓我找到原因了。
原因是代理類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"這些頭的話都被跳過(guò)。不會(huì)被設(shè)置成功。應(yīng)該是zuul自己的一個(gè)機(jī)制把。
二、解決方式
那么問(wèn)題找到了,該怎么修改呢?那么只能自定義路由了。繼承并重寫(xiě)這個(gè)類。
1、實(shí)現(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、實(shí)現(xiàn)自定義請(qǐng)求代理工具類 重寫(xiě)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ě)實(shí)現(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);
}
}然后重新啟動(dòng),查看請(qǐng)求頭。

?修改成功。所以說(shuō),學(xué)會(huì)通過(guò)看源碼查問(wèn)題,還是很重要的哈~
到此這篇關(guān)于詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法的文章就介紹到這了,更多相關(guān)Spring Cloud Zuul短連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringCloud之Zuul網(wǎng)關(guān)原理及其配置講解
- SpringCloud網(wǎng)關(guān)(Zuul)如何給多個(gè)微服務(wù)之間傳遞共享參數(shù)
- 關(guān)于服務(wù)網(wǎng)關(guān)Spring Cloud Zuul(Finchley版本)
- 解決spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問(wèn)題
- SpringCloud Zuul實(shí)現(xiàn)負(fù)載均衡和熔斷機(jī)制方式
- SpringCloud如何實(shí)現(xiàn)Zuul集群(負(fù)載均衡)
- spring cloud zuul 與 sentinel的結(jié)合使用操作
- SpringCloud zuul 網(wǎng)關(guān)如何解決跨域問(wèn)題
- Spring?Cloud詳細(xì)講解zuul集成Eureka流程
相關(guān)文章
centos下編譯安裝mysql報(bào)錯(cuò)解決方案
今天在centos6.2下面源碼編譯安裝mysql的時(shí),在編譯mysql的時(shí)候報(bào)了一個(gè)蛋蛋的錯(cuò)誤,本文提供詳細(xì)解決方案2012-11-11
java 中createStatement()方法的實(shí)例詳解
這篇文章主要介紹了java 中createStatement()方法的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06
Spring Boot使用AOP實(shí)現(xiàn)REST接口簡(jiǎn)易靈活的安全認(rèn)證的方法
這篇文章主要介紹了Spring Boot使用AOP實(shí)現(xiàn)REST接口簡(jiǎn)易靈活的安全認(rèn)證的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-11-11
@PathVariable 如何自動(dòng)填充入實(shí)例對(duì)象中
這篇文章主要介紹了@PathVariable 實(shí)現(xiàn)自動(dòng)填充入實(shí)例對(duì)象中的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java實(shí)現(xiàn)在Word指定位置插入分頁(yè)符
在Word插入分頁(yè)符可以在指定段落后插入,也可以在特定文本位置處插入。本文將以Java代碼來(lái)操作以上兩種文檔分頁(yè)需求,需要的可以參考一下2022-04-04
OpenTelemetry?Java?SDK?高級(jí)用法解析
這篇文章主要介紹了OpenTelemetry?Java?SDK?的高級(jí)用法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Spring Cloud入門(mén)系列服務(wù)提供者總結(jié)
這篇文章主要介紹了Spring Cloud入門(mén)系列之服務(wù)提供者總結(jié),服務(wù)提供者使用Eureka Client組件創(chuàng)建 ,創(chuàng)建完成以后修改某文件,具體操作方法及實(shí)例代碼跟隨小編一起看看吧2021-06-06

