Spring架构篇--2.7 远程通信基础--使用Netty

前言:Netty 作为Nio 模型的实现,相较于Selector ,进一步将api进行封装,使用更加的简单;在平常的开发中会发现许多组件的底层通信都使用了Netty,所以就非常有必要对Netty 的使用以及其工作原理进行了解了。

1 Netty介绍:

Netty是一个NIO基于事件驱动的客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化和简化了网络编程,如TCP和UDP套接字服务器开发。
它是一个高性能、异步事件驱动的网络编程框架,它基于Java NIO(New I/O)开发,提供了一种简单易用的API,使得开发者能够轻松地构建高性能、可扩展的网络应用程序。Netty的设计目标是提供一个可嵌入、高性能、灵活、易于使用的网络编程框架,支持多种传输协议,如TCP、UDP、HTTP、WebSocket等,并且提供了丰富的功能,如SSL/TLS支持、压缩、编解码、流量控制、负载均衡、连接管理等。
Netty的核心组件包括:Channel、EventLoop、ChannelFuture、ChannelHandler和Bootstrap等。其中,Channel是网络通信的载体,EventLoop是异步事件驱动的核心,ChannelFuture是异步操作的结果,ChannelHandler是处理网络事件的组件,Bootstrap则是启动Netty应用程序的入口点。
Netty的优点在于其高性能、可扩展性和灵活性。它采用了异步非阻塞的IO模型,能够处理大量并发连接,同时提供了丰富的功能和扩展性,可以通过自定义ChannelHandler来实现各种业务逻辑。此外,Netty具有良好的文档和社区支持,能够在开发过程中提供及时的帮助和支持。

2 netty 使用:

2.1 服务端:
1)netty 服务端:

package org.lgx.bluegrass.bluegrasscoree.netty.server;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import org.lgx.bluegrass.bluegrasscoree.netty.hadler.DiscardServerHandler;/*** @Description TODO* @Date 2023/3/13 16:49* @Author lgx* @Version 1.0*/
public class DiscardServer {private int port;public DiscardServer(int port) {this.port = port;}public static void main(String[] args) {new DiscardServer(8080).run();}private void run() {// 总线程NioEventLoopGroup boss = new NioEventLoopGroup();// 工作线程NioEventLoopGroup worker = new NioEventLoopGroup();try {//netty 服务端ServerBootstrap server = new ServerBootstrap();// 服务端参数server.group(boss,worker)// nio socket 处理.channel(NioServerSocketChannel.class)// 子线程事件回调处理.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new DiscardServerHandler());}})// 主线程最大的分配线程数.option(ChannelOption.SO_BACKLOG,128)// 保持长连接.childOption(ChannelOption.SO_KEEPALIVE,true);// 启动服务ChannelFuture f = server.bind(this.port).sync();System.out.println("8080服务已启动");// 关闭通道f.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {// 线程关闭boss.shutdownGracefully();worker.shutdownGracefully();}}
}

2) 事件处理 Handler:

package org.lgx.bluegrass.bluegrasscoree.netty.hadler;import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;/*** @Description TODO* @Date 2023/3/13 16:38* @Author lgx* @Version 1.0*/
public class DiscardServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {// super.channelRead(ctx, msg);// ((ByteBuf) msg).release();// ByteBuf in = (ByteBuf) msg;// try {//     while (in.isReadable()) { // (1)//         System.out.print((char) in.readByte());//         System.out.flush();//     }// }finally {//     ReferenceCountUtil.release(msg);// }ctx.write(msg); // (1)ctx.flush(); // (2)}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {// super.exceptionCaught(ctx, cause);cause.printStackTrace();ctx.close();}
}

2.2 客户端:
1) 客户端连接

