深入浅出Netty:高性能网络应用框架的原理与实践

news2024/11/29 10:38:45

深入浅出Netty:高性能网络应用框架的原理与实践

CSDN开发云

1. Netty简介

Netty是一个基于Java的异步事件驱动的网络应用框架,广泛用于构建高性能、高可扩展性的网络服务器和客户端。它提供对多种协议(如TCP、UDP、SSL等)的支持,适用于各种网络通信场景。

2. 核心组件

  • Channel:代表一个到远程地址的连接,负责数据读写和连接管理。
  • EventLoop和EventLoopGroup:处理Channel的I/O操作。EventLoop绑定到一个线程上,负责处理一个或多个Channel的所有I/O事件。EventLoopGroup管理一组EventLoop。
  • ChannelHandler和ChannelPipeline:ChannelHandler处理I/O事件或拦截I/O操作。ChannelPipeline按顺序组织和管理多个ChannelHandler。
  • Bootstrap和ServerBootstrap:用于配置和启动Netty应用。Bootstrap用于客户端,ServerBootstrap用于服务器。
  • Future和Promise:用于异步操作结果的处理。Future表示一个异步操作的结果,Promise是Future的扩展,可以手动设置操作结果。

3. 工作原理

  • Reactor模型:Netty采用单线程或多线程Reactor模式,通过EventLoop处理网络事件。常见的模式包括单Reactor单线程、单Reactor多线程和多Reactor多线程。
  • NIO(Non-blocking I/O):Netty使用Java NIO库实现异步非阻塞I/O操作,主要组件包括Selector、Channel和Buffer。
  • 事件驱动:通过事件驱动的方式处理网络事件,如连接、读写、异常等。
  • Pipeline机制:Netty通过Pipeline机制,使用一系列的Handler处理网络事件,类似于责任链模式,每个Handler处理特定类型的事件并传递给下一个Handler。

4. 工作流程

  • 启动服务器:通过ServerBootstrap配置和启动服务器,设置Channel类型、EventLoopGroup和ChannelInitializer等。
  • 处理连接和I/O事件:bossGroup的EventLoop接受新的连接,workerGroup的EventLoop处理Channel的I/O事件,事件沿Pipeline传播,由相应的Handler处理。
  • 异步操作和回调:使用Future和Promise处理异步操作的结果,通过回调方式处理操作完成后的逻辑。

5. 示例

一个简单的回声服务器和客户端的实现展示了如何使用Netty创建网络应用:

  • 服务器

    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.ChannelOption;
    import io.netty.channel.EventLoopGroup;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.channel.socket.nio.NioServerSocketChannel;
    
    public class EchoServer {
        private final int port;
    
        public EchoServer(int port) {
            this.port = port;
        }
    
        public void start() throws Exception {
            // 用于接收客户端连接的线程组
            EventLoopGroup bossGroup = new NioEventLoopGroup(1);
            // 用于处理每个连接的I/O操作的线程组
            EventLoopGroup workerGroup = new NioEventLoopGroup();
            try {
                // 创建ServerBootstrap实例,用于配置服务器
                ServerBootstrap b = new ServerBootstrap();
                b.group(bossGroup, workerGroup) // 设置两个EventLoopGroup
                 .channel(NioServerSocketChannel.class) // 指定Channel类型
                 .childHandler(new ChannelInitializer<SocketChannel>() {
                     @Override
                     public void initChannel(SocketChannel ch) {
                         // 向Pipeline中添加自定义的Handler
                         ch.pipeline().addLast(new EchoServerHandler());
                     }
                 })
                 .option(ChannelOption.SO_BACKLOG, 128) // 设置bossGroup的选项
                 .childOption(ChannelOption.SO_KEEPALIVE, true); // 设置workerGroup的选项
    
                // 绑定端口并开始接受连接
                ChannelFuture f = b.bind(port).sync();
                // 等待服务器Socket关闭
                f.channel().closeFuture().sync();
            } finally {
                // 关闭EventLoopGroup,释放所有资源
                bossGroup.shutdownGracefully();
                workerGroup.shutdownGracefully();
            }
        }
    
        public static void main(String[] args) throws Exception {
            int port = 8080; // 设置服务器端口
            new EchoServer(port).start(); // 启动服务器
        }
    }
    
    
  • EchoServerHandler

    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.ChannelInboundHandlerAdapter;
    
    public class EchoServerHandler extends ChannelInboundHandlerAdapter {
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
            // 接收到消息时调用,将消息写回客户端
            ctx.write(msg);
        }
    
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) {
            // 将消息刷新到远程节点
            ctx.flush();
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            // 处理异常,打印堆栈信息并关闭Channel
            cause.printStackTrace();
            ctx.close();
        }
    }
    
    
  • 客户端

    import io.netty.bootstrap.Bootstrap;
    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.SocketChannel;
    import io.netty.channel.socket.nio.NioSocketChannel;
    
    public class EchoClient {
        private final String host;
        private final int port;
    
        public EchoClient(String host, int port) {
            this.host = host;
            this.port = port;
        }
    
        public void start() throws Exception {
            // 客户端只需要一个EventLoopGroup
            EventLoopGroup group = new NioEventLoopGroup();
            try {
                // 创建Bootstrap实例,用于配置客户端
                Bootstrap b = new Bootstrap();
                b.group(group) // 设置EventLoopGroup
                 .channel(NioSocketChannel.class) // 指定Channel类型
                 .handler(new ChannelInitializer<SocketChannel>() {
                     @Override
                     public void initChannel(SocketChannel ch) {
                         // 向Pipeline中添加自定义的Handler
                         ch.pipeline().addLast(new EchoClientHandler());
                     }
                 });
    
                // 发起异步连接操作
                ChannelFuture f = b.connect(host, port).sync();
                // 等待客户端Channel关闭
                f.channel().closeFuture().sync();
            } finally {
                // 关闭EventLoopGroup,释放所有资源
                group.shutdownGracefully();
            }
        }
    
        public static void main(String[] args) throws Exception {
            String host = "localhost"; // 设置服务器地址
            int port = 8080; // 设置服务器端口
            new EchoClient(host, port).start(); // 启动客户端
        }
    }
    
    
  • EchoClientHandler

    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.ChannelInboundHandlerAdapter;
    import io.netty.util.CharsetUtil;
    
    public class EchoClientHandler extends ChannelInboundHandlerAdapter {
    
        @Override
        public void channelActive(ChannelHandlerContext ctx) {
            // 连接建立后发送消息到服务器
            ctx.writeAndFlush(Unpooled.copiedBuffer("Hello, Netty!", CharsetUtil.UTF_8));
        }
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
            // 接收到服务器的响应时调用
            ByteBuf in = (ByteBuf) msg;
            System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8));
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            // 处理异常,打印堆栈信息并关闭Channel
            cause.printStackTrace();
            ctx.close();
        }
    }
    
    

