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虚拟环境与Conda使用指南分享

《Python虚拟环境与Conda使用指南分享》:本文主要介绍Python虚拟环境与Conda使用指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python 虚拟环境概述1.1 什么是虚拟环境1.2 为什么需要虚拟环境二、Python 内置的虚拟环境工具

六个案例搞懂mysql间隙锁

《六个案例搞懂mysql间隙锁》MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,本文主要介绍了六个案例搞懂mysql间隙锁,具有一定的参考价值,感兴趣的可以了解一下... 目录概念解释间隙锁详解间隙锁触发条件间隙锁加锁规则案例演示案例一:唯一索引等值锁定存在的数据案例二:

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1