netty 心跳包和断线重连机制

netty 心跳包和断线重连机制,第1张

心跳包主要是用来做TCP长连接保活的。有时 socket 虽然是连接的但中间网络可能有问题,这时你还在不停的往外发送数据,但对方是收不到的,你不知道对方是不是还活着,不知道 socket 通道是不是还是联通的。 心跳包就是你发送一些试探包给对方,对方回应,如果一定时间内比如30秒内没有收到任何数据,说明对方或网络可能有问题了。这时你主动断开 socket 连接,避免浪费资源。

TCP keepAlive 也是在一定时间内(默认2小时)socket 上没有接收到数据时主动断开连接,避免浪费资源,这时远端很可能已经down机了或中间网络有问题。也是通过发送一系列试探包看有没有回应来实现的。

TCP keepAlive 依赖操作系统,默认是关闭的,需要修改操作系统配置打开。

所以在应用层实现心跳包还是必须的。

这个是显而易见的,正常通信时说明两端连接是没有问题的,所以只在空闲的时候发送心跳包。如果每隔固定时间发送就会浪费资源占用正常通信的资源。

假设现在要做一个手机端推送的项目,所有手机通过 TCP 长连接连接到后台服务器。心跳机制是这样的:

看其他博客说不要回复,如果有 10万空闲连接,光回复心跳包就要占用大量资源。服务端读超时后直接关闭连接,客户端再进行重连。

断线重连也很简单就是在 channelInactive 的时候重新 connect 就行了。参考其他博客专门用一个 ChannelInboundHandler 来处理断线重连。

这个 watchDog Handler 应当放在 ChannelPipeline 的最前面

其实客户端和服务端都是相对的,这个看应用场景。如果客户端想要及时处理断网,路由故障等情况就需要接受服务端发来的心跳来检测。像断网,路由故障这种情况,两边都不知道TCP连接的状态,必须靠心跳。长连接服务端一般都要接收心跳包的,如果没有心跳可能会有大量的无效连接,直接耗尽服务器资源,无效的连接要尽早关闭掉。

DEMO:

https://github.com/lesliebeijing/Netty-Demo

基于 Netty 写的一个简单的推送 DEMO,可用在手机端推送

https://github.com/lesliebeijing/EncPush

Netty 客户端用在 Android 中也很稳定,我们的物联网项目Android和后台都是用的 Netty。

随着互联网的快速发展,当前以步入移动互联、物联网时代。用户访问系统入口也变得多种方式,由原来单一的PC客户端,变化到PC客户端、各种浏览器、手机移动端及智能终端等。同时系统之间大部分都不是单独运行,经常会涉及与其他系统对接、共享数据的需求。所以系统需要升级框架满足日新月异需求变化,支持业务发展,并将框架升级为微服务架构。“API网关”核心组件是架构用于满足此些需求

很多互联网平台已基于网关的设计思路,构建自身平台的API网关,国内主要有京东、携程、唯品会等,国外主要有Netflix、Amazon等。

业界为了满足这些需求,已有相关的网关框架。

1、基于nginx平台实现的网关有:kong、umbrella等

2、自研发的网关有:zuul1、zuul2等

但是以上网关框架只能是满足部分需求,不能满足企业的所有要求,就我而言,我认为最大的问题是没有协议转换及OPS管理控制平台

另外:对于微服务架构下,如果基于HTTP REST传输协议,API网关还承担了一个内外API甄别的功能,只有在API网关上注册了的API还能是真正的堆外API

整个网关系统由三个子系统组成:

说明:

1) 整个网关基于Netty NIO来实现同步非阻塞是HTTP服务,网关是外部API请求的HTTP服务端,同时是内部服务的客户端,所以有Netty Server Handler和Netty Client Handler的出现;

2)对于Netty Server Handler来说,当一个HTTP请求进来时,他会把当前连接转化为ClientToProxyConnection,它是线程安全的,伴随当前此HTTP请求的生命周期结束,它也负责ClientToProxyConnection的生命周期的维护;

3)对于Netty Client Handler来说,当ClientToProxyConnection需要传递请求到内部服务时,会新建(或者获取原来已建)的ProxyToServerConnection来进行内部的请求,它也是线程安全的;

4)对于Filter来说,他运行在ClientToProxyConnection上,插入请求进来及收到后端请求之间;

从以上分析,网关选择同步非阻塞方式是一个合适的选择

其中转化的过程如下:

2:根据FileDescriptorSet获取gRPC的入参和出参描述符,然后再创建gRPC所需要的MethodDescriptor方法描述对象

2) HTTP ---->dubbo

在dubbo的框架设计中,其中已经包含了泛化调用的设计,所以在这块,基本上就延用了dubbo的泛化调用来实现http转dubbo的协议,而关于dubbo的参数部分,可以指定参数映射规范,利用参数裁剪的技术对http请求参数进行抽取,如果dubbo的接口是java类型,则直接抽取,如果是pojo,按照dubbo的用户文档,把他组成一个Map的数据结构即可,而操作这一步需要映射规则

整个网关目前基本完成并且也开源到GitHub上,欢迎拍砖及使用

tesla


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/416397.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-24
下一篇2023-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存