文章目录
Netty介绍
Netty 是什么?
- Netty官网
- Netty 是由由 JBOSS 提供的一个 Java 开源框架 NIO 框架,Netty 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
- Netty 通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。
- Netty 的健壮性、功能、性能、可定制性和可扩展性在同类框架都是首屈一指的。它已经得到成百上千的商业/商用项目验证,如 Hadoop 的RPC框架 Avro、RocketMQ 以及主流的分布式通信框架 Dubbo 等等。
- Netty 架构:
为什么选择 Netty ?
- 功能强大
基于事件驱动,预制多种编码功能,支持多种主流协议,如HTTP、WebSocket等,支持SSL和HTTPS。
- 高性能,传输快
更好的吞吐量,低延迟,减少不必要的内存拷贝,与其他主流NIO框架,Netty综合性能最优。
- 开发简单,定制能力强
API使用简单,简化开发难度。通过对ChannelHandler的扩展,可以自定义各类业务拦截器。
- 成熟稳定
社区活跃,经历大规模的商业应用考验,在互联网、大数据、网络游戏以及物联网行业得到成功商业。
Netty 有哪些特性?
- 异步非阻塞通信
IO多路复用技术通过把多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。
- 内存零拷贝
接收和发送数据采用DirectBuffer,使用堆外直接内存读写。
- 内存池
基于内存池的缓冲区重用机制,尽量重用缓冲区,减少内存的分配和回收。
- Reactor多线程模型
通过Reactor的主从线程模型,通过多个NIO线程处理多个链路,防止线程阻塞和消息积压。
应用实践
搭建 Netty 服务需要思考的问题
- 如何快速响应,满足大量客户端同时在线?
- 如何保证用户身份甄别,身份校验?
- 如何保证服务器的稳定?
- 如何对客户端回传消息?
- 如何监控客户端状态?
Netty 服务注意事项
- 减少Netty响应时间
Netty服务只处理数据解析检验和分发,不在Netty的连接线程处理耗时任务。
- 横向部署Netty集群
通过搭建Netty集群,做好合理的负载均衡,扩展Netty的连接承载量,并提高服务器的容量和稳定性。
- 减少网络带宽消耗
选择合适的编解码方案,适时采用压缩等技术,减少网络带宽消耗。
- 任务异步处理
业务具体事件由任务线程或者异步消息进行异步处理,业务处理完成后再由Netty返回客户端。
- 安全策略
做好安全防范,通过加密和签名验证消息合法性,确保消息传递的安全性。
Netty 集群部署需要面临的问题
- 客户端连接哪台服务器?
- 怎么快速添加服务器或者下线服务器?
- 大量客户端递交的任务怎么保证有效处理?
- 如何快速定位客户端,并回应消息?
- 客户端的状态如何维护?
Netty 集群部署实践
服务注册
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。
利用 Zookeeper 的临时节点特性+监视器(Watch)来实现分布式集群监控
Netty 服务器上线后,创建 Zookeeper 的临时节点,下线后临时节点或自动删除。负载均衡服务器通过订阅 Zookeeper 的节点变动事件,更改可用服务器列表
登录认证和Netty服务器负载均衡
客户端的登录验证通过 Web 服务器处理。
Web服务器采用 Nginx 和 Tomcat 集群的方式,保证连接的高容量。可用做为业务系统的一个子模块部署到业务系统中去。
在经过安全验证后,业务系统返回给客户端一个换取登录权限的 token
登录是通过负载均衡算法将空闲服务器连接信息返回客户端,由客户端连接相应的服务器实现负载均衡和安全校验。
异步任务
会话管理
客户端Session及在线信息集中管理,存放于Redis数据库。
通讯安全
登录HTTPS/SSL通讯
消息加密,双向签名验证
大数据压缩和分包发送
总体架构
注意事项
- 连接超时:移动网络连接不稳定,在客户端闪断后服务器不一定收到断开事件,需要及时关闭会话超时的连接,并防止跨服务器重复登录。
- 缓冲区容量:根据日常报文大小,设置缓冲区,尽量使缓冲区容量处于平均报文长度附近。
- 心跳检测:根据业务特点,设置合理的心跳时间,避免频繁的客户端重连。
- 共享内存池:使用Netty的共享内存池,可以避免频繁的GC,要注意进行内存泄漏监控。
- 日志级别:在高并发情况下,日志记录量是惊人的,根据业务情况调整日志记录的级别, 并可根据需要采用kafka做分布式日志记录。
- 系统调优:优化服务器的内核参数。
行业应用
Dubbo 阿里巴巴开源服务框架
Dubbo是阿里巴巴开源的分布式服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能。
Dubbo内部私有协议通讯使用 Netty 作为高性能异步通讯框架,为分布式服务接待直接提供高性能的NIO客户端和服务器通信。
Dubbo不仅仅在阿里巴巴使用,在国内各行业中也得到广泛应用。
从2017年开始,Dubbo又重新得到阿里巴巴官方维护。
Apache Avro
Apache Avro 是 Hadoop 的子系统之一,是 Apache 的顶级项目,是一个数据序列号框架,被设计用于大批量数据交换的应用。
Avro 的 RPC 框架基于 Netty 的 nettyServer 和 HttpServer 两种方式实现。
应用行业
Netty具有高并发和高性能的特点,资源消耗少,单台服务器即可实现上万级别的TCP长连接。同时安全性和扩展性都非常好,非常方便与第三方系统进行集成。在需要处理海量用户连接的领域都得到了广泛的应用,比如游戏、物联网、IM通讯等行业。