package org.lgx.bluegrass.bluegrasscoree.netty.client;import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import org.lgx.bluegrass.bluegrasscoree.netty.hadler.ClientHandler;/*** @Description TODO* @Date 2023/3/13 17:17* @Author lgx* @Version 1.0*/
public class Client {private int port;public Client(int port) {this.port = port;}public static void main(String[] args) {new Client(8080).run();}private void run() {// 工作线程NioEventLoopGroup worker = new NioEventLoopGroup();try {// netty 客户端Bootstrap b = new Bootstrap();b.group(worker).channel(NioSocketChannel.class).option(ChannelOption.SO_KEEPALIVE, true).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {socketChannel.pipeline().addLast(new ClientHandler());}});ChannelFuture f = b.connect("localhost",this.port).sync();f.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {worker.shutdownGracefully();}}
}
  1. 事件处理Handler:
package org.lgx.bluegrass.bluegrasscoree.netty.hadler;import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;/*** @Description TODO* @Date 2023/3/13 17:21* @Author lgx* @Version 1.0*/
public class ClientHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {// super.channelRead(ctx, msg);ByteBuf in = (ByteBuf) msg;try {while (in.isReadable()) { // (1)System.out.print((char) in.readByte());System.out.flush();}} finally {ReferenceCountUtil.release(msg);}}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {// super.exceptionCaught(ctx, cause);cause.printStackTrace();ctx.close();}
}

Netty 中对于其 配置的参数如ChannelOption.SO_KEEPALIVE,ChannelOption.SO_BACKLOG等,在后续对ServerBootstrap 进行解读时在进行探究;

3 netty 特点:

3.1 netty 解决Selector的使用不便:
Nio 模式,实现多路复用,一个线程监听,采用事件回调机制,处理多个客户端的数据传输;虽然使用selector 可以实现多路复用,但是需要自己进行注册的维护,轮训,对管道数据的读写也比较麻烦;

3.2 netty 的api流程简单:
服务端:
在这里插入图片描述

客户端:
在这里插入图片描述
3.3 零拷贝:netty 在接收到数据后,可以直接将数据在系统空间进行处理,并且通过系统空间写会到管道中;
1、接收和发送ByteBuffer使用堆外直接内存进行Socket读写;
2、提供了组合Buffer对象,可以聚合多个ByteBuffer对象;
3、transferTo0直接将文件缓冲区的数据发送到目标Channel;

3.4 提前分配后数据要存放的内存空间,并且可以反复利用;
3.5 责任链串行设计(连过长一定程度影响性能)
在这里插入图片描述
3.6 Netty 支持多语言,多协议;高性能序列化;

4 参考:
1 Netty 4.x 版用户指南;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/351531.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

procomponents组件库采坑日记

ModalForm组件: const formRef useRef<any>();<ModalFormkey{51}title数据仓库formRef{formRef} // 用于获取表单数据autoFocusFirstInput // 自动对话框打开后&#xff0c;首个表单项自动获得焦点width"33%"modalProps{{ // 扩展ant modal属性destroyOnC…

自动生成spring控制器的menu菜单sql

内容为springboot3 生成方式 获取spring 和knife 注解&#xff0c;解析内容&#xff0c;并生成对应sql脚本。 Tag 注解 RequestMapping 注解 Operation 注解 例如&#xff1a;Controller内容 根据以上内容&#xff0c;需要生成菜单sql脚本如下&#xff1a; 执行器代码&…

700MHz设备对广播电视信号的干扰有哪些?

700MHz&#xff0c;由于其较长的波长&#xff0c;良好的传播与覆盖特性&#xff0c;不仅一直被多国用作广播电视信号频率&#xff0c;4G LTE和5G NR也同样看好这一频段&#xff0c;并在此频段上进行了相应的部署和规划。目前已经有超过45个国家和地区&#xff0c;将700MHz频段部…

win11系统内存完整性不兼容驱动程序查找删除教程

近期很多用户都对进行了升级更新&#xff0c;但是出现了很多不兼容的情况&#xff0c;导致内存完整性关闭了&#xff0c;想要开启就需要删除不兼容的驱动程序&#xff0c;关于这个问题&#xff0c;我就来分享查找和删除的方法&#xff0c;希望能够帮助到更多的用户。 当您考虑…

SpringBoot整合EasyExcel实现Excel表格的导出功能

更多SpringBoot轮子导航 SpringBoot项目实现日志打印SQL明细(包括SQL语句和参数)几种方式 SpringBoot中几种好用的代码生成器(基于Mybatis-plus生成entity、mapper、xml等) SpringBoot整合Groovy脚本&#xff0c;实现动态编程 SpringBoot整合ip2region实现使用ip监控用户访问城…

测试必要会的接口测试,不一样的接口测试学完就能涨薪3k。

【文章末尾给大家留下了大量的福利】 requests是基于urllib的HTTP库&#xff0c;可以帮助我们发送各式各样的请求&#xff0c;携带各式各样的参数。 pip install requests 请求 包括&#xff1a; 如何发送不同类型的请求 get post delete put 。。。。 在请求中&#…

第十九节 HTTP 协议

什么是HTTP 协议? 日常我们使用网络用得最多的无疑是在Web 浏览器&#xff08;下文统一使用浏览器&#xff09;上查找资料、看视频、看书、看新闻等等&#xff0c;而在浏览器中只需要输入一些搜索就可以得到想要的信息&#xff0c;这归根于搜索引擎的好处&#xff0c;但是实际…

102.【Redis】

Resies集群 前言(一)、Nosql概述1、为什么要用NoSQL &#xff1f;2、什么是Nosql3、Nosql特点4、Nosql的四大分类5、阿里巴巴数据结构演进 (二)、Redis入门1.概述2.Redis能干什么?3、Redis的特点4、window安装Redis5、Linux安装Redis6、redis-benchmark性能测试7、Redis基础知…

菌子导航系统(持续开发中)

文章目录 菌子导航前言项目架构spring-cloud 和 spring-boot 版本选择使用到的组件&#xff08;依赖&#xff09;架构分层 项目基本功能1 使用Nacos做配置中心2 logback日志3 mybatis-plus操作数据库4 Caffeine 缓存整合5 LocalDateTime 序列化&反序列化6 参数校验快速失败…

狂神Javaweb完整版基础入门(IDEA版)值得学习的JavaWeb教程

Java web Java web 1、基本概念 web开发&#xff1a; web&#xff0c;网页的意思&#xff0c;www.baidu.com静态web html&#xff0c;css提供给所有人看的数据始终不会发生变化&#xff01; 动态web 淘宝&#xff0c;几乎是所有的网站提供给所有的人看的数据始终会变化&…

阿里腾讯“双向奔赴”新进展:互联互通再提速

《中智观察》第1636篇推送 作者&#xff1a;雨涵 编辑&#xff1a;小瑞瑞 头图来源&#xff1a;摄图网 “冬天来了&#xff0c;春天还会远吗”&#xff1f;当推倒了“篱笆墙”&#xff0c;大厂互联互通的“脚步”就在持续向前迈进。 近日&#xff0c;有消息称淘宝开始内测使用微…

【转载】JAVA知识点集锦(中)

这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答&#xff1a;Servlet与CGI的区别在于Servlet处于服务器进程中&#xff0c;它通过多线程方式运行其service()方法&#xff0c;一个实例可以服务于多个请求&#xff0c;并且其实例一般不会销…

B站---【狂神说Java】JavaWeb入门到实战---笔记

该笔记大部分搬运B站遇见狂神说的javaWeb&#xff0c;顺便把图文合并记录&#xff0c;便于回顾 视频地址&#xff1a;https://www.bilibili.com/video/BV12J411M7Sj 记得三连 文章目录 1、基本概念1.1、前言1.2、web应用程序web应用程序&#xff1a;1.3、静态web1.4、 动态web …

关于NoSQL与SQL的区别

转载自&#xff1a;http://blog.csdn.net/xlgen157387/article/details/47908797 云计算背后的秘密&#xff1a;NoSQL诞生的原因和优缺点 我本来一直觉得NoSQL其实很容易理解的&#xff0c;我本身也已经对NoSQL有了非常深入的研究&#xff0c;但是在最近准备YunTable的Chart的时…

Java面试题全集(中)

这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答&#xff1a;Servlet与CGI的区别在于Servlet处于服务器进程中&#xff0c;它通过多线程方式运行其service()方法&#xff0c;一个实例可以服务于多个请求&#xff0c;并且其实例一般不会销…

Node.js(一)——(Node.js安装及使用,通过Node.js搭建服务器,模块化及自定义模块,npm/yarn/nvm,内置模块fs的使用,buffer及stream,新闻列表案例)

目录 1.Node.js介绍 2.安装Node.js 3.使用Node.js实现第一个服务器 3.1初步感受Node.js 3.2Google Chrome 默认非安全端口列表&#xff0c;尽量避免以下端口。 3.3nodemon自动监控服务端更改 4.模块化——Node.js使用commonjs规范 4.1创建自定义模块&#xff08;引入文…

限期解除!要跟乱七八糟的口令说拜拜了

大家好&#xff0c;欢迎来到编程教室~我是Crossin。 这两天有个事关很多人的新闻&#xff1a; 转自 澎湃新闻 https://m.thepaper.cn/baijiahao_14480198 为什么说事关很多人&#xff1f;因为以下这两个场景&#xff0c;想必大家都遇到过&#xff1a; 出现这种情况&#xff0c;…

数据分析与爬虫实战视频——学习笔记(一)(python基础、urllib、超时设置、自动模拟HTTP请求、异常处理、浏览器伪装、代理服务器、新闻爬虫、淘宝登陆和图片爬取)

未经允许&#xff0c;请勿转载。 连载未完成状态 网址&#xff1a; 【数据挖掘】2019年最新python3 数据分析与爬虫实战_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av22571713/?p1 目标&#xff1a; 网络爬虫工程师 数据分析&#xff08;数据挖…

从零开始使用深度学习训练一个新闻分类器(干货)

https://mp.weixin.qq.com/s/qR-d9Zay-7NJZgmYYlwn0A?utm_sourcetuicool&utm_mediumreferral 我们在浏览新闻的时候&#xff0c;通常会看到新闻网站对每个新闻都进行了分类&#xff1a; 新闻分类的应用相当广泛。对于网站来说&#xff0c;可以根据你看得较多的新闻类别给你…

跑实验_word2vector词向量实现_基于搜狗新闻预料+维基百科

这篇博客只是记录一下如何解决 跑别人的代码没通的过程。 文章目录 1 运行代码0设备环境1.获取语料库2.语料库预处理3.训练4.开动&#xff01;使用词向量近义词获取某个词语的词向量计算句子相似度词向量加减运算选出集合中不同类的词语 2总结一下经验3补充 1 运行代码 最经在…