前言

本篇文章主要介绍的是SpringBoot整合Netty以及使用Protobuf进行数据传输的相关内容。Protobuf会简单的介绍下用法,至于Netty在之前的文章中已经简单的介绍过了,这里就不再过多细说了。

Protobuf

介绍

protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和python,每一种实现都包含了相应语言的编译器以及库文件。

由于它是一种二进制的格式,比使用 xml进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

官方地址:

https://github.com/google/protobuf

使用

这里的使用就只介绍Java相关的使用。首先我们需要建立一个proto文件,在该文件定义我们需要传输的文件。

例如我们需要定义一个用户的信息,包含的字段主要有编号、名称、年龄。

那么该protobuf文件的格式如下:

注:这里使用的是proto3,相关的注释我已写了,这里便不再过多讲述了。需要注意一点的是proto文件和生成的Java文件名称不能一致!

syntax = "proto3";// 生成的包名option java_package="com.pancm.protobuf";//生成的java名option java_outer_classname = "UserInfo";message UserMsg {  // ID  int32 id = 1;  // 姓名  string name = 2;  // 年龄  int32 age = 3;  // 状态  int32 state = 4; } 

创建好该文件之后,我们把该文件和protoc.exe(生成Java文件的软件)放到E盘目录下的protobuf文件夹下,然后再到该目录的dos界面下输入:protoc.exe --java_out=文件绝对路径名称。

例如:

protoc.exe --java_out=E:protobuf User.proto

输入完之后,回车即可在同级目录看到已经生成好的Java文件,然后将该文件放到项目中该文件指定的路径下即可。

注:生成protobuf的文件软件和测试的protobuf文件我也整合到该项目中了,可以直接获取的。

Java文件生成好之后,我们再来看怎么使用。

这里我就直接贴代码了,并且将注释写在代码中,应该更容易理解些。

代码示例:

// 按照定义的数据结构,创建一个对象  UserInfo.UserMsg.Builder userInfo = UserInfo.UserMsg.newBuilder();  userInfo.setId(1); userInfo.setName("xuwujing"); userInfo.setAge(18); UserInfo.UserMsg userMsg = userInfo.build();  // 将数据写到输出流  ByteArrayOutputStream output = new ByteArrayOutputStream();  userMsg.writeTo(output);  // 将数据序列化后发送  byte[] byteArray = output.toByteArray();  // 接收到流并读取 ByteArrayInputStream input = new ByteArrayInputStream(byteArray);  // 反序列化  UserInfo.UserMsg userInfo2 = UserInfo.UserMsg.parseFrom(input);  System.out.println("id:" + userInfo2.getId());  System.out.println("name:" + userInfo2.getName());  System.out.println("age:" + userInfo2.getAge()); 

注:这里说明一点,因为protobuf是通过二进制进行传输,所以需要注意下相应的编码。还有使用protobuf也需要注意一下一次传输的最大字节长度。

输出结果:

id:1name:xuwujingage:18SpringBoot整合Netty

说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码。

  • 开发准备
  • 环境要求
  • JDK:1.8
  • Netty: 4.0或以上(不包括5)
  • Protobuf:3.0或以上

如果对Netty不熟的话,可以看看这些文章。大神请无视~。~

https://blog.csdn.net/column/details/17640.html

首先还是Maven的相关依赖:

UTF-81.84.1.22.Final3.5.11.5.9.RELEASE1.2.411.81.8org.springframework.boot spring-boot-starter ${springboot}org.springframework.boot spring-boot-starter-test ${springboot}testorg.springframework.boot spring-boot-devtools ${springboot}trueio.netty netty-all ${netty.version}com.google.protobuf protobuf-java ${protobuf.version}com.alibaba fastjson ${fastjson}junit junit 4.12test

添加了相应的maven依赖之后,配置文件这块暂时没有什么可以添加的,因为暂时就一个监听的端口而已。

