Netty初次使用

Netty | 流量整形 什么是流量整形? 消除流量波峰,减少对下游系统的冲击; Netty 中流量整形逻辑概述 Netty 对读写流控的判断是基于固定窗口(相对于滑动窗口、令牌)的判断,按照一定时间段 checkInterval (1s) 来统计; 当 writeLimit / readLimit 设置为 0 时,表示关闭写 / 读整形; 等待时间的范围控制 10ms(MINIMAL_WAIT)... 阅读详情

Netty初次使用

简介

Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。

使用
服务端的建立:

1 创建ServerBootstrap实例。ServerBootstrap是Netty服务端的启动辅助类,它提供了一系列的方法用于设置服务端启动相关的参数。底层通过门面模式对各种能力进行抽象和封装,尽量不需要用户跟过多的底层API打交道,降低用户的开发难度。

2 设置并绑定Reactor线程池。Netty的Reactor线程池是EventLoopGroup,它实际就是EventLoop的数组。EventLoop的职责是处理所有注册到本线程多路复用器Selector上的Channel,Selector的轮询操作由绑定的EventLoop线程run方法驱动,在一个循环体内循环执行。值得说明的是,EventLoop的职责不仅仅是处理网络I/O事件,用户自定义的Task和定时任务Task也统一由EventLoop负责处理,这样线程模型就实现了统一。从调度层面看,也不存在在EventLoop线程中再启动其它类型的线程用于异步执行其它的任务,这样就避免了多线程并发操作和锁竞争,提升了I/O线程的处理和调度性能。

3 设置并绑定服务端Channel。作为NIO服务端,需要创建ServerSocketChannel,Netty对原生的NIO类库进行了封装,对应实现是NioServerSocketChannel。对于用户而言,不需要关心服务端Channel的底层实现细节和工作原理,只需要指定具体使用哪种服务端Channel即可。因此,Netty的ServerBootstrap方法提供了channel方法用于指定服务端Channel的类型。Netty通过工厂类,利用反射创建NioServerSocketChannel对象。由于服务端监听端口往往只需要在系统启动时才会调用,因此反射对性能的影响并不大。

4 链路建立的时候创建并初始化ChannelPipeline。ChannelPipeline并不是NIO服务端必需的,它本质就是一个负责处理网络事件的职责链,负责管理和执行ChannelHandler。网络事件以事件流的形式在ChannelPipeline中流转,由ChannelPipeline根据ChannelHandler的执行策略调度ChannelHandler的执行。

5 初始化ChannelPipeline完成之后,添加并设置ChannelHandler。ChannelHandler是Netty提供给用户定制和扩展的关键接口。利用ChannelHandler用户可以完成大多数的功能定制,例如消息编解码、心跳、安全认证、TSL/SSL认证、流量控制和流量整形等。Netty同时也提供了大量的系统ChannelHandler供用户使用,比较实用的系统ChannelHandler总结如下:

  • 系统编解码框架-ByteToMessageCodec;

  • 通用基于长度的半包解码器-LengthFieldBasedFrameDecoder;

  • 码流日志打印Handler-LoggingHandler;

  • SSL安全认证Handler-SslHandler;

  • 链路空闲检测Handler-IdleStateHandler;

  • 流量整形Handler-ChannelTrafficShapingHandler;

  • Base64编解码-Base64Decoder和Base64Encoder。

6 绑定并启动监听端口。在绑定监听端口之前系统会做一系列的初始化和检测工作,完成之后,会启动监听端口,并将ServerSocketChannel注册到Selector上监听客户端连接

7 Selector轮询。由Reactor线程NioEventLoop负责调度和执行Selector轮询操作,选择准备就绪的Channel集合

8 当轮询到准备就绪的Channel之后,就由Reactor线程NioEventLoop执行ChannelPipeline的相应方法,最终调度并执行ChannelHandler

9 执行Netty系统ChannelHandler和用户添加定制的ChannelHandler。ChannelPipeline根据网络事件的类型,调度并执行ChannelHandler

