精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java 從零開始手寫 RPC -序列化

開發 后端
序列化 (Serialization)是將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。

[[429947]]

前面幾節我們實現了最基礎的客戶端調用服務端,這一節來學習一下通訊中的對象序列化。

為什么需要序列化

netty 底層都是基于 ByteBuf 進行通訊的。

前面我們通過編碼器/解碼器專門為計算的入參/出參進行處理,這樣方便我們直接使用 pojo。

但是有一個問題,如果想把我們的項目抽象為框架,那就需要為所有的對象編寫編碼器/解碼器。

顯然,直接通過每一個對象寫一對的方式是不現實的,而且用戶如何使用,也是未知的。

序列化的方式

基于字節的實現,性能好,可讀性不高。

基于字符串的實現,比如 json 序列化,可讀性好,性能相對較差。

ps: 可以根據個人還好選擇,相關序列化可參考下文,此處不做展開。

json 序列化框架簡介[1]

實現思路

可以將我們的 Pojo 全部轉化為 byte,然后 Byte 轉換為 ByteBuf 即可。

反之亦然。

代碼實現

maven

引入序列化包:

  1. <dependency> 
  2.     <groupId>com.github.houbb</groupId> 
  3.     <artifactId>json</artifactId> 
  4.     <version>0.1.1</version> 
  5. </dependency> 

服務端

核心

服務端的代碼可以大大簡化:

  1. serverBootstrap.group(workerGroup, bossGroup) 
  2.     .channel(NioServerSocketChannel.class) 
  3.     // 打印日志 
  4.     .handler(new LoggingHandler(LogLevel.INFO)) 
  5.     .childHandler(new ChannelInitializer<Channel>() { 
  6.         @Override 
  7.         protected void initChannel(Channel ch) throws Exception { 
  8.             ch.pipeline() 
  9.                     .addLast(new RpcServerHandler()); 
  10.         } 
  11.     }) 
  12.     // 這個參數影響的是還沒有被accept 取出的連接 
  13.     .option(ChannelOption.SO_BACKLOG, 128) 
  14.     // 這個參數只是過一段時間內客戶端沒有響應,服務端會發送一個 ack 包,以判斷客戶端是否還活著。 
  15.     .childOption(ChannelOption.SO_KEEPALIVE, true); 

這里只需要一個實現類即可。

RpcServerHandler