总结
Netty通过其灵活的架构和高效的I/O处理机制,提供了强大的网络编程能力,适用于各种复杂的网络应用开发。从其核心组件、工作原理到详细的实现示例,Netty展示了其在构建高性能、高并发网络应用方面的优势。

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

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

相关文章

[SAP ABAP] 数据类型

1.基本数据类型 示例1 默认定义的基本数据类型是CHAR数据类型 输出结果: 示例2 STRING数据类型用于存储任何长度可变的字符串 输出结果: 示例3 DATE数据类型用于存储日期信息&#xff0c;并且可以存储8位数字 输出结果: 提示Tips&#xff1a;日期和时间类型的变量可以直接进…

重量级身份证明来了!政府颁发的这一证书很给力

在近日的一项重要公告中&#xff0c;北京市科学技术委员会、北京市发展和改革委员会、北京市经济和信息化局等五大部门联合公示 2023 年度第二批&#xff08;总第十九批&#xff09;北京市新技术新产品新服务名单。涛思数据旗下高性能、分布式的物联网、工业大数据平台 TDengin…

CFA官网资料说明

进入到资料后台你就会发现&#xff0c;分了三个板块&#xff0c;分别是Study, Prepare和The Exam。 Study板块 主要提供备考重要资料&#xff0c;包括教材下载、自学习系统 Prepare板块 主要帮助考生准备考试&#xff0c;提供了一些小工具、包括机考软件指南 The exam板块…

whiteboard - 笔记

1 drawio draw.io GitHub - jgraph/drawio: draw.io is a JavaScript, client-side editor for general diagramming. 2 demo 可以将XML数据保存到服务器上的data目录。需要在服务器端创建一个接收和处理POST请求的脚本,该脚本将接收到的SVG数据保存到指定的文件中。下面是…

拉依达的嵌入式学习和秋招经验

拉依达的嵌入式学习和秋招经验 你好&#xff0c;我是拉依达。目前我已经结束了自己的学生生涯&#xff0c;开启了人生的下一个阶段。 从研二准备秋招开始&#xff0c;我就逐渐将自己的学习笔记陆续整理并到CSDN上发布。起初只是作为自己学习的备份记录&#xff0c;后续得到了越…

土壤墒情自动监测站的工作原理

TH-GTS10土壤墒情自动监测站是一种现代化的农业监测设备&#xff0c;能够自动、实时地监测土壤的水分含量、温度以及其他相关参数&#xff0c;为农业生产提供科学依据。利用先进的传感器技术和远程通信技术&#xff0c;实现对土壤墒情的实时监测和数据传输。通过监测土壤的水分…

07-appium常用操作

一、press_keycode 1&#xff09;方法说明 press_keycode方法是appium的键盘相关函数&#xff0c;可以实现键盘的相关操作&#xff0c;比如返回、按键、音量调节等等。也可以使用keyevent方法&#xff0c;功能与press_keycode方法类似。 # KeyCode&#xff1a;各种操作对应的…

MEMS六轴陀螺仪工作原理介绍

MEMS&#xff08;微机电系统&#xff09;六轴陀螺仪主要包括三轴陀螺仪和三轴加速度计&#xff0c;以下是其工作原理的简要介绍&#xff1a; 三轴陀螺仪工作原理&#xff1a; 陀螺仪利用科里奥利力原理来测量角速度。它通常有一个可振动的质量…

Zookeeper基础教程

Zookeeper基础教程 资料来源&#xff1a;Zookeeper Tutorial (tutorialspoint.com) zookeeper就是Hadoop生态动物园的管理员 1. Zookeeper-概述 ZooKeeper是一种分布式协调服务&#xff0c;用于管理大型主机集群(large set of hosts)。在分布式环境中协调和管理服务是一个复…

Java实现俄罗斯方块-初始化游戏界面的JPanel

目录 技术实现&#xff1a; 2.初始化游戏界面&#xff1b; 2.1 什么是游戏界面 2.2 JPanel面板 2.3 流布局管理器【FlowLayout】 2.4 网络布局管理器 【GridLayout】 2.5 边界布局管理器 技术实现&#xff1a; 1.初始化游戏窗口&#xff1b; 2.初始化游戏界面&#xff…

解决navicat连接oracle19c数据库缺少oci.dll

下载oci.dll文件 搜索Oracle Instant Client Downloads Oracle Instant Client Downloads点击 Oracle Instant Client Downloads 超链接 根据自己的操作系统按需选择 以windows64位为例&#xff0c;下载 Version 19.23.0.0.0的OCI压缩包 解压到Navicat的安装根路径下&#xff…

基于SpringBoot校园食堂订餐管理系统

文章目录 系统运行图概要整体架构流程技术名词解释 系统运行图 概要 随着校园人口的增加和生活节奏的加快&#xff0c;校园食堂的订餐管理面临着诸多挑战&#xff0c;传统的人工点餐方式已经不能满足日益增长的需求和期望。因此&#xff0c;本论文旨在设计和实现一种基于Java的…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十四)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 22 节&#xff09; P22《21.ArkUI-实现摇杆功能》 本节我们将小鱼动画案例中的按钮控制改为摇杆控制&#xff0c;用来熟悉和巩固…

面向AI时代的软件开发新范式

作为一名软件开发者&#xff0c;有幸站在了AI时代的风口浪尖。在这篇博客中&#xff0c;我将分享我的个人看法&#xff0c;一起走向AI时代软件开发新范式。 首先&#xff0c;我们要明确软件开发活动产生的各种制品&#xff0c;都是人类知识的载体&#xff0c;也是人类文明的高级…

校园疫情防控健康打卡系统

摘 要 自疫情出现以来&#xff0c;全世界人民的生命安全和健康都面临着严重威胁。高校是我国培养人才的重要基地&#xff0c;其安全和稳定影响着社会的发展和进步。因此&#xff0c;各高校高度重视疫情防控工作&#xff0c;并在校园疫情防控中引入了健康打卡系统。本论文主要研…

Cookie-SameSite属性 前端请求不带cookie的问题解决方案

最近遇到了前端请求后端不带cookie的问题&#xff0c; 请求时header里面就是没有cookie 查看响应应该是这个问题 SameSite是一个cookie属性&#xff0c;用于控制浏览器是否在跨站点请求中发送cookie。它有三个可能的值&#xff1a; 1. Strict&#xff08;严格模式&#xff09…

如何使用pwclient从社区邮件列表获取相关补丁

最近在调试Qualcomm的QCA2066 WiFi 6E平台&#xff0c;主控处理器信息如下所示&#xff1a; 6nm AMD APU CPU&#xff1a;Zen 2 4c/8t、2.4-3.5GHz&#xff08;最高可达 448GFlops FP32&#xff09; GPU&#xff1a;8 RDNA 2 CUs、1.6GHz&#xff08;1.6 TFlops FP32&#xff0…

Tomcat配置详解

文章目录 一、配置文件介绍配置文件日志文件 二、组件组件分层和分类核心组件Tomcat处理请求过程URL对应关系 三、部署java程序手动部署搭建博客状态页 四、常见配置详解tomcat端口号安全配置管理虚拟主机配置Context配置 四、Tomcat Nginx动静分离 一、配置文件介绍 配置好环…

代码讲解——ssm+jsp+maven项目目录结构说明

1 applicationContext.xml 应用上下文配置 2 db.properties 数据库配置 3 log4j.properties日志配置 4 mybatis-config.xml mybatis配置 5 springmvc.xml springmvc配置

【ai】tx2-nx:安装深度学习环境及4.6对应pytorch

参考:https://www.waveshare.net/wiki/Jetson_TX2_NX#AI.E5.85.A5.E9.97.A8 英伟达2021年发布的的tritionserver 2.17 版本中,backend 有tensorflow1 和 onnxruntime ,他们都是做什么用的,作为backend 对于 triton 推理server意义是什么,是否应该有pytorch? Triton Infer…