詳解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短連接內容請搜索腳本之家以前的文章或繼續(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流程
相關文章
java 中createStatement()方法的實例詳解
這篇文章主要介紹了java 中createStatement()方法的實例詳解的相關資料,需要的朋友可以參考下2017-06-06
Spring Boot使用AOP實現(xiàn)REST接口簡易靈活的安全認證的方法
這篇文章主要介紹了Spring Boot使用AOP實現(xiàn)REST接口簡易靈活的安全認證的方法,非常具有實用價值,需要的朋友可以參考下2018-11-11

