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

「深入浅出Netty」不愧是阿里架构师,这篇Netty实战文档太实用 前言 什么是Netty? Netty是由JBOSS提供的一个java开源框架。 Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty是一个基于NIO的客户,服务器端编程框架,使用Netty可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。 作为当前最流行的NIO框架,Netty在互联... 阅读详情

🔍 项目六:日志收集系统(Netty + Elasticsearch)

项目概述

项目名称:itstack-demo-netty-2-06
核心功能:使用Netty收集日志数据,实时存储到Elasticsearch
技术要点:Spring Data Elasticsearch、Repository模式、ES文档映射

为什么需要这个项目?

实际问题:

  • 分布式系统日志分散在各个服务器,难以查询
  • 日志量大,传统数据库查询慢
  • 需要全文检索和复杂查询
  • 需要实时收集和分析日志

解决方案:

  • ✅ Netty高性能接收:支持大量日志数据
  • ✅ Elasticsearch存储:支持全文检索和分析
  • ✅ Spring Data简化开发:无需编写复杂的ES操作代码
  • ✅ 实时性:日志实时收集、实时查询

适用场景:

  • 日志收集系统(ELK架构的一部分)
  • 数据同步系统(MySQL → Elasticsearch)
  • 实时搜索引擎
  • 大数据分析平台

核心知识点

1. 系统架构
┌─────────────┐
│  客户端应用  │ (业务系统、日志采集器)
└──────┬──────┘
       │ Netty TCP
       │ (传输User对象)
       ↓
┌─────────────┐
│ Netty服务器  │ (接收数据)
└──────┬──────┘
       │ Spring Data
       │ (调用Repository)
       ↓
┌─────────────┐
│Elasticsearch│ (存储和检索)
└─────────────┘
2. Elasticsearch简介

什么是Elasticsearch?

Elasticsearch(ES)是一个基于Lucene的分布式搜索和分析引擎。

特性说明
全文检索支持复杂的搜索查询
分布式支持水平扩展
实时性近实时的搜索和分析
RESTful API简单易用的HTTP接口
JSON文档使用JSON格式存储数据

ES概念对比:

MySQL          →  Elasticsearch
数据库(Database) →  索引(Index)
表(Table)       →  类型(Type)
行(Row)         →  文档(Document)
列(Column)      →  字段(Field)
3. 定义ES文档

User.java

@Document(indexName = "stack", type = "group_user")
public class User {
    @Id
    private String id;
    private String name;       // 姓名
    private Integer age;       // 年龄
    private String level;      // 级别
    private Date entryDate;    // 入职时间
    private String mobile;     // 电话
    private String email;      // 邮箱
    private String address;    // 地址
}

关键注解:

  • @Document:定义索引和类型
    • indexName:索引名称(类似数据库名)
    • type:类型名称(类似表名)
  • @Id:标记主键字段
4. Spring Data Elasticsearch

UserRepository.java

public interface UserRepository extends ElasticsearchRepository<User, String> {
    // 自定义查询方法
    Page<User> findByName(String name, Pageable pageable);
}

自动提供的方法:

save(User user)              // 保存
deleteById(String id)        // 删除
findById(String id)          // 查询
findAll()                    // 查询所有
count()                      // 统计数量

方法命名规则:

findByName(String name)                    // 按姓名查询
findByAge(Integer age)                     // 按年龄查询
findByNameAndAge(String name, Integer age) // 多条件查询
findByAgeBetween(Integer min, Integer max) // 范围查询
findByNameLike(String name)                // 模糊查询
5. Netty Handler集成ES

MyServerHandler.java

@Service("myServerHandler")
public class MyServerHandler extends ChannelInboundHandlerAdapter {
    
    @Autowired
    private UserService userService;  // 注入ES服务
    
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        // 1. 接收消息
        logger.info("服务端接收到消息:" + JSON.toJSONString(msg));
        
        // 2. 解析协议
        TransportProtocol transportProtocol = (TransportProtocol) msg;
        
        // 3. 保存到Elasticsearch
        userService.save((User) transportProtocol.getObj());
    }
}

关键点:

  • 使用 @Service 注解,让Spring管理Handler
  • 通过 @Autowired 注入UserService
  • 接收到数据后直接保存到ES
6. 配置文件

application.properties

## 服务端口
server.port = 8080

## Netty服务配置
netty.host = 127.0.0.1
netty.port = 7397

## Elasticsearch配置
spring.data.elasticsearch.cluster-name=es-itstack
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.data.elasticsearch.repositories.enabled=true

配置说明:

  • cluster-name:ES集群名称(需与ES配置一致)
  • cluster-nodes:ES节点地址(9300是传输端口)
  • repositories.enabled:启用Spring Data ES Repository
7. 解决Netty版本冲突

Application.java

@SpringBootApplication
public class Application implements CommandLineRunner {
    