简单实例:

服务端:

package mynetty;

import java.nio.channels.SocketChannel;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class Server {
	int port;
	public Server(int port) {
			this.port = port;
	}
	
	public void start() throws InterruptedException {
		EventLoopGroup eventLoopGroup = new NioEventLoopGroup();//用于服务器端接受客户端的连接
		ServerBootstrap serverBootstrap = new ServerBootstrap();//用于网络事件的处理
		serverBootstrap.group(eventLoopGroup) //绑定线性池
								.channel(NioServerSocketChannel.class) //指定使用的channel
								.localAddress(this.port)
								.childHandler(new ChannelInitializer<Channel>() { //绑定客户端连接后触发的操作

									@Override
									protected void initChannel(Channel arg0) throws Exception {
										System.out
												.println("等待连接。。。。。。。");
										arg0.pipeline().addLast(new ServerHandler());//客户端触发操作
									}
									
								});
		ChannelFuture cf = serverBootstrap.bind().sync();//服务端异步创建绑定
		System.out.println("服务器开始在端口"+this.port+"监听");
		cf.channel().closeFuture().sync(); //关闭服务器通道
		
	}
	  public static void main(String[] args) throws Exception {
			  	Server server = new Server(3391);
			  	server.start();
	  }
}

服务端对客户端的处理:

package mynetty;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

public class ServerHandler extends ChannelInboundHandlerAdapter{
	
	/*
	 * (non-Javadoc)
	 * @see io.netty.channel.ChannelInboundHandlerAdapter#channelRead(io.netty.channel.ChannelHandlerContext, java.lang.Object)
	 * 当收到对方发来的数据后,就会触发,参数msg就是发来的信息,可以是基础类型,也可以是序列化的复杂对象。
	 */
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		ctx.write(msg);
	}
	
	
	/*
	 * (non-Javadoc)
	 * @see io.netty.channel.ChannelInboundHandlerAdapter#channelReadComplete(io.netty.channel.ChannelHandlerContext)
	 * channelRead执行后触发
	 */
	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
	}
		
	
}

客户端:

package mynetty;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;

public class Client {

	String hoString;
	int port;
	public Client(String hoString,int port) {
			this.hoString = hoString;
			this.port = port;
	}
	
	public void start() throws InterruptedException {
		EventLoopGroup  eventLoopGroup = new NioEventLoopGroup();
		Bootstrap bootstrap = new Bootstrap();
		bootstrap.group(eventLoopGroup) //绑定线程池
					.channel(NioSocketChannel.class) //使用NioSocketChannel来作为连接用的channel类
					.remoteAddress(this.hoString,this.port) //绑定端口和host信息
					.handler(new ChannelInitializer<Channel>() {  //绑定连接初始化器

						@Override
						protected void initChannel(Channel arg0) throws Exception {
							arg0.pipeline().addLast(new ClientHandler());
							
						}
					});
		
	System.out.println("创建客户端。。。。");
	ChannelFuture cf = bootstrap.connect().sync(); //异步连接服务器
	System.out.println("创建成功");
	cf.channel().closeFuture().sync(); //异步关闭连接通道
	}
	
	
	public static void main(String[] args) throws InterruptedException {
			Client client = new Client("127.0.0.1",3391);
			client.start();
	}

}

客户端处理:

package mynetty;

import java.nio.charset.Charset;


import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

