1.前言

最近写了很多关于Netty应用级别的文章,针对为什么选择Netty来实现高并发通讯,Netty实现高并发通讯的原理是什么?今天有时间把我对Netty的一些理解做个简单的说明,如有不对欢迎指正与探讨。

2.Netty工作原理

上图是我对Netty实现高并发通讯工作机制的一个简单理解,当我们的智能终端接入到网关程序后,首先是由一个线程池进行进行绑定操作,我们叫它(parentGroup),绑定之后将后续的事情交给另外一个线程池进行后续的处理,我们叫它(childGroup)

parentGroup 负责处理客户端的TCP连接请求,如果服务端只有一个端口需要监听,建议将其线程数设置为1,相当于Reactor模型中的Acceptor线程池。childGroup 负责I/O的读写操作,通过 ServerBootstrap 的 group 方法进行设置,用于后续产生的 Channel 绑定,相当于Reactor模型中的NIO线程池。可以不设置线程数,默认为当前服务器的处理器核心数*2。

这里会有人疑问,并没有提及Netty如何实现高并发通讯机制,接触过Netty的都清楚,Netty是NIO框架,使用到Selector组件进行实现多路复用,其实通过上图workGroup一个EventLoop管理多个Channel,其实就是采用的Selector来实现的。

另外Netty采用的是零拷贝ByteBuf,可以减少内存复制,从而减少GC,提升效率,并且其相应的read与write操作也是非常好用的。

3.实现代码解析

package com.gateway.xxxx.netty;import com.gateway.xxxx.constants.Constant;
import com.gateway.xxxx.netty.codec.FrameDecoder;
import com.gateway.xxxx.netty.codec.ProtocolDecoder;
import com.gateway.xxxx.netty.codec.ProtocolEncoder;
import com.gateway.xxxx.netty.handler.BusinessHandler;
import com.gateway.xxxx.netty.handler.LoginHandler;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.timeout.IdleStateHandler;
import io.netty.util.concurrent.EventExecutorGroup;
import lombok.extern.slf4j.Slf4j;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;/*** TCP服务类* @author Mr.xxx* @date 20210101*/
@Slf4j
public class TcpServer extends Thread{private int port;private EventLoopGroup bossGroup;private EventLoopGroup workerGroup;private ServerBootstrap serverBootstrap = new ServerBootstrap();//这里引入计数器的意思是如果开启多个TCP服务,可以通过计数器来判断是否所有的tcp服务都已经正常启动private CountDownLatch countDownLatch;public TcpServer(int port, CountDownLatch countDownLatch) {this.port = port;this.countDownLatch = countDownLatch;bossGroup = new NioEventLoopGroup(1);workerGroup = new NioEventLoopGroup();//启动一个EventExecutorGroup来处理比较耗时的业务final EventExecutorGroup executorGroup = new DefaultEventExecutorGroup(Math.max(threadPoolSize, Runtime.getRuntime().availableProcessors() * 2));serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 1024).childOption(ChannelOption.SO_KEEPALIVE, true).childOption(ChannelOption.TCP_NODELAY, true).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new IdleStateHandler(HcIotConstant.READER_IDLE_TIME, 0, 0, TimeUnit.SECONDS));ch.pipeline().addLast(new FrameDecoder());//添加一个接收数据包预处理业务,和统一的指令下发封装业务ch.pipeline().addLast(ProtocolDecoder.INSTANCE, new ProtocolEncoder());//添加一个登录鉴权ch.pipeline().addLast(LoginHandler.INSTANCE);//添加一个业务处理(业务处理比较耗时,这里可以使用EventExecutorGroup来处理比较耗时的业务)ch.pipeline().addLast(executorGroup,BusinessHandler.INSTANCE);}});}@Overridepublic void run() {bind();}/*** 绑定端口启动服务*/private void bind() {serverBootstrap.bind(port).addListener(future -> {if (future.isSuccess()) {log.info("{} TCP服务器启动,端口:{}", protocolType, port);countDownLatch.countDown();} else {log.error("{} TCP服务器启动失败,端口:{}", protocolType, port, future.cause());System.exit(-1);}});}/*** 关闭服务端*/public void shutdown() {workerGroup.shutdownGracefully();bossGroup.shutdownGracefully();log.info("{} TCP服务器关闭,端口:{}", protocolType, port);}
}

