Netty5源码分析(八) -- 总结

本系列文章深入剖析Netty5源码,涵盖服务器端口绑定、线程模型、事件分发机制、ByteBuf缓冲区管理、编解码机制及异步调用等内容,帮助读者理解Netty的设计理念与实现细节。

这个系列通过七篇文章,结合Netty5的原代码

1. 分析了服务器绑定端口的过程,从整体上可以看到Netty执行的流程和主要组件

2. 分析了Netty的线程模型,解析了Reactor模式。很多人都不理解这块,被EventLoop的名称和复杂的类层次所迷惑

3. 通过比较使用Java原生的NIO API来编程的流程,再分析了Netty是如何把这些基本流程封装地,进一步地理清了Netty的封装思路

4. 分析了Netty的事件分发模型,描述了inbound,outbound事件模型,以及Pipeline, ChannelHandlerContext,ChannelHandlerInvoker, ChannelHandler等核心组件如何实现事件分发的

5. 分析了ByteBuf缓冲区和Java原生的ByteBuffer缓冲区的异同,解释了为什么NIO编程需要缓冲区这个组件

6. 分析了CodeC编解码的类层次和主要组件。CodeC是网络编程两个要处理的基本问题之一。另一个就是底层IO

7. 分析了异步调用模型,结合实例再次分析了Netty如何处理多个线程交互


Netty5源码分析(一) -- 服务器绑定过程分析

Netty5源码分析(二) -- 线程模型分析

Netty5源码分析(三) -- Channel如何注册OP_ACCEPT, OP_READ, OP_WRITE

Netty5源码分析(四) -- 事件分发模型

Netty5源码分析(五) -- ByteBuf缓冲区

Netty5源码分析(六) -- CodeC编解码分析

Netty5源码分析(七) -- 异步执行Future和Promise