public class ClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
	
	
	/*
	 * (non-Javadoc)
	 * @see io.netty.channel.SimpleChannelInboundHandler#channelRead0(io.netty.channel.ChannelHandlerContext, java.lang.Object)
	 * 接收到服务器数据后被调用
	 */
	@Override
	protected void channelRead0(ChannelHandlerContext arg0, ByteBuf arg1) throws Exception {
		System.out.println("客户端进行读取");
		ByteBuf buf = arg1.readBytes(arg1.readableBytes());
		System.out.println(buf.toString(Charset.forName("utf-8")));
		
		
	}
	
	/*
	 * (non-Javadoc)
	 * @see io.netty.channel.ChannelInboundHandlerAdapter#channelActive(io.netty.channel.ChannelHandlerContext)
	 * 连接到服务器后被调用
	 */
	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		
		System.out.println("客户端创建成功");
		ctx.writeAndFlush(Unpooled.copiedBuffer("Hello",CharsetUtil.UTF_8));
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		super.exceptionCaught(ctx, cause);
	}

	
		
}
netty案例,netty4.1中级拓展篇十二《Netty流量整形数据流速率控制分析与实战》源码 netty案例,netty4.1中级拓展篇十二《Netty流量整形数据流速率控制分析与实战》源码 https://mp.weixin.qq.com/mp/homepage?__biz=MzIxMDAwMDAxMw==&hid=6&sn=d9bbd1e54719c7dce584c34347c12f71 立即下载

相关推荐

实体对齐(Entity Alignment)相关论文与数据集整理

实体对齐(Entity Alignment)、知识图谱融合方法总结整理 年份 模型 主要思想 博文推荐 论文 代码 2019 Entity Alignment between Knowledge Graphs Using Attribute Embeddings 实体对齐数据集整理 名称 — DBpe-dia(DBP) LinkedGeoData(LGD) Geonames(GEO) YAGO ...

bjxxkjdxcdd的博客 1万+

netty(九): 流量整形

1. 定义 流量整形是为了控制当前服务的流量输出,保证下游节点的正常处理,如图所示,将流量洪峰放入队列中,使用令牌桶算法来保证流量不会突破输出极限,保证下游收到的数据都是平稳的。 分为: 1) GlobalTrafficShapingHandler:全局流量整形,放在服务器端,表示所有链接该服务器的channel整体的流量不超过阈值 2)ChannelTrafficShapingHandler:...

流的博客 2599

2023东华大学机试OJ进阶版1-81题

先排序。每次找两个最小的数,把其中一个置为两数之和,并累加这个和值,另一个数置为-1,然后再排序,重复操作,直到只剩下一个数。105。

m0_49263811的博客 2798

【Netty权威指南】19-可靠性

作为一个基础的NIO通信框架, Netty被广泛应用于大数据处理、互联网消息中间件游戏和金融行业等。不同的行业对软件的可靠性需求不同,例如对通信软件的可靠性要求往往需要达到5个9。 1、Netty可靠性需求 我们从Netty的主要应用场景和Netty的运行环境两个维度分析 Netty的可靠性需求。 首先分析 Netty的主要应用场景。 Netty的主要应用场景如下。 1.RPC框架的基础网络...

通往神秘的道路的专栏 1556

基于Python的MGWR多尺度地理加权回归模型

多尺度地理加权回归(MGWR)变量之间的关系在地理空间上不是均一的,所有特征变量的影响都在不同的空间范围(带宽)内变化,某些变量可能表现出局部性影响(小带宽),某些变量可能表现出全局性影响(大带宽),通过优化每个特征变量的带宽,捕捉到空间关系的多尺度特性,得到更细致的模型解释。

weixin_61965078的博客 3856

基于Agent与大模型的性能测试脚本自动化生成实践

性能测试是软件质量保障的关键环节,其核心在于模拟真实用户负载以评估系统在高并发下的表现。传统脚本编写依赖人工,效率低下且易出错。通过引入智能体(Agent)与大语言模型(LLM)技术,可实现从自然语言描述或接口文档到可执行脚本的自动化转换。Agent负责任务规划与工具调用,LLM则提供强大的意图理解与代码生成能力,二者结合能精准解析测试场景、自动处理参数化与接口关联等复杂逻辑。该技术方案显著提升了脚本生成效率与准确性,尤其适用于持续集成、海量接口回归等需要快速构建测试场景的工程实践。本文以JMeter和Lo

weixin_28718769的博客 260

内置消息限流控制

