Netty实战应用学习笔记-中级拓展篇(一)

【网络编程(三)】Netty入门到实战这一篇就够了 向ServerBootstrap传递俩个EventLoopGroup,第一个称为BoosGroup用来处理新用户的连接请求,而第二个称为WorkerGroup,用来处理读写操作和业务逻辑,也是为什么一般给BoosGroup线程数设置为1就够用的原因,因为它只处理连接请求 阅读详情

Netty实战应用学习笔记 - 中级拓展篇

参考博客:bugstack虫洞栈
代码来源:https://github.com/fuzhengwei/itstack-demo-netty
系列:Netty从入门到实战

📚 前言

本文是我学习Netty实战应用的总结笔记,涵盖了13个实战项目。

学习路线图

基础整合篇:
项目2-01:SpringBoot + Netty 整合基础
    ↓
序列化技术篇:
项目2-02:Protobuf 高性能序列化
    ↓
项目2-03:Java对象传输(Protostuff)
    ↓
文件传输篇:
项目2-04:文件传输、分片发送、断点续传
    ↓
实时通信篇:
项目2-05:WebSocket 实时聊天系统
    ↓
数据存储篇:
项目2-06:日志收集系统(Netty + Elasticsearch)
    ↓
RPC基础篇:
项目2-07:请求响应同步通信(RPC基础)
    ↓
连接保活篇:
项目2-08:心跳服务与断线重连
    ↓
集群通信篇:
项目2-09:集群部署实现跨服务端通信
    ↓
协议设计篇:
项目2-10:多种协议消息类型通信处理
    ↓
流量控制篇:
项目2-11:ChunkedStream数据流切块传输
    ↓
项目2-12:流量整形数据流速率控制
    ↓
安全通信篇:
项目2-13:SSL双向加密验证

技术栈总览

技术版本用途
JDK1.8+基础环境
Netty4.1.36.Final网络通信框架
SpringBoot2.0.4应用框架
Protobuf3.5.0二进制序列化
Protostuff1.0.10Java对象序列化
Elasticsearch6.2.2搜索引擎
Redis5.0+消息中间件

为什么要学习这些项目?

在企业级应用开发中,我们会遇到各种实际问题:

问题1:如何将Netty集成到Spring Boot项目中?
→ 项目2-01 解决:SpringBoot整合Netty,实现统一管理

问题2:如何高效传输数据,减少网络开销?
→ 项目2-02/2-03 解决:使用Protobuf/Protostuff序列化,体积减少3-10倍

问题3:如何传输大文件,支持断点续传?
→ 项目2-04 解决:分片传输+断点续传,像网盘一样可靠

问题4:如何实现浏览器与服务器的实时双向通信?
→ 项目2-05 解决:WebSocket协议,实现在线聊天

问题5:如何收集分布式系统的日志并快速检索?
→ 项目2-06 解决:Netty收集+Elasticsearch存储,构建日志系统

问题6:如何实现像HTTP一样的同步调用?
→ 项目2-07 解决:Future模式,异步转同步,RPC框架基础

问题7:如何保持长连接不断开,断开后自动重连?
→ 项目2-08 解决:心跳检测+自动重连,像微信一样稳定

问题8:集群部署时,不同服务器的用户如何通信?
→ 项目2-09 解决:Redis Pub/Sub,实现跨服务器消息传递

问题9:如何优雅地处理多种消息类型?
→ 项目2-10 解决:策略模式+工厂模式,符合开闭原则

问题10:如何传输大数据流,避免内存溢出?
→ 项目2-11 解决:ChunkedStream分块传输,像视频流一样流畅

问题11:如何限制传输速率,避免带宽被占满?
→ 项目2-12 解决:流量整形,像某盘限速一样精准控制

问题12:如何保证通信安全,防止数据被窃取?
→ 项目2-13 解决:SSL/TLS加密,像HTTPS一样安全


🎯 项目一:SpringBoot + Netty 整合基础

项目概述

项目名称:itstack-demo-netty-2-01
核心功能:实现SpringBoot与Netty的整合,提供HTTP和TCP双协议支持
技术要点:CommandLineRunner、编解码器、粘包/半包处理

为什么需要这个项目?

