Netty专栏 ( 八 )——— ChannelHandler动态添加-动态编排案例分享

2024-03-31 06:48

本文主要是介绍Netty专栏 ( 八 )——— ChannelHandler动态添加-动态编排案例分享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Netty-Small-Demo

@author 鲁伟林
子项目Netty-Small-Demo介绍诸多使用Netty的小案例。如: ChannelHandler动态编排、AttributeMap的使用或ChannelPrimise等诸多Netty提供的特性。
非常欢迎同学们fork或者留言,一起交流技术。
本博客中涉及的完整代码:
GitHub地址: https://github.com/thinkingfioa/netty-learning/tree/master/netty-small-demo。
本人博客地址: https://blog.csdn.net/thinking_fioa

项目的案例介绍

Netty-Samll-Demo子项目,基于Netty的多个特性,实现多种案例。介绍如下:

索引案例作用
1UDP传输实现Netty的UDP传输机制
2ChannelHandler动态编排根据实际业务场景,动态编排ChannelHandler
3AttributeMap使用利用ChannelAttributeMap,实现多个ChannelHandler传递变量
4Netty与多种编码器的使用基于Netty和多种编码节技术,实现自定义协议开发
5ChannelGroup使用Netty的ChannelGroup管理Channel
6channel.writeAndFlush与ctx.writeAndFlush区别案例分析两者不同点

2. ChannelHandler动态编排

Netty提供用户事件触发: userEventTriggered特性,实现ChannelHandler动态编排。案例代码Package: package org.lwl.netty.dynamic。如果想阅读源码,建议下载源码,导入idea中阅读。阅读过程中,欢迎交流

  1. 项目源码: 地址
  2. 项目包名: org.lwl.netty.dynamic
  3. 项目Main类: DynamicDemoStart

2.1 场景

实际项目开发中,客户端存在这样两个问题:

  1. 创建Channel对象时,无法明确的知道需要添加到ChannelPipeline链上的具体ChannelHandler有哪些?具体ChannelHandler往往是运行时才能知道。
  2. 一次性将所有的ChannelHandler添加到ChannelPipeline链上往往与设计不符。比如:用户先完成认证延签后,采用发起用户登录。用户完成登录,才能发起消息类型订阅。

2.2 项目介绍

ChannelHandler动态编排项目,主要讲解了如何通过userEventTriggered特性,来实现动态向ChannelPipeline加入ChannelHandler。项目主要模拟https单向认证的过程,Server端一次性添加所有的ChannelHandler到ChannelPipeline上,Client端分下列步骤加入ChannelHandler

  1. 发送Client端SSL版本等信息。 ----- SslHandler
  2. 发送Client端支持的对称加密方案。 ----- SymEncryptionHandler
  3. 产生随机码作为对称加密密钥,使用服务端的公钥对随机码加密,发送给服务端。 ----- RandomCodeHandler
  4. 发送加密后登录消息消息。 ----- LoginHandler
  5. 登录成功后加入心跳Handler ----- HeartbeatClientHandler

2.3 https单向认证序列图

2.4 客户端ChannelHandler介绍

  1. ClientInitHandler ----- 客户端初始Handler,向Pipeline添加SslHandler
  2. SslHandler ----- 发送SSL版本信息。收到服务端回复后,向Pipeline添加SymEncryptionHandler
  3. SymEncryptionHandler ----- 发送对称加密方案。收到服务端回复后,向Pipeline添加RandomCodeHandler
  4. RandomCodeHandler ----- 发送随机码。同时向Pipeline添加LoginHandler
  5. LoginHandler ----- 发送登录请求。收到登录响应后,向Pipeline添加HeartbeatClientHandler
  6. HeartbeatClientHandler ----- tcp心跳读写事件处理
  7. DynamicTriggerHandler ----- 处理用户自定义添加ChannelHandler事件请求

2.5 项目讲解

  1. ChannelHandler动态编排中使用较为简单的编解码器,如果想深入学习Netty多种编解码方式,请看netty-private-protocol子项目。
  2. 消息采用简单的消息格式。项目主要想表明如果实现ChannelHandler动态编排机制,https单项认证部分只是一个简单的框架,点到为止。
  3. 项目使用Netty提供的LengthFieldBasedFrameDecoder来解决粘包粘包问题,每条消息头部添加4个字节的长度字段。可参考博客来配置粘包粘包参数
  4. 项目的编解码使用较为简单的编解码,如果想了解多种netty编解码使用,可以参考博客待补充
  5. 项目启动类: DynamicDemoStart.java

2.6 运行结果图

无,终端输出可见

参考:

  1. Https单向认证和双向认证

这篇关于Netty专栏 ( 八 )——— ChannelHandler动态添加-动态编排案例分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/863686

相关文章

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI