广告
返回顶部
首页 > 资讯 > 精选 >如何解决springcloud gateway连接保活问题
  • 417
分享到

如何解决springcloud gateway连接保活问题

2023-06-20 15:06:37 417人浏览 安东尼
摘要

这篇文章主要介绍“如何解决SpringCloud gateway连接保活问题”,在日常操作中,相信很多人在如何解决springcloud gateway连接保活问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答

这篇文章主要介绍“如何解决SpringCloud gateway连接保活问题”,在日常操作中,相信很多人在如何解决springcloud gateway连接保活问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决sprinGCloud gateway连接保活问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

项目中使用了springcloud gateway作为网关,上游与负载均衡服务器连接。

近期通过监控系统观察,发现网关与上游负载均衡服务器保持的tcp连接有300+,初步怀疑是调用方未释放连接

用如下方法进行分析:

1)周期性采集当前建立的连接及端口数据

首先是每隔10分钟连续采集2两个小时,发现在两个小时之内新出现的端口不到12个,再逐步缩短采样周期,到最后每秒采集一次,分析发现每秒种建立一个连接,同时关闭一个连接,当仍存在300+连接,这些连接对应的端口称为不活跃端口,记录下这300+不活跃端口。

2)为了进一步分析,用whireshark抓包

发现绝大部分情况下都是正常的连接和关闭,但这300+个不活跃端口对应的连接上没有任何数据,这300+个不活跃对应的连接称为不活跃连接。同步赶紧上马接口调用实时监控功能,发现实际的调用数量却非常少(每分钟不足10个)。

3)与上游的负载均衡工程师一起检查

从负载均衡服务器看到的活跃连接也是个位数,并且并未找到在网关上的不活跃端口。也就是说在负载均衡服务器已经已经拆除了与网关上的不活跃连接对应的连接。咨询负载均衡工程师,负载均衡设备对于1超过1个小时的不活跃连接会主动拆除。

经过以上分析,确定是外部系统经过负载均衡设备与网关建立连接后,并未进行任何操作,但网关会一直维护这个连接,导致网关的连接数持续上升。

为解决这个问题,需要首先回顾一下传统的TCP长连接维护机制

针对长连接的维护,传统的TCP服务采用心跳来维持,比如服务端每分钟发送一个心跳报文,并启动计数器并设置为1,客户端收到后回应一个报文,服务端收到回复报文后重置计数器,如果为收到应答,则一分钟再发送一个心跳报文,同时计数器加1,连续发送三个心跳报文并且未收到映带,则服务端则认为客户端已经失联,会主动拆除这个连接,以避免不必要的资源占用。

我们现在使用的springcloud gateway,显然很难直接修改源码增加以上的心跳机制,所以我又想到了操作系统协议栈的连接保活机制。

TCP协议栈的保活机制与应用层的长连接维护机制类似(当然,应用层的TCP长连接维护机制就是从协议栈的保护机制学习来的'&'),只不过是在协议栈层面完成,这样避免了应用层实现负载的长连接维护

保活机制如下:

1)服务器端判断一个连接在指定的时间内

(缺省为2小时)没有任何数据,则发送一个探测报文,并启动定时器

2)如果客户端在正常运行并且网络可达

则客户端则回复一个响应报文,服务端认为客户端正常,则重新开始计时。

如果客户端主机崩溃或网络不可达,服务端将收不到应答,定时器超时后(一般为75秒),服务端将再次发送探测报文,如此连续发送若干次(一般为10次),如果均未收到应答,则服务端将主动关闭连接。

当然,如果中间有任何一次服务端收到应答,则认为连接正常,不再发送探测报文。

使用如下命令可以查看以上保活时间、发送探测报文的间隔和次数:

#sysctl -a|grep keepalivenet.ipv4.tcp_keepalive_time = 7200(单位为秒)net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_intvl = 75  (单位为秒)

关于保活参数中两个小时的时间设置存在争议,通常人们希望这个值可以小很多,比如分钟级,但保活间隔时间是系统级别的变量,如果改变该值会影响所有使用该功能的用户。

