javascript
maven netty 配置_SpringBoot整合Netty(附源码)
前言
本篇文章主要介紹的是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(附源码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python关键字匹配_关于python
- 下一篇: bootstrap项目实例_Spring