实际问题:

  • 单独使用Netty需要手动管理生命周期(启动、关闭)
  • 配置硬编码在代码中,不便于维护
  • 无法使用Spring的依赖注入和AOP等特性
  • 缺少HTTP接口来监控Netty服务器状态

解决方案:

  • ✅ 使用SpringBoot管理Netty生命周期
  • ✅ 配置外部化到application.yml
  • ✅ 支持依赖注入,方便集成其他服务
  • ✅ 提供HTTP接口监控Netty状态

适用场景:

  • 需要同时提供HTTP和TCP服务的系统
  • 需要监控Netty服务器状态的应用
  • 企业级项目(需要统一的配置管理)
  • 微服务架构(需要与Spring Cloud集成)

核心知识点

1. SpringBoot启动Netty服务器

NettyApplication.java

@SpringBootApplication
public class NettyApplication implements CommandLineRunner {
    
    @Value("${netty.host}")
    private String host;
    @Value("${netty.port}")
    private int port;
    @Autowired
    private NettyServer nettyServer;
    
    @Override
    public void run(String... args) throws Exception {
        // SpringBoot启动完成后自动启动Netty
        InetSocketAddress address = new InetSocketAddress(host, port);
        ChannelFuture channelFuture = nettyServer.bing(address);
        
        // 注册关闭钩子
        Runtime.getRuntime().addShutdownHook(
            new Thread(() -> nettyServer.destroy())
        );
        
        // 阻塞等待服务器关闭
        channelFuture.channel().closeFuture().syncUninterruptibly();
    }
}

关键点:

  • CommandLineRunner:SpringBoot启动完成后执行
  • addShutdownHook:优雅关闭Netty服务器
  • syncUninterruptibly():阻塞主线程,保持服务运行
2. Pipeline编解码配置

MyChannelInitializer.java

public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel channel) {
        // 1. 基于换行符的帧解码器(解决粘包/半包)
        channel.pipeline().addLast(new LineBasedFrameDecoder(1024));
        
        // 2. 字符串解码器
        channel.pipeline().addLast(new StringDecoder(Charset.forName("GBK")));
        
        // 3. 字符串编码器
        channel.pipeline().addLast(new StringEncoder(Charset.forName("GBK")));
        
        // 4. 业务处理器
        channel.pipeline().addLast(new MyServerHandler());
    }
}

Pipeline处理链:

接收数据流程:
字节流 → LineBasedFrameDecoder → StringDecoder → MyServerHandler

发送数据流程:
String → StringEncoder → 字节流 → 网络
3. 粘包/半包问题

什么是粘包/半包?

粘包:多条消息粘在一起
发送:[消息1][消息2][消息3]
接收:[消息1消息2消息3]

半包:一条消息被拆分
发送:[消息1]
接收:[消息1的前半部分] [消息1的后半部分]

解决方案:

  • LineBasedFrameDecoder:基于换行符分割
  • FixedLengthFrameDecoder:固定长度分割
  • LengthFieldBasedFrameDecoder:基于长度字段分割
4. HTTP接口监控Netty状态

NettyController.java

@RestController
@RequestMapping("/nettyserver")
public class NettyController {
    
    @Resource
    private NettyServer nettyServer;
    
    @RequestMapping("/localAddress")
    public String localAddress() {
        return "nettyServer localAddress " + 
               nettyServer.getChannel().localAddress();
    }
    
    @RequestMapping("/isOpen")
    public String isOpen() {
        return "nettyServer isOpen " + 
               nettyServer.getChannel().isOpen();
    }
}

项目总结

优点:

  • ✅ SpringBoot管理Netty生命周期
  • ✅ 配置外部化(application.yml)
  • ✅ 提供HTTP接口监控
  • ✅ 解决粘包/半包问题

适用场景:

  • 需要同时提供HTTP和TCP服务
  • 需要监控Netty服务器状态
  • 简单的文本消息通信

Netty实战(一)Nett的概念及体系结构 Netty是由JBOSS提供的一个java开源框架,它提供异步的、事件驱动的网络应用程序框架和工具。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。 阅读详情

相关推荐

Netty高并发聊天服务器实战:协议设计、性能优化与Spring Boot集成