4.资源释放问题,在Channel关闭或者流量整形ChannelHandler被移除时,由于ChannelTrafficShaping-Handler持有消息发送队列,如果不对消息队列进行清空处理,则会导致待发送消息丢失,或者消息队列积压,引起内存泄漏(频繁地断连和重连,会创建N个ChannelTrafficShaping-Handler实例,对应N个消息发送队列)。除了动态流控,有时候还需要对消息的读取和发送速度做控制,以便消息能以较恒定的速度发送到下游网元,保护下游各系统不受突发的流量冲击。

这个人很懒什么都没有~ 1018

小梅哥Xilinx ZYNQ学习笔记2——38译码器

译码器(Decoder)是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等),功能与编码器相反。译码器一般分为通用译码器和数字显示译码器两大类。本设计的是通用译码器。三八译码器,即是 3 种输入状态翻译成 8 种输出状态。1.case开始开始,endcase结束;2.数字声明时,合法的基数格式有 4 中,包括:十进制('d 或 'D),十六进制('h 或 'H),二进制('b 或 'B),八进制('o 或 'O)。数值可指明位宽,也可不指明位宽。

m0_51430584的博客 1636

netty

判断lastReadBytes和lastWrittenBytes大小,超过大小如何处理,自动阻塞后续的写入操作。

xiaobaiawen的博客 476

第八届传智杯微信小程序开发挑战赛练习题库

本文是微信小程序开发练习题库,包含单选题、多选题和判断题三种题型。单选题主要考察小程序开发基础知识,如数组方法、组件使用、API调用等;多选题涵盖样式属性、页面跳转、数据处理等综合知识;判断题则测试开发者对小程序特性、生命周期、功能限制等概念的理解。题目内容涉及小程序开发的各个方面,包括组件使用、API调用、数据绑定、页面配置等核心知识点,适合开发者进行自我测试和知识巩固。

qq_73044452的博客 506

SAP FICO 金税系统-金税->SAP接口功能开发说明书(接口字段)

SAP FICO 金税系统-金税->SAP接口功能开发说明书(接口字段)

我好像病了的博客 1260

Netty 初次体验

一、什么是netty Netty是一个NIO客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化并简化了TCP和UDP套接字服务器等网络编程。 “快速简便”并不意味着最终的应用程序会受到可维护性或性能问题的影响。Netty经过精心设计,具有丰富的协议,如FTP,SMTP,HTTP以及各种二进制和基于文本的传统协议。因此,Netty成功地找到了一种在不妥协的情况下实...

coates 161

3D扩散模型的构建与优化:多模态融合在三维物体生成中的作用【附核心代码实例】

随着技术的发展,基于扩散模型的3D内容生成已经成为一个激动人心的领域。通过不断优化扩散模型的结构和算法,结合多模态信息、视角控制和高效网络架构,未来的3D生成技术将不仅能够生成逼真的物体,还能满足虚拟现实、游戏设计、电影制作等行业对高质量、实时生成的需求。

一键难忘的博客 2863

【 基于Netty实现聊天室聊天业务学习】第2节.Netty初次见面

Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. 翻译:Netty是一种异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。

qq_50446805的博客 1182

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

netty002之代码初次相见

写个简单http服务器玩玩 一、依赖 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.42.Final</version> </dependency&...

zhuhaoyu6666的博客 214

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Netty的深入浅出--1.项目初次尝试

创建好项目(项目采用的是gradle管理器): NioEventLoopGroup(线程组):简单来说就是一个循环; bossGroup不断接收信息,但是不进行任何处理; workerGroup对bossGroup接收到的数据进行处理。 其实如果一个线程组也能完成接收然后处理,在返回给前端,但是真正意义上来说,这样并不符合编程规范。所以netty规定使用两个线程组来进行处理。 S...

moxiaolin的博客 797

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Netty客户端断线重连服务端