代码编写

代码模块主要分为服务端和客户端。

主要实现的业务逻辑:

服务端启动成功之后,客户端也启动成功,这时服务端会发送一条protobuf格式的信息给客户端,然后客户端给予相应的应答。客户端与服务端连接成功之后,客户端每个一段时间会发送心跳指令给服务端,告诉服务端该客户端还存过中,如果客户端没有在指定的时间发送信息,服务端会关闭与该客户端的连接。当客户端无法连接到服务端之后,会每隔一段时间去尝试重连,只到重连成功!

服务端

首先是编写服务端的启动类,相应的注释在代码中写得很详细了,这里也不再过多讲述了。不过需要注意的是,在之前的我写的Netty文章中,是通过main方法直接启动服务端,因此是直接new一个对象的。而在和SpringBoot整合之后,我们需要将Netty交给springBoot去管理,所以这里就用了相应的注解。

代码如下:

@Service("nettyServer")public class NettyServer { private static final int port = 9876; // 设置服务端端口 private static EventLoopGroup boss = new NioEventLoopGroup(); // 通过nio方式来接收连接和处理连接 private static EventLoopGroup work = new NioEventLoopGroup(); // 通过nio方式来接收连接和处理连接 private static ServerBootstrap b = new ServerBootstrap(); @Autowired private NettyServerFilter nettyServerFilter; public void run() { try { b.group(boss, work); b.channel(NioServerSocketChannel.class); b.childHandler(nettyServerFilter); // 设置过滤器 // 服务器绑定端口监听 ChannelFuture f = b.bind(port).sync(); System.out.println("服务端启动成功,端口是:" + port); // 监听服务器关闭监听 f.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); } finally { // 关闭EventLoopGroup,释放掉所有资源包括创建的线程 work.shutdownGracefully(); boss.shutdownGracefully(); } }}

服务端主类编写完毕之后,我们再来设置下相应的过滤条件。

这里需要继承Netty中ChannelInitializer类,然后重写initChannel该方法,进行添加相应的设置,如心跳超时设置,传输协议设置,以及相应的业务实现类。

代码如下:

 @Component public class NettyServerFilter extends ChannelInitializer { @Autowired private NettyServerHandler nettyServerHandler; @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline ph = ch.pipeline(); //入参说明: 读超时时间、写超时时间、所有类型的超时时间、时间格式 ph.addLast(new IdleStateHandler(5, 0, 0, TimeUnit.SECONDS)); // 解码和编码,应和客户端一致 //传输的协议 Protobuf ph.addLast(new ProtobufVarint32FrameDecoder()); ph.addLast(new ProtobufDecoder(UserMsg.getDefaultInstance())); ph.addLast(new ProtobufVarint32LengthFieldPrepender()); ph.addLast(new ProtobufEncoder()); //业务逻辑实现类 ph.addLast("nettyServerHandler

maven netty 配置_SpringBoot整合Netty(附源码)相关推荐

  1. ssm vue架构图_ssm+vue前后端分离框架整合实现(附源码)

    前言 本文针对Spring+SpringMVC+Mybatis后台开发框架(基于maven构建)与vue前端框架(基于webpack构建)的项目整合进行介绍,对于ssm和vue单独项目的搭建不作为本文 ...

  2. ssm+vue前后端分离框架整合(附源码)

    前言 本文针对Spring+SpringMVC+Mybatis后台开发框架(基于maven构建)与vue前端框架(基于webpack构建)的项目整合进行介绍,对于ssm和vue单独项目的搭建不作为本文 ...

  3. 一份比较详细的 webpack 4.x 手工配置基础开发环境 附源码

    重新书写了博客内容,希望可以更好的呈现该有的知识点. bundle.js 指的是 webpack 打包后的文件. 小剧场 项目经理:我们要开始一个新的项目,裤裆你来负责项目构建吧. 我:好的没问题,经 ...

  4. Netty实战:Springboot+Netty+protobuf开发高性能服务器 (附源码下载)

    Springboot-cli 开发脚手架系列 Netty系列:Springboot使用Netty集成protobuf开发高性能服务器 文章目录 Springboot-cli 开发脚手架系列 简介 1. ...

  5. Springboot实战:Springboot+Netty优雅的创建websocket客户端 (附源码下载)

    Springboot-cli 开发脚手架系列 Netty系列:Springboot+Netty优雅的创建websocket客户端 (附源码下载) 文章目录 Springboot-cli 开发脚手架系列 ...

  6. Spring Cloud微服务实战:手把手带你整合eurekazuulfeignhystrix(附源码)

    Spring Cloud微服务实战:手把手带你整合eureka&zuul&feign&hystrix(附源码) Spring Cloud简介 Spring Cloud是一个基于 ...

  7. 一小时学会使用Springboot整合沙箱环境支付宝支付(附源码)

    0.前言 文章需求: 对于学生来说,目前网上确实没有比较统一而且质量好的支付教程.因为支付对个人开发者尤其是学生来说不太友好.因此,自己折腾两天,算是整理了一篇关于支付宝沙箱支付的文章. 那么为什么不 ...

  8. Spring Boot 整合 Shiro(三)Kaptcha验证码 附源码

    前言 本文是根据上篇<Spring Boot 整合Shiro(二)加密登录与密码加盐处理>进行修改,如有不明白的转上篇文章了解. 1.导入依赖 <!-- https://mvnrep ...

  9. netty中的future和promise源码分析(二)

    前面一篇netty中的future和promise源码分析(一)中对future进行了重点分析,接下来讲一讲promise. promise是可写的future,从future的分析中可以发现在其中没 ...

最新文章

  1. 两列布局左边定宽,右边自适应
  2. 【提交PR】如何在 GitHub 提交第一个 pull request
  3. 7-100 倒数第N个字符串 (15 分)
  4. java提交表单后页面不刷新_表单已经提交,但是点击后退,显示网页过期,刷新后怎样避免重复提交(急!!谢谢!)...
  5. 2012年10月国庆长假天津-内蒙古自驾游之我们在路上
  6. 【leetcode】二分查找经典题目
  7. maven 运行 java_maven运行java项目
  8. 什么事Lut预设_ps预设调色使用教程
  9. 【系统分析师之路】第十九章 复盘知识产权标准化
  10. 基于STM32设计的WiFi语音播报日程表
  11. 用C++编程求两个数字的最大公因数和最小公倍数
  12. 【计算机体系结构实验】指令调度和延迟分支
  13. easypoi.excel 导入不固定的合并单元格数据
  14. 小学计算机兴趣小组计划书,小学科技兴趣小组活动计划书
  15. 信息安全的CIA三要素
  16. 天池大数据竞赛第一名,上海交通大学人工智能实验室如何用AI定位肺结节
  17. 导数的定义、性质与求导
  18. 3des java ecb_3DES_ECB_加密解密
  19. 量子计算机每次秒可达多少次,激光脉冲让运算速度提升百万倍 量子计算机有望实现室温运行...
  20. 安卓强制横屏的坑!正确设置横屏的姿势!

热门文章

  1. 2.1.5 编码与调制(1)
  2. python websocket实现消息推送_Python Websocket消息推送---GoEasy
  3. python最大分词_python正向最大匹配分词和逆向最大匹配分词的实例
  4. python opencv 界面按钮_PyAutoGUI:自动化键鼠操作的Python类库
  5. nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
  6. struts.xml配置文件(一)
  7. 使用maven快速构建SSM项目
  8. 算法--2016搜狐面试:搜狐员工放假了,都玩什么?
  9. iphone尺寸_iPhone折叠机概念图:屏幕双打孔,iPhone折叠机有多优秀!
  10. 杭电oj1176,2084java实现