1.编解码器:通过解决粘包问题,生成长度字段。2.事件驱动:Netty 的处理消息、连接状态变化等事件。3.资源管理:使用管理在线用户,确保线程安全。4.扩展性:通过灵活添加处理器(如安全认证、日志记录)。粘包拆包处理:自定义 $_ 分隔符广播消息简单的异常处理。

moton2017的博客 1471

Netty实战

Netty提供了两种实现,PooledByteBufAllocator(默认)和 UnpooledByteBufAllocator,前者池化了ByteBuf的实例,以提高系统性能最大限度的减少内存碎片,后者的实现不池化ByteBuf实例,每次调用都返回一个新的实例。优点:将客户端的Socket包装成一个Task(该任务实现了Runnable接口)投递到后端的线程池中进行处理,由于线程池可以设置消息队列的大小和最大线程数,因此资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。

aoligeiaoligei的博客 1327

netty案例,netty4.1中级拓展篇一《Netty与SpringBoot整合》

前言介绍 在实际的开发中,我们需要对netty服务进行更多的操作,包括;获取它的状态信息、启动/停止、对客户端用户强制下线等等,为此我们需要把netty服务加入到web系统中,那么本章节介绍如何将Netty与SpringBoot整合。 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使...

bugstack虫洞栈 2642

Netty实战应用学习笔记-中级拓展篇(六)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 630

bugstack虫洞栈 | netty4.1案例文章列表汇总,跟着案例学Netty

itstack-demo-netty netty4.x案例 微信公众号:bugstack虫洞栈,欢迎您的关注&获取更多案例与源码!博客栈:https://bugstack.cn 本专题针对netty4.x分为从;基础入门篇(九篇)、中级拓展篇(八篇)、高级应用篇(三章),由浅入深实现netty服务功能,介绍netty如何从上手到实战。 基础入门篇(九篇) netty案例,netty4.1...

bugstack虫洞栈 5251

netty案例,netty4.1中级拓展篇五《基于Netty搭建WebSocket,模仿微信聊天页面》

前言介绍 本章节我们模仿微信聊天页面,开发一个基于Netty搭建WebSocket通信案例。Netty的应用方面非常广;聊天、MQ、RPC、数据等等,在5G到来的时候更加需要大量数据传输,Netty的应用也会更加广阔。 1、这个案例使用SpringBoot+Netty+WebSocket搭建功能。 2、使用Netty提供的HttpServerCodec、HttpObjectAggregator、...

bugstack虫洞栈 3072

Dapper 快速上手指南:30 秒把数据库查询映射成 C 对象

Dapper 是 .NET 里一款轻量级 ORM / 对象映射器,核心就一件事:用最少的代码,把数据库查询结果映射成 C# 对象。它扩展 ADO.NET 的 `IDbConnection` 接口,不生成额外代码、不改变你的 SQL 写法,装好就能用。这篇 Dapper 教程带你从安装、配置到跑通第一次查询,顺带避开最常见的几个坑。 [![Dapper .NET 轻量 ORM 数据库映射项目主图]

gitblog_00439的博客 401

netty案例,netty4.1中级拓展篇七《Netty请求响应同步通信》

前言介绍 在我们实现开发RPC框架的时候,需要选择socket的通信方式。而我们知道一般情况下socket通信类似与qq聊天,发过去消息,什么时候回复都可以。但是我们RPC框架通信,从感觉上类似http调用,需要在一定时间内返回,否则就会发生超时断开。这里我们选择netty作为我们的socket框架,采用future方式进行通信。 Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于...

bugstack虫洞栈 2265

Netty实战应用学习笔记-中级拓展篇(十二)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 1087

netty案例,netty4.1中级拓展篇二《Netty使用Protobuf传输数据》

前言介绍 在netty数据传输过程中可以有很多选择,比如;字符串、json、xml、java对象,但为了保证传输的数据具备;良好的通用性、方便的操作性和传输的高性能,我们可以选择protobuf作为我们的数据传输格式。目前protobuf可以支持;C++、C#、Dart、Go、Java、Python等,也可以在JS里使用。知识点;ProtobufDecoder、ProtobufEncoder、Pr...

bugstack虫洞栈 2080

netty案例,netty4.1中级拓展篇四《Netty传输文件、分片发送、断点续传》

