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

相关文章

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

C#中的Drawing 类案例详解

《C#中的Drawing类案例详解》文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特... 目录一、Drawing 是什么?二、典型用法三、案例:画一个“带阴影的圆角矩形按钮”四、WinForm

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do