Netty 实现高并发通讯原理理解相关推荐

  1. 解秘 Node.js 单线程实现高并发请求原理,以及串联同步执行并发请求的方案

    最近在做一个支持多进程请求的 Node 服务,要支持多并发请求,而且请求要按先后顺序串联同步执行返回结果. 对,这需求就是这么奇琶,业务场景也是那么奇琶. 需求是完成了,为了对 Node.js 高并发 ...

  2. SpringBoot+Netty构建高并发稳健的部标JT808网关

    应很多朋友的要求,今天分享一下如何使用SpringBoot和Netty构建高并发稳健的JT808网关,并且是兼容JT808-2011和JT808-2019的网关,此网关已经有多个客户在商用. JT80 ...

  3. ajax 高并发请求,理解node.js处理高并发请求原理

    很少分享技术文章,写的不好的地方请大家多多指教,本文是自己对于node.js的一些见解,如有纰漏请在评论区交流. 高并发策略 通常高并发的解决方案就是提供多线程模型,服务器为每个客户端请求分配一个线程 ...

  4. “了解高并发底层原理”,面试官:讲一下MESI(缓存一致性协议)吧

    目录 前言: 1.什么是(Who): 2.为何来(How): 2.1缓存不一致带来的后果 2.2解决方法: 3.是什么(What) 3.1数据在缓存中的四种状态: 3.2MESI的六种消息(请求消息和 ...

  5. 大牛深入讲解!高并发你真的理解透彻了吗

    前言 最其实不管什么时候,找工作都跑不了面试.目前很多小编都做了面试手册了,那就是别人家的孩子都有糖了,作为一个自觉的小编,必须搞. 容我先絮叨一下,制作这个面试手册差不多花了3个多星期时间,过程还是 ...

  6. 服务器不知别内存_程序优化浅谈服务器实现高并发的原理

    我们每天刷手机都会接收到各种各样的信息,看到这篇文章时,不知大家有没有思考过,这些信息是如何组织,然后通过服务器发送给我们的呢? 其实也很简单,不就是一条一条请求嘛,服务器根据不同的请求分别去不同的数 ...

  7. 多少并发量算高并发_如何理解:程序、进程、线程、并发、并行、高并发?

    作者:大宽宽 链接:http://tinyurl.com/wx5xxho 在这里你可以了解: 为啥大家说的进程的意思有出入? 为啥并发那么难理解? 为啥高并发不仅仅是"高"+&qu ...

  8. 【多线程高并发】深入理解JMM产生的三大问题【原子性、可见性、有序性】

    [多线程&高并发]深入浅出原子性 https://blog.csdn.net/Kevinnsm/article/details/121681785?spm=1001.2014.3001.550 ...

  9. 多线程导出excel高并发_怎么理解分布式、高并发、多线程

    一.什么是分布式? 分布式更多的是一个概念,是为了解决单个物理服务器容量和性能瓶颈问题而采用的优化手段,该领域需要解决的问题极多,在不同的技术层面上,又包括:分布式文件系统.分布式缓存.分布式数据库. ...

最新文章

  1. C#面向对象三大特性之二:继承
  2. 洛谷P1071 潜伏者 字符串
  3. oracle的server_name,配置Oracle Name Server的完全步骤
  4. SAP-ABAP程序发送邮件
  5. 后台getshell常用技巧总结
  6. JAVAAPI学习之Calendar类;Calendar类set()、add()、roll()方法区别
  7. leetcood学习笔记-58-最后一个单词的长度
  8. python多线程没有java_Java 多线程启动为什么调用 start() 方法而不是 run() 方法?...
  9. 报告PPT(163页):基于Python语言的课程群建设探讨与实践
  10. PAT1018. 锤子剪刀布
  11. 真希望能夠統一一下接口
  12. 《深入浅出MFC》读书笔记
  13. JavaScript,凯撒位移密码,算法
  14. 线性表的链式存储结构(完整代码(C语言)+运行实例)
  15. msl3等级烘烤时间_MSL 湿敏等级对应表
  16. puts与fputs的区别
  17. Java面试题之IO流分为几种?
  18. 选择器的分类及其优先级
  19. rhel6 下iib9.0实现HA
  20. 为什么有的已备案域名的备案会被注销?

热门文章

  1. PaddleOCR #使用PaddleOCR进行光学字符识别(PP-OCR文本检测识别)
  2. 【云原生】K8S--负载均衡详细介绍;什么是K8S的负载均衡?
  3. drf 安装_drf安装与基本使用
  4. 彦舜原创,CSDN首发:面向接口编程思想,设计程序
  5. Unity游戏开发文档(1):飞行模拟
  6. 知识普及:查询手机IMEI码
  7. H5播放器标签video播放mp4格式有声音没有图像解决方法
  8. 威动服务器如何添加文件,超级简单搭建自己的私人影视库
  9. vue实战,前端如何调用手机录音功能
  10. 记录编译Wien2k_18.2的过程