前言介绍 1、在实际应用中我们经常使用到网盘服务,他们可以高效的上传下载较大文件。那么这些高性能文件传输服务,都需要实现的分片发送、断点续传功能。 2、在Java文件操作中有RandomAccessFile类,他可以支持文件的定位读取和写入,这样就满足了我们对文件分片的最基础需求。 3、Netty服务端启动后,可以向客户端发送文件传输指令;允许接收文件、控制读取位点、记录传输标记、文件接收完成。 ...

bugstack虫洞栈 3229

Netty实战应用学习笔记-中级拓展篇(九)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 1063

Matlab双目相机标定

1 概述 现在有许多双目相机在出厂时就已经标定好了,用户拿到手后可以直接使用,例如Intel Realsense系列。但是有些相机出厂的时候并没有完成标定工作,因而这个时候就需要我们自己来标定。由于笔者曾改装过一个双目相机,最远可以测至50m,因此有一定的心得体会想给大家分享一下。本文主要介绍双目相机标定的整个过程,以及导出标定数据的方法。 相机标定主要分为手动标定和自动标定,手动标定比较繁琐,这里主要介绍基于matlab工具箱的自动标定方式来对双目相机进行标定。具体的相关标定细节也可以参照这篇博客:m

weixin_46133643的博客 2万+

Netty实战应用学习笔记-中级拓展篇(八)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 640

EG2134驱动芯片实战:如何用TSSOP20封装搞定三相无刷电机驱动(附电路图)

本文详细介绍了EG2134驱动芯片在三相无刷电机驱动中的应用实践,包括芯片选型、电路设计和PCB布局技巧。EG2134作为一款高性能半桥驱动芯片,采用TSSOP20封装,适合紧凑型设计。文章还提供了典型应用电路图和调试指南,帮助工程师快速实现稳定可靠的电机驱动方案。

d3e4f的博客 308

遥感生态指数(RSEI)——四个指数的计算

遥感生态指数是在4个生态指数的基础上通过主成分变换得出的一个评价生态环境质量的指标。因此,第二部分就是要分别计算出这4个指数的值。 ①首先,是绿度指数的计算,一般用归一化植被指数(NDVI) NDVI=(NIR-Red)/(NIR+Red) 在Bandmath工具中输入NDVI计算公式 (float(b4-b3))/(b4+b3) 其中,b3、b4分别是红波段和近红外波段 ②其次,是湿度计算。 WET = c1B1 + c2B2 + c3B3...

qq_41978498的博客 9万+

Netty实战应用学习笔记-中级拓展篇(十三)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 570

小白投资理财 - 解读威廉分形指标 Williams Fractals

威廉分形指标用于识别价格趋势中的关键点,帮助判断支撑位和阻力位。

wumingxiaoyao的博客 4339

Netty实战应用学习笔记-中级拓展篇(五)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 636

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

王老师青少年编程 1719

vue2 - 详细实现播放AMR格式音频并实现自定义播放器样式,支持amr音频文件在线地址URL播放、调用服务端API接口获取二进制文件流amr形式、用户本地上传amr文件并实现立即播放(详细代码)

vue2,amr,amr文件播放,vue播放amr音频文件以及在线url跨域问题解决,vue使用audio标签播放amr音频,amr跨域解决,amr网页解码播放,文件上传后怎么播放,vue2播放.amr语音文件,api接口形式调用获取的amr如何播放,vue中如何使用audio元素播放AMR格式的文件,进度条,vue前端如何播放AMR格式的音频文件,vue播放语音文件AMR格式,播放amr格式音频AMR录音机,h5原生audio播放amr格式的音频,VUE2使用benz-amr-recorder 实现解码、

✅ 精选推荐文章 7415

Netty实战应用学习笔记-中级拓展篇(七)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 322

搭建 Newman + Postman + Git + Jenkins 环境教程

一步步搭建 Newman、Postman、Git 和 Jenkins 的环境。这些工具常用来做 API 测试和 CI/CD 自动化,尤其是 Postman 和 Newman 搭配 Git 和 Jenkins,能实现 API 集合的版本管理和自动测试。

Criss@陈磊 436
上一篇: Netty入门学习笔记(三)
下一篇: Netty实战应用学习笔记-中级拓展篇(二)
不早睡不改名@
博客等级 码龄5年 536粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值