Netty 框架——protobuf的使用

Netty 框架——protobuf的使用

Netty 是一个高性能、异步事件驱动的网络通信框架,它提供了丰富的编码解码器(codec),如 StringDecoderStringEncoder,用于处理消息的序列化与反序列化。其优势在于高性能,适用于大规模分布式系统。

Netty 编解码流程:
  • 编码器(Encoder):将应用层数据转换为网络传输的数据格式。
  • 解码器(Decoder):将网络传输的数据转换为应用层可处理的数据格式。

Netty 编解码流程

Netty 默认使用 Java 序列化,但其性能和跨语言支持存在一定问题,特别是 Java 序列化性能较低且无法在不同编程语言间互通。因此,使用 Protobuf(Protocol Buffers)替代 Java 原生序列化能够提高效率并支持跨语言通信。

Protobuf 优势:
  1. 高效的二进制协议
  2. 跨语言支持:Java, Python, C++ 等
  3. 小巧高效,减少传输数据量
Protobuf 数据流转原理:

Protobuf 流转原理


使用 Protobuf 与 Netty 构建高效通信

1. 引入 Protobuf 依赖:

pom.xml 文件中添加 Protobuf 依赖:

<dependencies>
    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>3.6.1</version>
    </dependency>
</dependencies>
2. 安装 Protobuf 插件:

确保你已经安装了 protoc 编译器,并将其添加到系统环境变量中。

Protobuf 安装插件

3. 创建 Protobuf .proto 文件:

编写 Protobuf 文件(例如:student.proto):

syntax = "proto3";

option java_outer_classname = "StudentPOJO";

message student {
  int32 id  = 1;  // 1 是字段编号
  string name = 2;
}
4. 生成 Java 文件:

使用 protoc 编译 .proto 文件,生成 Java 类:

protoc --java_out=./src/main/java ./src/main/proto/student.proto

生成的 Java 文件会位于 src/main/java 目录下。


Netty 客户端与服务器端代码示例:

客户端代码:

客户端使用 Protobuf 编码器发送消息,Netty 通过 ProtobufEncoderStudentPOJO.student 对象转换为字节流。

package netty.codec;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.protobuf.ProtobufEncoder;

public class NettyClient {
   
   

    public static void main(String[] args) throws InterruptedException {
   
   
        EventLoopGroup group = new NioEventLoopGroup();

        try {
   
   
            Bootstrap bootstrap = new Bootstrap();
            bootstrap.group(group)
                     .channel(NioSocketChannel.class)
                     .handler(new ChannelInitializer<SocketChannel>() {
   
   
                         @Override
                         protected void initChannel(SocketChannel ch) throws Exception {
   
   
                             ChannelPipeline pipeline = ch.pipeline();
                             pipeline.addLast(new ProtobufEncoder());  // 添加 Protobuf 编码器
                             pipeline.addLast(new NettyClientHandler());  // 添加自定义处理器
                         }
                     });

            ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 6668).sync();
            channelFuture.channel().closeFuture
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值