    public static void main(String[] args) {
        // 解决Netty和ES的Netty版本冲突
        System.setProperty(
            "es.set.netty.runtime.available.processors", "false"
        );
        SpringApplication.run(Application.class, args);
    }
}

为什么需要:

  • Elasticsearch内部也使用Netty
  • 会与项目的Netty冲突
  • 设置系统属性,禁用ES的Netty处理器数量检测

项目总结

核心技术:

  • ✅ Netty高性能接收:使用Netty接收大量数据
  • ✅ Elasticsearch存储:支持全文检索和分析
  • ✅ Spring Data简化开发:无需编写复杂的ES操作代码
  • ✅ 对象序列化传输:使用Protostuff高效传输

适用场景:

  • 日志收集系统(ELK架构的一部分)
  • 数据同步系统(MySQL → Elasticsearch)
  • 实时搜索引擎
  • 大数据分析平台

🎓 核心知识点总结

1. Netty与SpringBoot整合

关键技术:

  • CommandLineRunner:SpringBoot启动完成后执行
  • @Value:读取配置文件
  • @Autowired:依赖注入
  • ShutdownHook:优雅关闭

最佳实践:

@SpringBootApplication
public class Application implements CommandLineRunner {
    @Value("${netty.port}")
    private int port;
    
    @Autowired
    private NettyServer nettyServer;
    
    @Override
    public void run(String... args) throws Exception {
        nettyServer.start(port);
        Runtime.getRuntime().addShutdownHook(
            new Thread(() -> nettyServer.destroy())
        );
    }
}

2. 粘包/半包问题

三种解决方案:

  1. 固定长度:FixedLengthFrameDecoder

    channel.pipeline().addLast(new FixedLengthFrameDecoder(100));
    
  2. 分隔符:LineBasedFrameDecoder、DelimiterBasedFrameDecoder

    channel.pipeline().addLast(new LineBasedFrameDecoder(1024));
    
  3. 长度字段:LengthFieldBasedFrameDecoder

    channel.pipeline().addLast(new LengthFieldBasedFrameDecoder(
        1024, 0, 4, 0, 4
    ));
    

3. 序列化方案选择

决策树:

需要跨语言?
├─ 是 → Protobuf
└─ 否 → 需要定义proto文件?
         ├─ 可以接受 → Protobuf
         └─ 不想定义 → Protostuff

性能排序:

Protobuf ≈ Protostuff > JSON > XML > Java序列化

4. Pipeline设计原则

处理链顺序:

入站(Inbound):
字节流 → 帧解码器 → 消息解码器 → 业务Handler

出站(Outbound):
业务Handler → 消息编码器 → 字节流

示例:

// 入站处理链
channel.pipeline().addLast(new FrameDecoder());      // 1
channel.pipeline().addLast(new MessageDecoder());    // 2
channel.pipeline().addLast(new BusinessHandler());   // 3

// 出站处理链(逆序执行)
channel.pipeline().addLast(new MessageEncoder());    // 3

5. 文件传输最佳实践

核心技术:

  • RandomAccessFile:支持随机读写
  • 分片传输:避免内存溢出
  • 断点续传:提升用户体验
  • 空字节处理:避免文件损坏

关键代码:

// 定位到指定位置
randomAccessFile.seek(position);

// 读取数据
int readSize = randomAccessFile.read(bytes);

// 去掉空字节
if (readSize < bytes.length) {
    byte[] copy = new byte[readSize];
    System.arraycopy(bytes, 0, copy, 0, readSize);
}

6. WebSocket核心流程

握手流程:

HTTP请求 → 验证 → 101状态码 → WebSocket连接建立

消息类型:

  • TextWebSocketFrame:文本消息
  • BinaryWebSocketFrame:二进制消息
  • PingWebSocketFrame:心跳检测
  • PongWebSocketFrame:心跳响应
  • CloseWebSocketFrame:关闭连接

7. Elasticsearch集成

核心概念:

  • @Document:定义索引和类型
  • @Id:定义主键
  • ElasticsearchRepository:提供CRUD方法
  • 方法命名规则:自动生成查询

最佳实践:

@Document(indexName = "logs", type = "app_log")
public class AppLog {
    @Id
    private String id;
    private String message;
    private Date timestamp;
}

public interface AppLogRepository 
    extends ElasticsearchRepository<AppLog, String> {
    Page<AppLog> findByMessage(String message, Pageable pageable);
}
bugstack虫洞栈 | netty4.1案例文章列表汇总,跟着案例学Netty itstack-demo-netty netty4.x案例 微信公众号:bugstack虫洞栈,欢迎您的关注&获取更多案例与源码!博客栈:https://bugstack.cn 本专题针对netty4.x分为从;基础入门篇(九篇)、中级拓展篇(八篇)、高级应用篇(三章),由浅入深实现netty服务功能,介绍netty如何从上手到实战。 基础入门篇(九篇) netty案例,netty4.1... 阅读详情

相关推荐

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

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

bugstack虫洞栈 2642

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

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

java_rutu的博客 1072