Netty客户端重连机制  场景:  1.Netty初次启动客户端,如果无法连接到服务端,将尝试重连。  2.在客户端与服务端保持长连接的过程中,如果连接断开,尝试与服务端重连。 主要代码 &amp;amp;amp;nbsp;Netty客户端启动处理类 @Service(&amp;amp;quot;nettyClient&amp;amp;quot;) public class NettyClient { private final static Logger

the Blog of Forward 9509

Netty

https://www.cnblogs.com/applerosa/p/7141684.html.Netty入门(一):零基础“HelloWorld”详细图文步骤

261

netty源码解析02-新连接的处理

netty源码解析02-新连接的处理新连接的处理前言服务端流程的回顾初次注册SelectionKey重新绑定SelectionKey新连接的处理新连接的检测新连接的处理新连接的注册新连接重新绑定SelectionKey总结 微信公众号:码农小谭,一个热爱coding、生活、分享、探讨的打工人,如果我的文章对你有帮助,麻烦给个关注吧~ 公众号分享技术博文、生活百事、欢迎关注~ 资料获取方式,无任何套路,也不需要解压验证码,如下: 需要java相关资料请回复【java】 需要数据库相关资料请回复【数据库】 需

qq_36707152的博客 667

初始Netty

Netty是是JBoss出品的,基于Java NIO client-server的网络应用框架。今天第一次接触,示例(https://gitee.com/Xiao_Zheng111/Netty.git)。 ...

chukeyong2624的博客 118

Unable to load the library ‘netty_transport_native_kqueue_x86_64‘

出现该错误:Unable to load the library 'netty_transport_native_kqueue_x86_64', trying other loading mechanism. 其实不是错误,而是: Those are DEBUG logs, not errors. Just ignore them (you're not even supposed to have DEBUG enabled on Netty in production). FYI, Netty ha

wl02119的专栏 5684

初识netty

https://xpenxpen.iteye.com/blog/2041781

那一年那一夏 187

《Netty IN ACTION》中文版《Netty实战》翻译手记——不负好时光

不负好时光——《Netty in Action》中文版《Netty实战》翻译手记 引子 “书中自有黄金屋,书中自有颜如玉”,这句话从小我老爸就给我讲,当然那个时候真的以为书中真的会有黄金做的屋子和很多玉件。后来慢慢长大了,也渐渐懂得了这句话背后的真正含义。当然,他还给我说过“书山有路勤为径,学海无涯苦作舟”和“少壮不努力,老大徒伤悲”。怎么说呢,虽然我父...

weixin_34310127的博客 333

Netty入门初学一

刚开始,打开那个博主的网站源码之后两眼一抹黑,这么长,怎么都是英文,注释都看不懂啊,这写都是什么意思,想要学习的好奇心瞬间减半,但是还是坚守初心,硬着头皮尝试通过各种方式(看博客、看视频等)让自己理解,最后发现自己所领悟的少之甚少,浪费时间,撤退。于是,对于netty的学习就搁置下来。这里说一下原因,首先,语言描述还算自然,另外还有原理图等,这样会更加形象,最后,它是以一种问答式的当时来推进,可以让自己先大概思考一下如果是自己会怎么解决,如果是在想不出来,那自己也会非常好奇的想要继续读下去。

2201_75920541的博客 266

Netty知多少?-----第一篇

初次接触netty,很多迷茫,也很多坑,踩了,自己记下,分享到博客,以免后来人继续踩坑,喜欢就点赞或评论,因为刚开始写博客,谢谢了。 我假如你已经了解netty的一些知识,比如他的NIO是多么的好,ByteBuf是多么的好,所以你才选择用此框架,那么,就我和一起开始学习netty吧。(不过即使你不知道netty有多好,但是既然你来看这篇博客,就说明你想了解netty,那我们不说屁话,开始吧。) ...

sinat_38723491的博客 291

Netty入门(快速了解以及使用netty)

Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位 以下的框架都使用了 Netty,因为它们有网络通信需求! Cassandra - nosql 数据库 Spark - 大数据分布式计算框架 Hadoop - 大数据分布式存储框架 RocketMQ - ali 开源的消息队列 ElasticSearch - 搜索引擎 gRPC

lonelykkk的博客 8630
上一篇: Java找出无权无向图的最短路径
下一篇: Java实现无向无权图的邻接矩阵的存储
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值