详解Spring Cloud Zuul网关修改为短连接方法

 更新时间:2022年04月17日 11:15:30   作者:王老狮  
本文主要介绍了详解Spring Cloud Zuul网关修改为短连接方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、问题分析

之前在用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 && ((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、实现自定义路由配置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、实现自定义请求代理工具类 重写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、重写实现代理配置类

@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网关修改为短连接方法的文章就介绍到这了,更多相关Spring Cloud Zuul短连接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • centos下编译安装mysql报错解决方案

    centos下编译安装mysql报错解决方案

    今天在centos6.2下面源码编译安装mysql的时,在编译mysql的时候报了一个蛋蛋的错误,本文提供详细解决方案
    2012-11-11
  • java 中createStatement()方法的实例详解

    java 中createStatement()方法的实例详解

    这篇文章主要介绍了java 中createStatement()方法的实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • Spring Boot使用AOP实现REST接口简易灵活的安全认证的方法

    Spring Boot使用AOP实现REST接口简易灵活的安全认证的方法

    这篇文章主要介绍了Spring Boot使用AOP实现REST接口简易灵活的安全认证的方法,非常具有实用价值,需要的朋友可以参考下
    2018-11-11
  • @PathVariable 如何自动填充入实例对象中

    @PathVariable 如何自动填充入实例对象中

    这篇文章主要介绍了@PathVariable 实现自动填充入实例对象中的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java实现在Word指定位置插入分页符

    Java实现在Word指定位置插入分页符

    在Word插入分页符可以在指定段落后插入,也可以在特定文本位置处插入。本文将以Java代码来操作以上两种文档分页需求,需要的可以参考一下
    2022-04-04
  • Struts2 漏洞分析及如何提前预防

    Struts2 漏洞分析及如何提前预防

    2016年4月26日,Struts2发布一份安全公告,CVE编号 CVE-2016-3081。这是自2012年Struts2命令执行漏洞大规模爆发之后,该服务时隔四年再次爆发大规模漏洞。该漏洞也是今年目前爆出的最严重安全漏洞。本文分析了漏洞的原理危害影响防护等内容。
    2016-05-05
  • OpenTelemetry Java SDK 高级用法解析

    OpenTelemetry Java SDK 高级用法解析

    这篇文章主要介绍了OpenTelemetry Java SDK 的高级用法示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java读取寄存器数据的方法示例详解

    Java读取寄存器数据的方法示例详解

    在Java中读取硬件寄存器数据不直接支持,但可以通过JNI或JNA技术实现,此过程需要编写本地代码(如C/C++)以模拟硬件交互,然后在Java中调用这些方法,注意,JNI使用可能引入复杂性和性能开销,且需考虑跨平台兼容性,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Spring Cloud入门系列服务提供者总结

    Spring Cloud入门系列服务提供者总结

    这篇文章主要介绍了Spring Cloud入门系列之服务提供者总结,服务提供者使用Eureka Client组件创建 ,创建完成以后修改某文件,具体操作方法及实例代码跟随小编一起看看吧
    2021-06-06
  • MyBatis Mapper.xml中的命名空间及命名方式

    MyBatis Mapper.xml中的命名空间及命名方式

    这篇文章主要介绍了MyBatis Mapper.xml中的命名空间及命名方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论