netty案例,netty4.1中级拓展篇六《SpringBoot+Netty+Elasticsearch收集日志信息数据存储》

前言介绍 在实际的开发场景中,我们希望将大量的业务以及用户行为数据存储起来用于分析处理,但是由于数据量较大且需要具备可分析功能所以将数据存储到文件系统更为合理。尤其是一些互联网高并发级应用,往往数据库都采用分库分表设计,那么将这些分散的数据通过binlog汇总到一个统一的文件系统就显得非常有必要。 开发环境 1、jdk1.8【jdk1.7以下只能部分支持netty】 2、Netty4.1.36.F...

bugstack虫洞栈 2253

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

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

java_rutu的博客 1087

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

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

bugstack虫洞栈 3072

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

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

bugstack虫洞栈 2265

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

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

java_rutu的博客 1063

netty案例,netty4.1中级拓展篇三《Netty传输Java对象》

前言介绍 Netty在实际应用级开发中,有时候某些特定场景下会需要使用Java对象类型进行传输,但是如果使用Java本身序列化进行传输,那么对性能的损耗比较大。为此我们需要借助protostuff-core的工具包将对象以二进制形式传输并做编码解码处理。与直接使用protobuf二进制传输方式不同,这里不需要定义proto文件,而是需要实现对象类型编码解码器,用以传输自定义Java对象。 pro...

bugstack虫洞栈 2142

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

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

java_rutu的博客 640

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

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

bugstack虫洞栈 3229

netty案例,netty4.1中级拓展篇十二《Netty流量整形数据流速率控制分析与实战》

作者:付政委 | 关注微信公众号:bugstack虫洞栈,获取专题案例源码 前言介绍 你是否使用过某盘,在前几年我们使用的时候速度飞快,上传下载嗖嗖嗖。但是近年来只要不办会员,速度慢的像蜗牛,当然人家也得赚钱我们能理解。那么这样的限速是怎么实现的呢,我们这个案例使用Netty的流量整形进行限速传输,测试过程中当你把流量整形功能去掉后你就是年费VIP。 流量整形(Traffic Shaping...

bugstack虫洞栈 3696

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

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

java_rutu的博客 570

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

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

bugstack虫洞栈 2080

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

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

java_rutu的博客 636

netty案例,netty4.1中级拓展篇八《Netty心跳服务与断线重连》

前言介绍 在我们使用netty中,需要监测服务是否稳定以及在网络异常链接断开时候可以自动重连。需要实现监听;f.addListener(new MyChannelFutureListener()) 环境准备 1、jdk1.8【jdk1.7以下只能部分支持netty】 2、Netty4.1.36.Final【netty3.x 4.x 5每次的变化较大,接口类名也随着变化】 代码示例 itstack-...

bugstack虫洞栈 2069

告别ROS1思维:在ROS2 Humble上,用Python搞定MoveIt2机械臂控制的完整流程

本文详细介绍了在ROS2 Humble环境下使用Python控制MoveIt2机械臂的完整流程。从环境配置、架构变革到实战操作,涵盖URDF适配、Action接口编程及性能优化技巧,帮助开发者高效迁移ROS1项目至ROS2平台,实现工业级机械臂控制。

weixin_30352645的博客 451

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

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

java_rutu的博客 322

国密(3)- 预主密钥/主密钥计算和Finished消息的加解密

国密的ECC-SM3-SM4-CBC模式下的预主密钥和主密钥的生成过程介绍,以及Finished消息的加解密介绍

weixin_43408952的博客 6513

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

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

java_rutu的博客 306

反无人机技术实战解析:从探测到拦截的全方位防御策略

本文深入解析了反无人机(C-UAS)技术的全链条防御策略。从雷达、无线电频谱、光电等多维度探测技术,到数据融合与威胁评估,再到无线电干扰、导航诱骗及物理拦截等核心拦截手段,系统阐述了如何构建从探测到拦截的实战化防御体系,为关键设施、大型活动等场景提供定制化空域安全解决方案。

weixin_29230649的博客 403

【AI智能体】Coze 搭建个人旅游规划助手实战详解

Coze 制作旅游规划助手机器人实战详解

congge 4608

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

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

java_rutu的博客 301

微信小程序 - {errCode: 10008, errno: 1500104, errMsg: “writeBLECharacteristicValue:fail write characteris

微信小程序errCode: 10008, errno: 1500104, errMsg: "writeBLECharacteristicValue:fail write characteristics error. 10008, errMsg=The value's length is invalid.",uni-app微信小程序报错,uniApp小程序调用蓝牙api报错,向低功耗蓝牙设备的某个特征写入数据时错误,UniApp微信小程序蓝牙API调用报错10008解决方案,蓝牙设备进行通信时,向设备写入数据

🏆 前端领域优质创作者 4431
上一篇: Netty实战应用学习笔记-中级拓展篇(五)
下一篇: Netty实战应用学习笔记-中级拓展篇(七)
不早睡不改名@
博客等级 码龄5年 536粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值