详解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短连接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Java实现二维码的生成和解析

    基于Java实现二维码的生成和解析

    二维码其实就是一种编码技术,只是这种编码技术是用在图片上了,将给定的一些文字,数字转换为一张经过特定编码的图片。本文将利用Java实现二维码的生成和解析,需要的可以参考一下
    2022-08-08
  • Java实现读取文章中重复出现的中文字符串

    Java实现读取文章中重复出现的中文字符串

    本文主要介绍了Java实现读取文章中重复出现的中文字符串的方法。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Spring 多线程事务控制的实践

    Spring 多线程事务控制的实践

    本文主要介绍了Spring 多线程事务控制的实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • Java中的TreeMap底层源码分析

    Java中的TreeMap底层源码分析

    这篇文章主要介绍了Java中的TreeMap底层源码分析,TreeMap与Hashmap、LinkedHashMap不同,他的底层不再是数组,而是一颗红黑树,在插入、删除或者替换元素时,TreeMap能按照事先约定的顺序来对key进行排序和迭代查询,需要的朋友可以参考下
    2023-12-12
  • SpringBoot配置Redis自定义过期时间操作

    SpringBoot配置Redis自定义过期时间操作

    这篇文章主要介绍了SpringBoot配置Redis自定义过期时间操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java统计字符串中指定元素出现次数方法

    java统计字符串中指定元素出现次数方法

    这篇文章主要介绍了java统计字符串中指定元素出现次数方法,需要的朋友可以参考下
    2015-12-12
  • IDEA使用GsonFormat完成JSON和JavaBean之间的转换

    IDEA使用GsonFormat完成JSON和JavaBean之间的转换

    这篇文章主要介绍了IDEA使用GsonFormat完成JSON和JavaBean之间的转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • springboot集成普罗米修斯(Prometheus)的方法

    springboot集成普罗米修斯(Prometheus)的方法

    这篇文章主要介绍了springboot集成普罗米修斯(Prometheus)的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java 加密解密基础分类及模式归纳整理

    Java 加密解密基础分类及模式归纳整理

    这篇文章主要介绍了Java加密解密基础分类方法汇总的相关资料,需要的朋友可以参考下
    2017-04-04
  • Mybatis-plus中IService接口的基本使用步骤

    Mybatis-plus中IService接口的基本使用步骤

    Mybatis-plus是一个Mybatis的增强工具,它提供了很多便捷的方法来简化开发,IService是Mybatis-plus提供的通用service接口,封装了常用的数据库操作方法,包括增删改查等,下面这篇文章主要给大家介绍了关于Mybatis-plus中IService接口的基本使用步骤,需要的朋友可以参考下
    2023-06-06

最新评论