所以,Host Requirements RFC提出一个实现方式,保活间隔是可配置的,但缺省不小于两个小时,并且需要应用程序设置才启用。

如果使用协议栈的保活功能,那么缺省的两个小时的时间还是太长,如果缩短这个时间会有什么影响,并无把握。

所以还是先想其他办法,从网上看到可以通过以下代码修改网关对长连接的维护办法,以下代码是设置保活时间为3分钟,如果3分钟内连接上没有数据,网关将主动关闭连接:

配置文件:

server:    Netty:        idie-timeout: 300@Configurationpublic class NettyConfig {    @Bean    publiWEBServerFactoryCustomizer<NettyReactiveWebServerFactory> idleTimeoutCustomizer(        @Value("${server.netty.idle-timeout}") Duration idleTimeout) {        return factory -> factory.addServerCustomizers(            server -> server.tcpConfiguration(                tcp->tcp.bootstrap(                   bootstrap->bootstrap.childHandler(new ChannelInitializer<Channel>() {                       @Override                       protected void initChannel(Channel channel) {                           channel.pipeline().addLast(                               new IdleStateHandler(0, 0, idleTimeout.toNanos(), NANOSECONDS) {                                   private final AtomicBoolean closed = new AtomicBoolean();                                   @Override                                   protected void channelIdle(                                       ChannelHandlerContext ctx, IdleStateEvent evt) {                                           if (closed.compareAndSet(false, true)) {                                               ctx.close();                                           }                                       }                                   }                               );                           }                       }))));    }}

系统上线后,通过监控系统发现网关连接数并未持续增长,刚松一口气,线上业务系统频频报错,请求网关失败,赶紧安排网络抓包,然后马上回退恢复业务。

然后对网络抓包进行分析,截图如下:

如何解决springcloud gateway连接保活问题

从抓包结果来看,客户端和网关经过3次握手后,建立了连接,但后面的建立SSL的过程中,网关返回了400 Bad Request,所以导致业务系统请求失败(业务系统使用https请求网关),怀疑是上面的代码中的配置覆盖了配置文件中SSL的相关配置,所以导致SSL连接未建立。

我们优秀的工程师,本着锲而不舍的精神对gateway进行源码分析,经过对代码的分析,发现确实是这个配置覆盖了原有的SSL配置,导致SSL配置未生效所致,所以对以上代码进行改写,具体如下:

@Configurationpublic class NettyConfig {    @Bean    publiWebServerFactoryCustomizer<NettyReactiveWebServerFactory> idleTimeoutCustomizer(        @Value("${server.netty.idle-timeout}") Duration idleTimeout) {        return factory -> factory.addServerCustomizers(            server -> server.tcpConfiguration(                tcp->tcp.bootstrap(bootstrap->{                  //增加如下代码,从而可保持原有配置并追加保活                   BootstrapHandlers.updateConfiguration(bootstrap, "IdleStateHandler",                      (connectionObserver, channel) ->{                       channel.pipeline().addLast(new IdleStateHandler(0, 0,                           idleTimeout.toNanos(), NANOSECONDS) {                                 private final AtomicBoolean closed = new AtomicBoolean();                                 @Override                                 protected void channelIdle(ChannelHandlerContext ctx,                                     IdleStateEvent evt) {                                     if (closed.compareAndSet(false, true)) {                                         ctx.close();                                     }                                 }                             });                         });                        return bootstrap;                    }                )));    }}

进行测试验证,一切OK!

到此,关于“如何解决springcloud gateway连接保活问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何解决springcloud gateway连接保活问题

本文链接: https://www.lsjlt.com/news/298182.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决springcloud gateway连接保活问题
    这篇文章主要介绍“如何解决springcloud gateway连接保活问题”,在日常操作中,相信很多人在如何解决springcloud gateway连接保活问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-20
  • 浅谈springcloud gateway 连接保活问题
    项目中使用了springcloud gateway作为网关,上游与负载均衡服务器连接。 近期通过监控系统观察,发现网关与上游负载均衡服务器保持的TCP连接有300+,初步怀疑是调用方...
    99+
    2022-11-12
  • 如何解决springcloud-gateway限流遇到的问题
    本篇内容主要讲解“如何解决springcloud-gateway限流遇到的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决springcloud-gateway限流遇到的问题”吧!场景...
    99+
    2023-06-20
  • 如何解决ssh连接问题
    如何解决ssh连接问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。由于之前引进一个新的平台操作系统后,发现ssh连接,一直在卡界面上,用ssh -v 去连接,才知道是SS...
    99+
    2023-06-05
  • 如何解决SSH连接调试问题
    这篇文章主要介绍了如何解决SSH连接调试问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SSH是专为远程登录会话和其他网络服务提供的安全性协议。利用SSH协议可以有效的防止...
    99+
    2023-06-27
  • linux拒绝连接问题如何解决
    要解决Linux拒绝连接问题,您可以尝试以下几种方法:1. 检查网络连接:确保您的网络连接正常。可以通过ping命令来测试网络连接是...
    99+
    2023-10-20
    linux
  • jdbc连接失效问题如何解决
    要解决JDBC连接失效问题,可以尝试以下几个方法: 检查数据库服务器是否正常运行:确保数据库服务器正常运行并且可以接收连接。可以...
    99+
    2023-10-24
    jdbc
  • SpringCloud启动失败问题如何解决
    本篇内容主要讲解“SpringCloud启动失败问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringCloud启动失败问题如何解决”吧!SpringCloud启动失败问题Nac...
    99+
    2023-07-05
  • 如何解决php 连接oracle乱码问题
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑如何解决php 连接oracle乱码问题?PHP 连接Oracle及乱码问题笔记1. PHP连接Oracle步骤1. 提取Oracle Instant Client核心D...
    99+
    2016-10-23
    php oracle
  • php连接mysql乱码问题如何解决
    今天小编给大家分享一下php连接mysql乱码问题如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、乱码形成原因当使...
    99+
    2023-07-05
  • Spring Cloud Gateway内存溢出问题如何解决
    本篇内容主要讲解“Spring Cloud Gateway内存溢出问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud Gateway内存溢出问题如何解决”吧!记 ...
    99+
    2023-06-20
  • SpringCloud zuul 网关如何解决跨域问题
    跨域 在SpringCloud中 zuul 和springboot 要同时配置才能实现网关处理跨域 解决Access to XMLHttpRequest at ‘http://19...
    99+
    2022-11-12
  • 如何解决gateway与spring-boot-starter-web冲突问题
    本篇内容介绍了“如何解决gateway与spring-boot-starter-web冲突问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2023-06-20
  • 如何解决DataGrip连接HiveServer2报错的问题
    这篇文章主要介绍如何解决DataGrip连接HiveServer2报错的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!DataGrip 连接 HiveServer2 报错一、He...
    99+
    2022-10-18
  • 如何解决navicat连接mysql失败的问题
    这篇文章给大家分享的是有关如何解决navicat连接mysql失败的问题的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。Navicat连接mysql数据库时,不断报1405错误,下...
    99+
    2022-10-18
  • 如何解决phpMyAdmin无法连接MySQL的问题
    这篇文章主要介绍如何解决phpMyAdmin无法连接MySQL的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!phpMyAdmin无法连接MySQL怎么办解决方案:1、首先我们进...
    99+
    2022-10-18
  • 如何解决SQLServer2008数据引擎连接问题
    这篇文章将为大家详细讲解有关如何解决SQLServer2008数据引擎连接问题,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。当 SQL Server 数据库...
    99+
    2022-10-19
  • win7网络连接设置问题如何解决
    这篇“win7网络连接设置问题如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win7网络连接设置问题如何解决”文章吧...
    99+
    2023-07-01
  • 如何解决php连接mssql失败的问题
    这篇文章将为大家详细讲解有关如何解决php连接mssql失败的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php连接mssql失败的解决办法:1、在php.ini文件中找到extension=php...
    99+
    2023-06-22
  • 如何解决php7.2无法连接mysql8.0的问题
    这篇文章主要介绍如何解决php7.2无法连接mysql8.0的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php7.2无法连接mysql8.0的解决办法:1、找到并打开my.cnf文件;2、在my.cnf的my...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作