Netty5.0 架构剖析源码解读 作者:李林锋 版权所有 email neu_lilinfeng@ © Netty5.0 架构剖析源码解读1 1. 概述2 1.1. JAVA 的IO演进2 1.1.1. 传统BIO通信的弊端2 1.1.2. Linux 的网络IO模型简介4 1.1.3. IO复用技术介绍7 1.1.4. JAVA的异步IO8 1.1.5. 业界主流的NIO框架介绍10 2.NIO入门10 2.1. NIO服务端10 2.2. NIO客户端13 3.Netty源码分析16 3.1. 服务端创建16 3.1.1. 服务端启动辅助类ServerBootstrap16 3.1.2. NioServerSocketChannel 的注册21 3.1.3. 新的客户端接入25 3.2. 客户端创建28 3.2.1. 客户端连接辅助类Bootstrap28 3.2.2. 服务端返回ACK应答,客户端连接成功32 3.3. 读操作33 3.3.1. 异步读取消息33 3.4. 写操作39 3.4.1. 异步消息发送39 3.4.2. Flush操作42 4.Netty架构50 4.1. 逻辑架构50 5. 附录51 5.1. 作者简介51 5.2. 使用声明51 1. 概述 1.1.JAVA 的IO演进 1.1.1. 传统BIO通信的弊端 在JDK 1.4推出JAVANIO1.0之前,基于JAVA 的所有Socket通信都采用 BIO 了同步阻塞模式( ),这种一请求一应答的通信模型简化了上层的应用开发, 但是在可靠性性能方面存在巨大的弊端。所以,在很长一段时间,大型的应 C C++ 用服务器都采用 或者 开发。当并发访问量增大、响应时间延迟变大后, 采用JAVABIO作为服务端的软件只有通过硬件不断的扩容来满足访问量的激 增,它大大增加了企业的成本,随着集群的膨胀,系统的可维护性也面临巨大 的挑战,解决这个问题已经刻不容缓。 首先,我们通过下面这幅图来看下采用BIO 的服务端通信模型:采用BIO 通信模型的 1connect NewThread1 WebBrowse 2connect 2handle(Req) WebBrowse 3connect Acceptor NewThread2 WebBrowse WebBrowse 4connect NewThread3 3sendResponsetopeer NewThread4 图1.1.1-1 BIO通信模型图 服务端,通常由一个独立的Accepto 线程负责监听客户端的连接,接收到客户 端连接之后为客户端连接创建一个新的线程处理请求消息
<think>我们正在将gRPC版本从当前版本(例如1.23.0)升级到1.44以上(比如1.58.0)。除了升级gRPC相关的依赖,我们还需要考虑其他相关依赖的兼容性,特别是Netty相关组件区块链SDK(chainmaker-sdk-java)的兼容性。 根据用户提供的pom.xml文件,我们注意到有以下相关依赖: 1. `io.netty:netty-handler`: 当前版本为4.1.53.Final 2. `io.netty:netty-tcnative-openssl-static`: 当前版本为2.0.39.Final(作为系统作用域的依赖) 3. `org.chainmaker:chainmaker-sdk-java`: 当前版本为2.3.1.3 升级gRPC到1.44+后,我们需要检查这些依赖是否与新的gRPC版本兼容。 根据gRPC的官方文档发布说明,gRPC Java库通常依赖特定版本的Netty。例如,gRPC 1.58.0要求Netty版本为4.1.96.Final(具体版本要求可查看gRPC的README)。 因此,我们需要: 1. 升级`netty-handler`到与gRPC 1.58.0兼容的版本(通常gRPC的文档会指定)。 2. 检查`netty-tcnative`版本是否与升级后的Netty版本兼容。因为`netty-tcnative`是Netty的本地传输库,用于支持TLS(特别是OpenSSL),所以版本需要匹配。 3. 确认`chainmaker-sdk-java`是否兼容新版本的gRPCNetty。由于该SDK是区块链链芯的Java SDK,我们需要查看其官方文档或源码,了解其依赖的gRPCNetty版本。 具体步骤: 步骤1:升级Netty依赖 根据gRPC 1.58.0的要求,我们需要升级Netty到4.1.96.Final(以gRPC官方发布的兼容版本为准)。因此,将`netty-handler`升级到4.1.96.Final。 步骤2:升级netty-tcnative 由于我们使用了`netty-tcnative-openssl-static`,并且当前版本为2.0.39.Final,我们需要升级到与Netty 4.1.96.Final兼容的版本。通常,netty-tcnative的版本与Netty版本有一定的对应关系。我们可以选择最新的稳定版本,例如2.0.62.Final(请参考Netty官方文档)。 步骤3:检查chainmaker-sdk-java的兼容性 由于`chainmaker-sdk-java`是一个第三方SDK,我们需要确认其是否支持gRPC 1.58.0Netty 4.1.96.Final。如果该SDK内部依赖了旧版本的gRPC或Netty,可能会引起冲突。因此,我们需要: - 查看`chainmaker-sdk-java`的pom文件(可以从Maven仓库获取)以了解其依赖的gRPCNetty版本。 - 如果它依赖的版本较低,而我们升级后版本较高,可能需要排除其内部的低版本依赖,并强制使用我们项目中的高版本。 但是,如果`chainmaker-sdk-java`没有强制指定gRPCNetty的版本(使用范围版本),则可能不会冲突。否则,我们需要在项目中排除冲突的依赖。 步骤4:解决依赖冲突 使用Maven的依赖树命令检查冲突: ``` mvn dependency:tree ``` 重点关注gRPC、Nettychainmaker-sdk-java的依赖关系。如果存在冲突,在依赖中排除旧版本。 例如,如果`chainmaker-sdk-java`依赖了低版本的gRPC,我们可以这样排除: ```xml <dependency> <groupId>org.chainmaker</groupId> <artifactId>chainmaker-sdk-java</artifactId> <version>2.3.1.3</version> <exclusions> <exclusion> <groupId>io.grpc</groupId> <artifactId>grpc-netty</artifactId> </exclusion> <exclusion> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> </exclusion> <!-- 其他需要排除的gRPC模块 --> </exclusions> </dependency> ``` 步骤5:测试 完成依赖调整后,进行全面的测试,确保区块链SDK的功能正常,特别是网络通信TLS部分。 综上所述,除了升级gRPC版本,我们还需要升级Netty相关依赖(`netty-handler``netty-tcnative`),并检查`chainmaker-sdk-java`的兼容性,必要时排除其内部的旧版本依赖。 因此,在pom.xml中,我们应做如下调整: 1. 更新`grpc.version`属性为1.58.0(或更高兼容版本)。 2. 更新`netty-handler`版本为4.1.96.Final(与gRPC 1.58.0兼容的版本)。 3. 更新`netty-tcnative-openssl-static`到与Netty 4.1.96.Final兼容的版本,例如2.0.62.Final。 4. 对`chainmaker-sdk-java`进行依赖排除(如果存在版本冲突)。 修改后的pom.xml片段示例: ```xml <properties> <java.version>1.8</java.version> <grpc.version>1.58.0</grpc.version> <!-- 升级gRPC版本 --> <netty.version>4.1.96.Final</netty.version> <!-- 新增Netty版本属性 --> <netty.tcnative.version>2.0.62.Final</netty.tcnative.version> <!-- 新增tcnative版本属性 --> </properties> <dependencies> <!-- 其他依赖 --> <!-- chainmaker-sdk-java: 排除可能冲突的gRPCNetty依赖 --> <dependency> <groupId>org.chainmaker</groupId> <artifactId>chainmaker-sdk-java</artifactId> <version>2.3.1.3</version> <exclusions> <exclusion> <groupId>io.grpc</groupId> <artifactId>*</artifactId> <!-- 排除所有gRPC依赖,或者逐个排除 --> </exclusion> <exclusion> <groupId>io.netty</groupId> <artifactId>*</artifactId> <!-- 排除所有Netty依赖 --> </exclusion> </exclusions> </dependency> <!-- 升级gRPC依赖 --> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-api</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>${grpc.version}</version> </dependency> <!-- 升级Netty依赖 --> <dependency> <groupId>io.netty</groupId> <artifactId>netty-handler</artifactId> <version>${netty.version}</version> </dependency> <!-- 更新netty-tcnative-openssl-static --> <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-openssl-static</artifactId> <version>${netty.tcnative.version}</version> <classifier>${os.detected.classifier}</classifier> <!-- 建议使用os.detected.classifier来适配不同操作系统 --> <scope>runtime</scope> <!-- 改为runtime作用域,避免使用system作用域 --> </dependency> <!-- 其他依赖 --> </dependencies> ``` 注意:我们移除了`netty-tcnative-openssl-static`的`system`作用域,改为`runtime`作用域,并使用Maven仓库中的依赖。同时,通过`os.detected.classifier`(需要配置`os-maven-plugin`)来根据操作系统自动选择正确的分类器(如linux-x86_64、osx-x86_64等)。 如果不想使用os-maven-plugin,可以手动指定分类器(但这样会限制跨平台),或者继续使用system作用域并指定路径(不推荐,因为不利于跨平台构建)。 另外,我们需要添加os-maven-plugin来检测操作系统: ```xml <build> <plugins> <plugin> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.7.0</version> <executions> <execution> <phase>initialize</phase> <goals> <goal>detect</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 这样,Maven就能自动根据操作系统架构设置`os.detected.classifier`属性。 总结:升级gRPC版本后,必须升级Netty相关依赖并调整`netty-tcnative`的引入方式,同时处理区块链SDK中可能存在的依赖冲突。 最后,由于区块链SDK(chainmaker-sdk-java)可能使用了旧版的gRPC或Netty,排除其内部的依赖并统一使用项目中的新版本,可以避免冲突。但需要测试以确保功能正常。 如果测试过程中出现与TLS相关的问题(如引用[3]中的错误),可能是由于`netty-tcnative`版本不匹配导致的,请确保版本正确。 同时,注意gRPCNetty的版本兼容性,具体可参考gRPC官方文档:https://github.com/grpc/grpc-java/blob/master/SECURITY.md#netty 根据该文档,gRPC 1.58.0要求Netty 4.1.96.Finalnetty-tcnative 2.0.60.Final(或更高)。因此,我们选择的netty-tcnative版本2.0.62.Final是合适的。 请按照上述步骤修改pom.xml,并进行充分测试。 </think> ### 在升级gRPC到1.44+时对其他依赖的适配分析 当将区块链Maven测试服务的gRPC版本升级到1.44以上时,**除gRPC本身外,`netty-handler`、`chainmaker-sdk-java``netty-tcnative-openssl-static`均需适配**。以下是具体分析及改造方案: --- ### 1. **`netty-handler`的适配** - **必要性**: gRPC 1.44+依赖Netty 4.1.68+([官方要求](https://github.com/grpc/grpc-java/releases)),而当前项目中`netty-handler`版本为4.1.53.Final,存在兼容风险。 - **改造方案**: 升级到与gRPC 1.58.0兼容的Netty版本: ```xml <properties> <netty.version>4.1.96.Final</netty.version> <!-- 与gRPC 1.58.0兼容 --> </properties> <dependency> <groupId>io.netty</groupId> <artifactId>netty-handler</artifactId> <version>${netty.version}</version> </dependency> ``` - **验证重点**: 测试TLS握手、HTTP/2流控等特性是否正常(引用[^2])。 --- ### 2. **`chainmaker-sdk-java`的适配** - **必要性**: 该SDK(v2.3.1.3)内部可能依赖旧版gRPC(如1.23.0),直接升级会导致: - 类冲突(如`ManagedChannelBuilder`接口变化) - Protobuf序列化兼容性问题(引用[^1]) - **改造方案**: 1. **排除SDK中的旧gRPC依赖**: ```xml <dependency> <groupId>org.chainmaker</groupId> <artifactId>chainmaker-sdk-java</artifactId> <version>2.3.1.3</version> <exclusions> <exclusion> <groupId>io.grpc</groupId> <artifactId>*</artifactId> <!-- 排除所有旧gRPC模块 --> </exclusion> </exclusions> </dependency> ``` 2. **添加新版gRPC依赖**(已在主pom中统一管理) 3. **验证SDK功能**: 重点测试链连接、交易提交等核心功能,确保API兼容性。 --- ### 3. **`netty-tcnative-openssl-static`的适配** - **必要性**: - 当前版本`2.0.39.Final`与Netty 4.1.96+存在ABI不兼容 - 日志显示原生库加载失败(引用[^3]) - **改造方案**: 1. **升级版本并移除`system`作用域**: ```xml <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-openssl-static</artifactId> <version>2.0.62.Final</version> <!-- 匹配Netty 4.1.96 --> <classifier>${os.detected.classifier}</classifier> <!-- 自动适配OS --> </dependency> ``` 2. **添加OS检测插件**: ```xml <build> <plugins> <plugin> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.7.0</version> </plugin> </plugins> </build> ``` 3. **验证TLS连接**: 确保区块链节点的TLS握手成功(引用)。 --- ### 完整依赖树管理建议 使用Maven命令检查冲突: ```bash mvn dependency:tree -Dincludes=io.grpc,io.netty ``` 若存在冲突,在`<dependencyManagement>`中统一指定版本: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-bom</artifactId> <version>1.58.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` --- ### 性能与兼容性验证 1. **基准测试**: - 对比升级前后的TPS(每秒交易数)延迟 - 使用`grpc-census`监控链路性能(引用[^2]) 2. **异常场景**: - 模拟网络中断,测试重连机制 - 发送畸形数据包验证协议兼容性 > **注意**:区块链SDK可能涉及JNI调用,需验证`netty-tcnative`在不同OS(Linux/Windows)下的加载情况(引用[^4])。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值