服務端的序列化/反序列化調整為直接使用 JsonBs 實現。

  1. package com.github.houbb.rpc.server.handler; 
  2.  
  3.  
  4. import com.github.houbb.json.bs.JsonBs; 
  5. import com.github.houbb.log.integration.core.Log; 
  6. import com.github.houbb.log.integration.core.LogFactory; 
  7. import com.github.houbb.rpc.common.model.CalculateRequest; 
  8. import com.github.houbb.rpc.common.model.CalculateResponse; 
  9. import com.github.houbb.rpc.common.service.Calculator; 
  10. import com.github.houbb.rpc.server.service.CalculatorService; 
  11.  
  12.  
  13. import io.netty.buffer.ByteBuf; 
  14. import io.netty.buffer.Unpooled; 
  15. import io.netty.channel.ChannelHandlerContext; 
  16. import io.netty.channel.SimpleChannelInboundHandler; 
  17.  
  18.  
  19. /** 
  20.  * @author binbin.hou 
  21.  * @since 0.0.1 
  22.  */ 
  23. public class RpcServerHandler extends SimpleChannelInboundHandler { 
  24.  
  25.  
  26.     private static final Log log = LogFactory.getLog(RpcServerHandler.class); 
  27.  
  28.  
  29.     @Override 
  30.     public void channelActive(ChannelHandlerContext ctx) throws Exception { 
  31.         final String id = ctx.channel().id().asLongText(); 
  32.         log.info("[Server] channel {} connected " + id); 
  33.     } 
  34.  
  35.  
  36.     @Override 
  37.     protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { 
  38.         final String id = ctx.channel().id().asLongText(); 
  39.  
  40.  
  41.         ByteBuf byteBuf = (ByteBuf)msg; 
  42.         byte[] bytes = new byte[byteBuf.readableBytes()]; 
  43.         byteBuf.readBytes(bytes); 
  44.         CalculateRequest request = JsonBs.deserializeBytes(bytes, CalculateRequest.class); 
  45.         log.info("[Server] receive channel {} request: {} from ", id, request); 
  46.  
  47.  
  48.         Calculator calculator = new CalculatorService(); 
  49.         CalculateResponse response = calculator.sum(request); 
  50.  
  51.  
  52.         // 回寫到 client 端 
  53.         byte[] responseBytes = JsonBs.serializeBytes(response); 
  54.         ByteBuf responseBuffer = Unpooled.copiedBuffer(responseBytes); 
  55.         ctx.writeAndFlush(responseBuffer); 
  56.         log.info("[Server] channel {} response {}", id, response); 
  57.     } 
  58.  
  59.  

客戶端

核心

客戶端可以簡化如下:

  1. channelFuture = bootstrap.group(workerGroup) 
  2.     .channel(NioSocketChannel.class) 
  3.     .option(ChannelOption.SO_KEEPALIVE, true
  4.     .handler(new ChannelInitializer<Channel>(){ 
  5.         @Override 
  6.         protected void initChannel(Channel ch) throws Exception { 
  7.             channelHandler = new RpcClientHandler(); 
  8.             ch.pipeline() 
  9.                     .addLast(new LoggingHandler(LogLevel.INFO)) 
  10.                     .addLast(channelHandler); 
  11.         } 
  12.     }) 
  13.     .connect(RpcConstant.ADDRESS, port) 
  14.     .syncUninterruptibly(); 

RpcClientHandler

客戶端的序列化/反序列化調整為直接使用 JsonBs 實現。

  1. package com.github.houbb.rpc.client.handler; 
  2.  
  3.  
  4. import com.github.houbb.json.bs.JsonBs; 
  5. import com.github.houbb.log.integration.core.Log; 
  6. import com.github.houbb.log.integration.core.LogFactory; 
  7. import com.github.houbb.rpc.client.core.RpcClient; 
  8. import com.github.houbb.rpc.common.model.CalculateResponse; 
  9.  
  10.  
  11. import io.netty.buffer.ByteBuf; 
  12. import io.netty.channel.ChannelHandlerContext; 
  13. import io.netty.channel.SimpleChannelInboundHandler; 
  14.  
  15.  
  16. /** 
  17.  * <p> 客戶端處理類 </p> 
  18.  * 
  19.  * <pre> Created: 2019/10/16 11:30 下午  </pre> 
  20.  * <pre> Project: rpc  </pre> 
  21.  * 
  22.  * @author houbinbin 
  23.  * @since 0.0.2 
  24.  */ 
  25. public class RpcClientHandler extends SimpleChannelInboundHandler { 
  26.  
  27.  
  28.     private static final Log log = LogFactory.getLog(RpcClient.class); 
  29.  
  30.  
  31.     /** 
  32.      * 響應信息 
  33.      * @since 0.0.4 
  34.      */ 
  35.     private CalculateResponse response; 
  36.  
  37.  
  38.     @Override 
  39.     protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { 
  40.         ByteBuf byteBuf = (ByteBuf)msg; 
  41.         byte[] bytes = new byte[byteBuf.readableBytes()]; 
  42.         byteBuf.readBytes(bytes); 
  43.  
  44.  
  45.         this.response = JsonBs.deserializeBytes(bytes, CalculateResponse.class); 
  46.         log.info("[Client] response is :{}", response); 
  47.     } 
  48.  
  49.  
  50.     @Override 
  51.     public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { 
  52.         // 每次用完要關閉,不然拿不到response,我也不知道為啥(目測得了解netty才行) 
  53.         // 個人理解:如果不關閉,則永遠會被阻塞。 
  54.         ctx.flush(); 
  55.         ctx.close(); 
  56.     } 
  57.  
  58.  
  59.     public CalculateResponse getResponse() { 
  60.         return response; 
  61.     } 
  62.  
  63.  

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-10-13 08:21:52

Java websocket Java 基礎

2021-10-29 08:07:30

Java timeout Java 基礎

2021-10-21 08:21:10

Java Reflect Java 基礎

2021-10-19 08:58:48

Java 語言 Java 基礎

2019-09-23 19:30:27

reduxreact.js前端

2021-10-14 08:39:17

Java Netty Java 基礎

2017-02-10 09:30:33

數據化運營流量

2015-11-17 16:11:07

Code Review

2019-01-18 12:39:45

云計算PaaS公有云

2018-04-18 07:01:59

Docker容器虛擬機

2024-12-06 17:02:26

2020-07-02 15:32:23

Kubernetes容器架構

2022-08-06 08:41:18

序列化反序列化Hessian

2018-03-19 10:20:23

Java序列化反序列化

2021-10-27 08:10:15

Java 客戶端 Java 基礎

2018-09-14 17:16:22

云計算軟件計算機網絡

2010-05-26 17:35:08

配置Xcode SVN

2024-05-15 14:29:45

2023-03-06 07:28:57

RPC框架序列化

2013-03-11 13:55:03

JavaJSON
點贊
收藏

51CTO技術棧公眾號

91视频国产资源| 亚洲电影av| 69av一区二区三区| 女人被男人躁得好爽免费视频| 亚洲国产精品久久久久爰性色| 亚洲最黄网站| 精品国偷自产在线视频| 国产精品熟女一区二区不卡| 午夜影院在线观看国产主播| 亚洲欧洲成人精品av97| 国产欧美在线一区二区| 国产精品久久久久av| 精品国产日本| 伊人网综合在线| 欧美精品观看| 一区二区三区视频观看| 色噜噜狠狠一区二区三区狼国成人| 午夜激情在线| 久久蜜桃一区二区| 日本免费一区二区三区视频观看| 亚洲最大成人综合网| 伊人久久综合网另类网站| 亚洲品质自拍视频| 国产乱码精品一区二区三区日韩精品| 6080午夜伦理| 欧美日本三区| 国产一区二区三区高清在线观看| 中文字幕55页| 快播电影网址老女人久久| 国产精品色噜噜| 国产久一道中文一区| 欧美性受xxx黑人xyx性爽| 欧美影院一区| 在线免费看av不卡| 欧美夫妇交换xxx| 久久女人天堂| 精品毛片三在线观看| 在线亚洲美日韩| 欧美zozo| 99精品偷自拍| yellow视频在线观看一区二区 | 99热一区二区三区| 欧美女v视频| 国产成人亚洲综合色影视| 韩国精品久久久999| 91视频免费在观看| 丁香一区二区| 欧美卡1卡2卡| 凹凸日日摸日日碰夜夜爽1| 超级白嫩亚洲国产第一| 亚洲欧美另类综合偷拍| 亚洲精品在线免费看| 巨骚激情综合| wwwwww.欧美系列| av激情久久| 国产一区二区三区成人| 男人的天堂久久精品| 人九九综合九九宗合| 国产一级做a爰片在线看免费| 国产精品成人av| 国产亚洲一区二区在线| 欧美做受xxxxxⅹ性视频| 欧美一性一交| 亚洲精品98久久久久久中文字幕| 极品白嫩少妇无套内谢| 精品一区二区三区亚洲| 欧美日本一道本| 91欧美视频在线| 国产精品亲子伦av一区二区三区| 色一区在线观看| 97xxxxx| 另类激情视频| 日本韩国欧美国产| 午夜免费一区二区| 影音成人av| 欧美美女bb生活片| 中文字幕在线视频一区二区三区| 亚洲欧美久久精品| 欧美精品视频www在线观看| 国产aⅴ爽av久久久久| 日韩国产大片| 欧美一区二区三区系列电影| 波多野结衣免费观看| 亚洲午夜免费| 日韩av最新在线观看| 黄色性生活一级片| 精品国产91久久久久久浪潮蜜月| 亚洲天堂av网| 国产免费美女视频| 欧美三级网页| 26uuu另类亚洲欧美日本一| 无码人妻精品一区二| 麻豆成人久久精品二区三区红| 国产女精品视频网站免费| 国产精品一区二区av白丝下载| 国产精品亚洲第一区在线暖暖韩国 | 51精品国产人成在线观看| 一区二区精品视频在线观看| 美女性感视频久久| 成人午夜在线影院| 欧美日韩在线精品一区二区三区激情综| 久久精品亚洲乱码伦伦中文| 亚洲日本理论电影| 后进极品白嫩翘臀在线播放| 欧美视频第一页| 日韩av在线中文| 国产成人精品亚洲线观看| 亚洲欧美中文字幕| 欧美三级黄色大片| 亚洲欧美日韩国产| 成人精品视频久久久久| 亚洲奶汁xxxx哺乳期| 久久欧美一区二区| 久久99国产精品一区| 日韩伦理在线| 欧美电影一区二区| 精品人妻一区二区三区香蕉| 欧美好骚综合网| 久久91亚洲精品中文字幕| 日韩欧美在线观看免费| 国产高清一区日本| 欧美日韩免费观看一区| www免费在线观看| 午夜精品福利一区二区三区av | 国产精品视频999| 国产精品久久久久久无人区| 成人久久久精品乱码一区二区三区| 欧美日韩三区四区| av中文字幕在线看| 欧美电影影音先锋| 性猛交娇小69hd| 精久久久久久| 51国偷自产一区二区三区| 久草视频在线看| 午夜久久久久久久久久一区二区| 色啦啦av综合| 亚洲区小说区图片区qvod按摩| 久久精品国产成人精品| 国产剧情在线视频| 成人av网站大全| 2021国产视频| 日韩成人一区| 国产亚洲欧洲黄色| 亚洲免费在线视频观看| 成人国产精品免费网站| 色播亚洲婷婷| 在线观看爽视频| 欧美v国产在线一区二区三区| 亚洲精品午夜视频| 久久激情中文| 欧美日韩一区在线观看视频| 成年人国产在线观看| 欧美日韩精品欧美日韩精品| 自拍视频一区二区| 亚洲视频一二| 99久久久久国产精品免费| 麻豆网站在线观看| 欧美久久久久久蜜桃| 69xxx免费| 久久资源在线| 日韩视频在线观看国产| av一区在线播放| 亚洲天堂av在线免费| 中文字幕黄色片| 久久久www成人免费毛片麻豆| 日韩av三级在线| 久久成人福利| 91高清视频免费| 亚洲av片在线观看| 欧美日韩在线视频首页| 蜜桃精品成人影片| 亚洲大胆在线| 国产精品我不卡| 校园春色亚洲| 国产一区二区三区18| 五月激情丁香网| 亚洲视频一二区| 性折磨bdsm欧美激情另类| 国语对白精品一区二区| 国产精品久久久久久久天堂第1集| 人人超在线公开视频| 日韩精品在线一区二区| 精品视频久久久久| 久久久久久一级片| 欧美男女交配视频| 欧美成人综合| 精品日本一区二区| 亚洲日本在线观看视频| xxav国产精品美女主播| 老牛影视av牛牛影视av| 色综合天天综合网天天狠天天 | 91高清免费看| 不卡高清视频专区| 北条麻妃在线视频| 999视频精品| 91精品国产综合久久久久久丝袜| xxxx成人| 国产亚洲美女精品久久久| 亚洲中文一区二区三区| 自拍偷拍国产精品| 精品夜夜澡人妻无码av| 理论电影国产精品| 日韩一级性生活片| 国产va免费精品观看精品视频| 国产免费一区二区三区在线能观看 | 成人做爰免费视频免费看| 九九热最新视频//这里只有精品 | 成人精品一区二区三区四区 | 日本伊人色综合网| 精品免费久久久久久久| 欧美猛男男男激情videos| 国产欧美日韩视频| 国产激情在线播放| 久久中文字幕国产| 蜜桃视频在线播放| 欧美一个色资源| 黄色污污网站在线观看| 亚洲午夜三级在线| 日韩黄色中文字幕| 成人黄色小视频在线观看| 国产免费999| 亚洲激情综合| 色女人综合av| 都市激情亚洲欧美| 91成人免费观看| 成人全视频免费观看在线看| 久久乐国产精品| 日本精品在线| 亚洲欧美一区二区三区情侣bbw | 777777国产7777777| 久久久国际精品| av免费观看不卡| 国产伦精品一区二区三区视频青涩| 毛片av免费在线观看| 伊人成人在线视频| 免费看黄色a级片| 93在线视频精品免费观看| 久久一区二区精品| 成人高潮视频| 99国产高清| 99re8精品视频在线观看| 国产成人精品电影| 亚洲免费福利| 欧美高清在线观看| 青春草在线免费视频| 久久综合88中文色鬼| 95在线视频| 亚洲人成免费电影| 天堂中文在线视频| 亚洲爱爱爱爱爱| 国产哺乳奶水91在线播放| 欧美高清精品3d| 中文字幕免费观看视频| 在线观看欧美日本| 日批视频免费观看| 91成人免费在线| 日韩手机在线视频| 色狠狠一区二区| 91麻豆精品在线| 欧美性受xxxx| 中文字幕欧美色图| 欧美日韩精品欧美日韩精品| 一本色道久久综合无码人妻| 一本色道亚洲精品aⅴ| 在线观看亚洲欧美| 夜夜夜精品看看| 伊人久久综合视频| 色综合夜色一区| 免费精品一区二区| 欧美日韩一区二区在线观看视频| 艳妇乳肉豪妇荡乳av无码福利 | 97超碰人人模人人人爽人人爱| 欧美日韩一本到| 97在线视频人妻无码| 欧美老肥妇做.爰bbww| 国产ts变态重口人妖hd| 亚洲成人性视频| 香蕉视频网站在线| 亚洲日本成人网| 视频三区在线| 免费91在线视频| 热色播在线视频| 日韩av免费看网站| 国产精品原创视频| 亚洲aⅴ日韩av电影在线观看| 久久伊人久久| 国内不卡一区二区三区| 亚州综合一区| 色之综合天天综合色天天棕色| 欧美激情偷拍自拍| 又大又硬又爽免费视频| 久久最新视频| 99九九99九九九99九他书对| 国产精品66部| 精品无码一区二区三区| 国产精品不卡一区| 国产一级特黄毛片| 日韩欧美视频一区二区三区| 在线观看日批视频| 精品免费国产二区三区| 国产综合视频一区二区三区免费| 日韩一区av在线| www欧美xxxx| 国产裸体写真av一区二区| 999国产精品一区| 手机成人在线| 欧美精品三级| 天天干天天干天天干天天干天天干| 免费高清不卡av| 日本久久久久久久久久| 久久丝袜美腿综合| 久草视频免费播放| 欧洲精品一区二区三区在线观看| av免费观看网址| 国产一区二区三区在线播放免费观看| 18加网站在线| 国产精品扒开腿做爽爽爽视频| 国产午夜精品一区在线观看| 久久99精品久久久久久久久久| 四季av一区二区三区免费观看| 水蜜桃色314在线观看| 麻豆精品久久精品色综合| 成年人的黄色片| 亚洲欧美日韩系列| 在线永久看片免费的视频| 欧美一区日本一区韩国一区| 天堂资源中文在线| 性欧美长视频免费观看不卡| 四虎国产精品永久在线国在线| 欧美日韩在线一区二区三区| 韩国av一区| 毛片毛片毛片毛| 久久久久久久综合色一本| 亚洲国产精品成人无久久精品| 欧美精品久久天天躁| 久草福利在线视频| 91av在线免费观看视频| 日本久久伊人| 综合操久久久| 蜜桃av一区二区三区电影| 一级性生活毛片| 亚洲国产日韩综合久久精品| 91丨九色丨丰满| 日韩一中文字幕| 456成人影院在线观看| 久久综合久久久| 一区在线免费观看| 亚洲一区二区观看| 婷婷丁香激情综合| 国产成人自拍一区| 久久99精品久久久久久青青91| 久久精品九色| 一级黄色录像免费看| 久久99精品久久久久| 国产激情av在线| 欧美三级在线播放| av片在线免费观看| 国产美女扒开尿口久久久| 久久视频在线| 天堂中文av在线| 亚洲精品美腿丝袜| 国产a级免费视频| 久久激情视频免费观看| 91精品国产乱码久久久竹菊| 蜜臀av性久久久久蜜臀av| 国产精品一区专区| 欧美日韩一级在线观看| 亚洲精品在线免费播放| 538视频在线| 免费国产一区| 日韩精品乱码av一区二区| 国产福利在线导航| 日本韩国一区二区三区| av影片在线看| 亚洲永久在线观看| 亚洲小说欧美另类婷婷| 国产视频精品视频| 高跟丝袜一区二区三区| 麻豆app在线观看| 国产精品视频资源| 亚洲电影在线一区二区三区| 久草福利在线观看| 亚洲香蕉伊在人在线观| 天堂av资源在线| 国产精品视频免费在线| 91精品一区国产高清在线gif| 亚洲综合中文网| 岛国视频午夜一区免费在线观看| 国产精品四虎| 91色精品视频在线| 亚洲福利国产| 亚洲最大成人综合网| 欧美综合久久久| 97人人在线视频| 日韩欧美视频一区二区| 国产福利精品导航| 日韩不卡高清视频| 欧美国产日韩一区二区| 国产一区二区三区探花| 日本黄色www|