netty 校验_阿里P8架构师教你Netty原理核心组件

  点击上方“JavaEdge”,关注公众号

设为“星标”,好文章不错过! 1f6b4d3baf017ca76be2e3276c04f7c9.png

1 传统socket网络编程

eb418f27de62e18b95f9231fb0fe24bb.png

1.1 实战

a422190cf3352c0e4df06f9fb868e1ca.png
  • 服务端:ServerBoot63c0f35dbe35f64e22f7e1729f8471da.png

  • Server dd4b9402ef0caa85473e6196684d7f16.png

  • ClientHandler 27c662fb1679f97af67d065474bc6900.png

  • 客户端:Client9ef675205765fa12c08723027adce24d.png

  • 先后启动 ServerBootClient,分别输出如下: 5c1f50589c9f30ecc7f65df8f3ece6a2.png fbe77ade9f403a93afe863a8bafc7efe.png

1.2 传统HTTP服务器原理

a422190cf3352c0e4df06f9fb868e1ca.png
  1. 创建一个ServerSocket

  2. 监听并绑定一个端口一系列客户端来请求这个端口服务器使用Accept,获得一个来自客户端的Socket连接对象

  3. 启动一个新线程处理连接读Socket,

  • 得到字节流解码协议

  • 得到Http请求对象处理Http请求

  • 得到一个结果

  • 封装成一个HttpResponse对象编码协议

  • 将结果序列化字节流写Socket

  • 将字节流发给客户端

  • 继续循环步骤3

1.3 C/S 交互流程

a422190cf3352c0e4df06f9fb868e1ca.png

86fd0d0a94dc1cbc71ea96826d4a40e0.png

1f6b4d3baf017ca76be2e3276c04f7c9.png

2 Netty版socket网络编程

eb418f27de62e18b95f9231fb0fe24bb.png

ad4f500037a65253174bab8df8e16b0b.png

下面分别介绍图中对应组件。

1f6b4d3baf017ca76be2e3276c04f7c9.png

3 Netty核心组件

eb418f27de62e18b95f9231fb0fe24bb.png

3.1 NioEventLoop

a422190cf3352c0e4df06f9fb868e1ca.png 0cb84da3195435aad538b2d57211f091.png

3.1.1 简介

788ee76f82c9998972b12478806b9292.png 21d7c68c8de6663b35cfdc1c9250bbc6.png
EventLoop,其实一个 eventloop 就是一个 eventexecutor f2f9390767ecfc0b5c3aa889b4b52189.png

NioEventLoopGroup 是一个处理 I/O 操作的多线程事件循环。Netty 为不同类型传输提供各种 EventLoopGroup 实现。在此示例中,我们实现服务器端应用程序,因此将使用两个 NioEventLoopGroup。第一个,通常称为'boss',接受传入的连接。第二个(通常称为'工作人员')在上司接受连接并登记到工作人员后处理接受连接的流量。使用多少线程以及如何映射到创建的通道取决于 EventLoopGroup 实现,甚至可能通过构造函数进行配置。

作为Netty的发动机 de076de119833f7cf1999859bc2f3ebc.png

  • Server端 490b528089ab2d068bfb9aeb861e2c96.png

  • Client端cddb4571862f3fdca7a7be07949b2b0c.png

while(true)就对应一个 run 方法

  • NioEventLoop#run 9d91aeeb6f8dbbffb5e25a4d623345ad.png 7adacbf0df8e4e8c9787effd9b2fb082.png

netty有不同的io编程模型实现。

  • 以NIO为例,对IO事件的处理是在NioEventLoop里做的,事件的注册在下面的方法 dcaa8d98b54d29c08bd237298e61f8a5.png 75f536ab757160721658bc258e507a2a.png

不同事件调用unsafe的不同方法,netty对底层socket的操作都是通过unsafe来做的 unsafe主要由两种不同的实现:

  1. NioMessageUnsafe NioServerSocketChannel使用的是NioMessageUnsafe来做socket操作

  2. NioByteUnsafe NioSocketChannel使用NioByteUnsafe来做socket操作

  • 处理每一个连接71bb80a5db097b6cd12be15325e78ada.png a0da2480fd4935d1e5d53f3d7dc76fe9.png 53a78c98a112719962a0032c741690b1.png

EventExecutorGroup

EventExecutorGroup 负责经由其使用next()方法提供EventExecutor。除此之外,还负责处理自己的生命周期,并允许在全局模式中关闭它们。

EventExecutor

eb4166d08eb3df0439dee7f92f3cb41d.png

EventExecutor是个特殊的EventExecutorGroup,附带一些快捷方法,看是否有Thread在事件循环执行。除此之外,它还继承了EventExecutorGroup以允许通用的方法来访问。

eventloopGroup

504161696b7f3bb1f264fb321e2befa2.png

特殊的 EventExecutorGroup,它允许注册 Channel,即事件循环期间可以执行 channel 操作,得到处理,供以后选用

3.2 Channel

a422190cf3352c0e4df06f9fb868e1ca.png

2e207b3f9b71680d8e33ab384e6d4004.png

bb4cb6447edd7e9c7501c162ebb57ff6.png

  • 以服务端的NioMessageUnsafe为例来看下read()方法的实现,对应是否有新连接进来的情况 63daf6130b5f24b8db2d6d24e83abb73.png 36ab031c0f691dcf95c7c049b6d66607.png bc414d82849018a9d7b07cbdb2cdfb8e.png 直接把底层的 channel 封装成 NioSocketChannel 81303846fff5893ec52d3a280cb8a388.png b74d6f70fac82c631c01e00d464acc87.png f29c112af9c4413d43a544a945f451f9.png

3.3 ByteBuf

a422190cf3352c0e4df06f9fb868e1ca.png

c445a51c9519e5c83f486fbaf7348840.png cfd995bb4bf8cdc97d3910a7541f5bcf.png

3.4 Pipeline

a422190cf3352c0e4df06f9fb868e1ca.png

255bd2b410a3aa79434a4db373319465.png

1e1fd06d9ad9214b66b47a20890d154c.png netty 将其抽象成逻辑链,看看 netty 是怎么把每个 pipeline 加入到客户端连接的 1126e93f484cea72b670dc13bb14c140.png 38cb5b514c08a2056317972d763aad45.png a7d2e29dcd62a875adbb15af6830c557.png a79c72e67eb60754350838f5fc4e5425.png 4585db0ddbb23855465aa9a74dde38ef.png

3.5 ChannelHandler

a422190cf3352c0e4df06f9fb868e1ca.png

3e9a21ad0da2417e26da1b7bd6076a01.png

bd77065fff7cc8137825dcd36ed22de6.png

往期推荐

阿里P8架构师教你kill代码重复/大量ifelse

一文讲清RedisCluster

阿里Java架构师教你写代码-如何校验参数?

你真的深知JWT(JSON Web Token)了吗?

OAuth 2.0实战(一)-通俗光速入门

88f2f5854da96a1f9914d52ce2d56609.gif

目前交流群已有 800+人,旨在促进技术交流,可关注公众号添加笔者微信邀请进群

e506d9dbdd05edfff196ff9f1f20122a.png

喜欢文章,点个“在看、点赞、分享”素质三连支持一下~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值