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

Java 從零開始手寫 RPC基于 Websocket 實現

開發 后端
RPC(Remote Procedure Call Protocol)--遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。

RPC

解決的問題

RPC 主要是為了解決的兩個問題:

(1)解決分布式系統中,服務之間的調用問題。

(2)遠程調用時,要能夠像本地調用一樣方便,讓調用者感知不到遠程調用的邏輯。

這一節我們來學習下如何基于 websocket 實現最簡單的 rpc 調用,后續會實現基于 netty4 的版本。

開源地址: https://github.com/houbb/rpc

完整流程

java 從零開始手寫 RPC (01) 基于 websocket 實現

其中左邊的Client,對應的就是前面的Service A,而右邊的Server,對應的則是Service B。

下面一步一步詳細解釋一下。

(1)Service A的應用層代碼中,調用了Calculator的一個實現類的add方法,希望執行一個加法運算;

(2)這個Calculator實現類,內部并不是直接實現計算器的加減乘除邏輯,而是通過遠程調用Service B的RPC接口,來獲取運算結果,因此稱之為Stub;

(3)Stub怎么和Service B建立遠程通訊呢?這時候就要用到遠程通訊工具了,也就是圖中的Run-time Library,這個工具將幫你實現遠程通訊的功能,比如Java的Socket,就是這樣一個庫,當然,你也可以用基于Http協議的HttpClient,或者其他通訊工具類,都可以,RPC并沒有規定說你要用何種協議進行通訊;

(4)Stub通過調用通訊工具提供的方法,和Service B建立起了通訊,然后將請求數據發給Service B。需要注意的是,由于底層的網絡通訊是基于二進制格式的,因此這里Stub傳給通訊工具類的數據也必須是二進制,比如calculator.add(1,2),你必須把參數值1和2放到一個Request對象里頭(這個Request對象當然不只這些信息,還包括要調用哪個服務的哪個RPC接口等其他信息),然后序列化為二進制,再傳給通訊工具類,這一點也將在下面的代碼實現中體現;

(5)二進制的數據傳到Service B這一邊了,Service B當然也有自己的通訊工具,通過這個通訊工具接收二進制的請求;

(6)既然數據是二進制的,那么自然要進行反序列化了,將二進制的數據反序列化為請求對象,然后將這個請求對象交給Service B的Stub處理;

(7)和之前的Service A的Stub一樣,這里的Stub也同樣是個“假玩意”,它所負責的,只是去解析請求對象,知道調用方要調的是哪個RPC接口,傳進來的參數又是什么,然后再把這些參數傳給對應的RPC接口,也就是Calculator的實際實現類去執行。很明顯,如果是Java,那這里肯定用到了反射。

(8)RPC接口執行完畢,返回執行結果,現在輪到Service B要把數據發給Service A了,怎么發?一樣的道理,一樣的流程,只是現在Service B變成了Client,Service A變成了Server而已:Service B反序列化執行結果->傳輸給Service A->Service A反序列化執行結果 -> 將結果返回給Application,完畢。

簡單實現

假設服務 A,想調用服務 B 的一個方法。

因為不在同一個內存中,無法直接使用。如何可以實現類似 Dubbo 的功能呢?

這里不需要使用 HTTP 級別的通信,使用 TCP 協議即可。

common

公用模塊,定義通用對象。

  • Rpc 常量
  1. public interface RpcConstant { 
  2.  
  3.  
  4.     /** 
  5.      * 地址 
  6.      */ 
  7.     String ADDRESS = "127.0.0.1"
  8.  
  9.  
  10.     /** 
  11.      * 端口號 
  12.      */ 
  13.     int PORT = 12345; 
  14.  
  15.  
  • 請求入參
  1. public class RpcCalculateRequest implements Serializable { 
  2.  
  3.  
  4.     private static final long serialVersionUID = 6420751004355300996L; 
  5.  
  6.  
  7.     /** 
  8.      * 參數一 
  9.      */ 
  10.     private int one; 
  11.  
  12.  
  13.     /** 
  14.      * 參數二 
  15.      */ 
  16.     private int two; 
  17.  
  18.  
  19.     //getter & setter & toString() 
  • 服務接口
  1. public interface Calculator { 
  2.  
  3.  
  4.     /** 
  5.      * 計算加法 
  6.      * @param one 參數一 
  7.      * @param two 參數二 
  8.      * @return 返回結果 
  9.      */ 
  10.     int add(int one, int two); 
  11.  
  12.  

server

  • 服務接口的實現
  1. public class CalculatorImpl implements Calculator { 
  2.  
  3.  
  4.     @Override 
  5.     public int add(int one, int two) { 
  6.         return one + two; 
  7.     } 
  8.  
  9.  
  • 啟動服務
  1. public static void main(String[] args) throws IOException { 
  2.     Calculator calculator = new CalculatorImpl(); 
  3.     try (ServerSocket listener = new ServerSocket(RpcConstant.PORT)) { 
  4.         System.out.println("Server 端啟動:" + RpcConstant.ADDRESS + ":" + RpcConstant.PORT); 
  5.         while (true) { 
  6.             try (Socket socket = listener.accept()) { 
  7.                 // 將請求反序列化 
  8.                 ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 
  9.                 Object object = objectInputStream.readObject(); 
  10.                 System.out.println("Request is: " + object); 
  11.                 // 調用服務 
  12.                 int result = 0; 
  13.                 if (object instanceof RpcCalculateRequest) { 
  14.                     RpcCalculateRequest calculateRpcRequest = (RpcCalculateRequest) object; 
  15.                     result = calculator.add(calculateRpcRequest.getOne(), calculateRpcRequest.getTwo()); 
  16.                 } 
  17.                 // 返回結果 
  18.                 ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
  19.                 objectOutputStream.writeObject(result); 
  20.             } catch (Exception e) { 
  21.                 e.printStackTrace(); 
  22.             } 
  23.         } 
  24.     } 

啟動日志:

  1. Server 端啟動:127.0.0.1:12345 

client

•客戶端調用

  1. public static void main(String[] args) { 
  2.     Calculator calculator = new CalculatorProxy(); 
  3.     int result = calculator.add(1, 2); 
  4.     System.out.println(result); 
  • 計算的代理類
  1. public class CalculatorProxy implements Calculator { 
  2.  
  3.  
  4.     @Override 
  5.     public int add(int one, int two) { 
  6.         try { 
  7.             Socket socket = new Socket(RpcConstant.ADDRESS, RpcConstant.PORT); 
  8.  
  9.  
  10.             // 將請求序列化 
  11.             RpcCalculateRequest calculateRpcRequest = new RpcCalculateRequest(one, two); 
  12.             ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
  13.  
  14.  
  15.             // 將請求發給服務提供方 
  16.             objectOutputStream.writeObject(calculateRpcRequest); 
  17.  
  18.  
  19.             // 將響應體反序列化 
  20.             ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 
  21.             Object response = objectInputStream.readObject(); 
  22.  
  23.  
  24.             if (response instanceof Integer) { 
  25.                 return (Integer) response; 
  26.             } else { 
  27.                 throw new RuntimeException(); 
  28.             } 
  29.         } catch (IOException | ClassNotFoundException e) { 
  30.             throw new RuntimeException(e); 
  31.         } 
  32.     } 
  • 調用日志

client 端

server 端

  1. Server 端啟動:127.0.0.1:12345 
  2. Request is: RpcCalculateRequest{one=1, two=2} 

 

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

2021-10-20 08:05:18

Java 序列化 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 基礎

2021-10-27 08:10:15

Java 客戶端 Java 基礎

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容器架構

2018-09-14 17:16:22

云計算軟件計算機網絡

2010-05-26 17:35:08

配置Xcode SVN

2024-05-15 14:29:45

2023-11-09 23:45:01

Pytorch目標檢測

2021-03-16 11:30:33

2015-05-06 09:36:05

Java語言從零開始學習

2015-10-15 14:16:24

2024-04-10 07:48:41

搜索引擎場景
點贊
收藏

51CTO技術棧公眾號

无码人妻av免费一区二区三区 | 国产精品亚洲欧美导航| 国精产品一区一区三区免费视频| 三上悠亚国产精品一区二区三区| 国产色爱av资源综合区| 成人在线国产精品| 日韩黄色在线视频| 日韩成人精品一区| 日韩欧美国产综合一区| 国产一区二区在线视频播放| 最新97超碰在线| 国产宾馆实践打屁股91| 国产成人涩涩涩视频在线观看| www深夜成人a√在线| 久久99精品久久久久久欧洲站| 色婷婷亚洲一区二区三区| 伊人色综合影院| 天天操天天干天天干| 欧美aaaaaa午夜精品| 欧美大片va欧美在线播放| 蜜桃av免费看| 成人在线视频你懂的| 欧美婷婷六月丁香综合色| 国产一区二区四区| 黄a在线观看| 99v久久综合狠狠综合久久| 国产日韩精品在线观看| 91视频免费网址| 欧美激情 亚洲a∨综合| 一区二区三区亚洲| 小毛片在线观看| 91精品麻豆| 在线观看91精品国产入口| 日韩av在线播放不卡| 韩国中文字幕在线| 国产精品网曝门| 欧美激情视频一区二区三区| 国产高清视频免费| 久久国产精品第一页| 欧美中文在线观看| 日产精品久久久久久久| 黄色精品网站| 欧美精品一区二区免费| 国产白丝一区二区三区| 精品无人区麻豆乱码久久久| 精品视频偷偷看在线观看| 韩国av中国字幕| 精品国产一区二| 7777精品久久久大香线蕉| 久久久精品麻豆| 欧美粗大gay| 欧美午夜美女看片| 日韩在线综合网| 激情国产在线| 图片区小说区区亚洲影院| 日韩a级在线观看| 青青草视频在线免费直播| 亚洲精品中文在线| 亚洲免费视频播放| 成人在线视频成人| 欧美国产精品一区二区三区| 婷婷精品国产一区二区三区日韩 | 91麻豆精品国产综合久久久| 欧美日韩在线播| 日韩爱爱小视频| 日韩美女在线| 日韩一区二区三区精品视频| 国产乱码一区二区三区四区| 精品视频一二| 精品国产一区二区国模嫣然| 国产黑丝一区二区| 神马久久av| 亚洲一区999| 91禁男男在线观看| 亚洲精品国产成人影院| 欧美精品免费在线| 亚洲欧美在线视频免费| 国产精品久久久免费| 国产精品扒开腿做爽爽爽男男| 成人黄色片在线观看| 日本欧美一区二区三区乱码| 91精品免费看| 亚洲精品视频网| 91欧美激情一区二区三区成人| 欧美影视一区二区| 巨大荫蒂视频欧美大片| 亚洲精品成人精品456| 日韩五码在线观看| 蜜臀国产一区| 91麻豆精品国产无毒不卡在线观看 | 视频一区视频二区中文| 国产精品爽爽爽| 精品久久久久中文慕人妻| proumb性欧美在线观看| 日韩av影视| 午夜伦理大片视频在线观看| 色综合网色综合| www.五月天色| 羞羞答答一区二区| 久久精品电影网站| 中国一级免费毛片| 韩国欧美国产一区| 久久99欧美| 免费网站成人| 精品久久久在线观看| 免费av不卡在线| 天堂俺去俺来也www久久婷婷| 在线精品视频视频中文字幕| 久久网免费视频| 青娱乐精品在线视频| 韩国精品一区二区三区六区色诱| 三级外国片在线观看视频| 大伊人狠狠躁夜夜躁av一区| www.污污视频| 久久99青青| 久久久人成影片一区二区三区观看 | 国产一区二区三区四区三区四| 日韩免费观看视频| 黄色片一区二区三区| 中文字幕不卡在线观看| 99视频在线免费播放| 综合久久av| 国产香蕉一区二区三区在线视频| 久久久久亚洲av成人片| 久久er精品视频| 欧美极品一区二区| 波多野结衣中文在线| 91精品国产色综合久久| 久久久国产一级片| 视频一区中文字幕| 欧美大陆一区二区| av电影在线地址| 日韩欧美高清dvd碟片| 亚洲女人毛茸茸高潮| 日韩av高清在线观看| 久久99精品久久久久子伦 | 18性欧美xxxⅹ性满足| www.蜜桃av.com| 亚洲色图.com| 污视频网址在线观看| 日韩国产欧美| 国产精品夜间视频香蕉| 福利成人在线观看| 色视频欧美一区二区三区| 少妇户外露出[11p]| 夜夜精品视频| 久久久久高清| 欧美极品影院| 成人国产精品免费网站| 久久久精品999| 中文字幕男人天堂| 国产欧美久久久精品影院| 日韩 欧美 高清| 中文有码一区| 日本高清+成人网在线观看| 天堂在线中文网| 亚洲夂夂婷婷色拍ww47| 青娱乐国产精品视频| 婷婷综合五月| 97久草视频| 影音先锋在线播放| 欧美高清精品3d| 日韩一区二区三区四区视频| 国产精品五区| 欧美日韩在线高清| 欧美日韩不卡| 国产午夜精品视频免费不卡69堂| 69亚洲精品久久久蜜桃小说| 97se亚洲国产综合自在线观| 国产精品97在线| 尤物tv在线精品| 97在线观看视频国产| 色wwwwww| 欧美性精品220| 在线免费观看日韩av| 久久久久久一区二区| 日本黑人久久| 玖玖精品在线| 色综合久久悠悠| 亚洲第一成人av| 亚洲成人av电影| 国产老熟女伦老熟妇露脸| 日韩午夜av| 亚洲mv在线看| 国产高清精品二区| 午夜精品久久久99热福利| 色鬼7777久久| 欧美日韩亚洲国产综合| 国产亚洲成人精品| 久久久久综合网| 九九热99视频| 欧美黄色一区| 日本电影一区二区三区| 91成人短视频在线观看| 久久久久国产视频| 深夜视频在线免费| 欧美视频中文字幕在线| 亚洲伦理一区二区三区| 成人午夜视频在线| 狠狠热免费视频| 91精品综合| 久久精品国产一区二区三区日韩 | 精品福利樱桃av导航| 偷拍女澡堂一区二区三区| 免费欧美在线视频| 黄色片免费在线观看视频| 日韩有码一区| 成人一区二区电影| caoprom在线| 久久综合网hezyo| 日韩偷拍自拍| 欧美一区三区二区| 免费黄色网址在线| 一区二区三区在线观看网站| 99久久人妻无码中文字幕系列| 青青青伊人色综合久久| 国产3p露脸普通话对白| 欧美天堂社区| ts人妖另类在线| 欧洲成人一区| 久久久亚洲国产| 尤物网在线观看| 亚洲精品一区二区三区婷婷月| 国产情侣小视频| 亚洲成人在线网站| 久久久久久久麻豆| 91视频观看免费| 中文字幕人妻一区| 精品一区二区精品| 免费在线激情视频| 一区免费视频| 97久久国产亚洲精品超碰热| 久久麻豆精品| 欧美福利精品| 国产女人18毛片水真多18精品| 亚洲最大成人在线| 欧美国产日韩电影| 欧美亚洲国产视频| 日本在线视频中文有码| 日韩在线免费高清视频| 精品欧美不卡一区二区在线观看 | 中文字幕欧美精品在线| 天堂av在线免费| 日韩一区二区电影在线| 最近中文字幕在线免费观看| 欧洲一区二区三区免费视频| 中文字幕av影院| 婷婷国产在线综合| 久久网中文字幕| 亚洲成人在线免费| 青青草原在线免费观看| 亚洲欧洲av另类| www中文在线| 国产精品久久久久久久午夜片| 精品成人av一区二区三区| 97aⅴ精品视频一二三区| 亚洲精品成人无码毛片| 国产成人精品免费在线| 免费观看一区二区三区| 国产盗摄女厕一区二区三区| 亚洲视频在线不卡| 国产成人啪免费观看软件| 色黄视频免费看| 国产iv一区二区三区| 女同性αv亚洲女同志| 国产毛片一区二区| 三级黄色片免费看| 国产乱子伦一区二区三区国色天香| 国产性生活一级片| 国产精品2024| 无码国产精品久久一区免费| 国产精品18久久久久久久网站| 好吊操视频这里只有精品| heyzo一本久久综合| 国产成人精品一区二区在线小狼| 国产成人午夜电影网| 亚洲av成人片无码| 99视频精品免费视频| 国产亚洲色婷婷久久99精品91| 久久先锋资源网| 国产一级久久久久毛片精品| 中文字幕视频一区| 999精品在线视频| 亚洲成人免费视| 69国产精品视频免费观看| 91福利社在线观看| 国产一区二区三区成人| 欧美大片免费久久精品三p| 欧美一级片免费| 亚洲欧美日韩国产精品| 黄色精品免费看| 午夜精品久久久久久久久久久久| 欧美大片免费| 91精品视频专区| 日韩一级电影| 爱爱爱视频网站| 极品av少妇一区二区| 国产免费999| 国产九色精品成人porny| 视频免费在线观看| 日本一区二区三区在线不卡 | 人人妻人人澡人人爽久久av| 亚洲美女精品久久| 欧美人与禽性xxxxx杂性| 2021国产精品视频| 日韩在线激情| 国产精品一 二 三| 我不卡伦不卡影院| 久久精品国产精品亚洲色婷婷| 久久成人免费日本黄色| 色噜噜在线观看| 亚洲码国产岛国毛片在线| 日韩av一二三区| 一本大道久久a久久综合| 国产又粗又猛又爽又黄视频| 国产网站欧美日韩免费精品在线观看| 免费网站免费进入在线| 91精品国产91久久久久久| 日本h片久久| 国产一区二区无遮挡| 99精品视频在线| 免费毛片网站在线观看| 国产一区二区久久| 精品国产av无码| 亚洲国产综合色| 国产女人18毛片18精品| 亚洲女人被黑人巨大进入al| 欧美人与禽性xxxxx杂性| 国产精品无码专区在线观看| 一道本一区二区三区| www.一区二区.com| 美女视频黄久久| 亚洲国产综合视频| 亚洲精品水蜜桃| 中文天堂在线资源| 日韩精品久久久久久久玫瑰园| 精产国品自在线www| 国产精品1区2区在线观看| 蜜桃一区av| 国产美女永久无遮挡| 国产精品一区二区男女羞羞无遮挡| 丰腴饱满的极品熟妇| 亚洲成av人综合在线观看| 亚洲av无码国产综合专区 | 国产福利免费在线观看| 97在线视频精品| 天堂网av成人| 免费观看美女裸体网站| 国产乱人伦偷精品视频不卡| 中文字幕av久久爽av| 91精品婷婷国产综合久久性色| 国产私拍精品| 欧美亚洲国产视频| 卡一精品卡二卡三网站乱码| 日本a在线天堂| 东方欧美亚洲色图在线| 国产主播在线观看| 欧美成人精品3d动漫h| 一区二区三区伦理| 成人久久18免费网站漫画| 牛夜精品久久久久久久99黑人| 999久久久精品视频| 《视频一区视频二区| 国产尤物在线观看| 日韩在线播放av| 国产精品99久久久久久董美香| 亚洲一区精品视频| 老司机精品视频一区二区三区| 91香蕉国产视频| 欧美一二三四在线| 污污的网站在线免费观看| 国产传媒一区二区| 国产精品一级| 亚洲码无人客一区二区三区| 欧洲色大大久久| 九色porny在线| 99porn视频在线| 亚洲精品偷拍| 国产高清一区二区三区四区| 欧美日韩国产色站一区二区三区| 日本成a人片在线观看| 99re在线视频观看| aa级大片欧美三级| 能免费看av的网站| 欧美一区二区三区四区久久 | 国内精品久久影院| av成人综合| 黄色一级大片在线观看| 国产精品网站在线播放| 国产精品九九九九| 97精品伊人久久久大香线蕉 | 亚洲一区二区在线看| 国产福利91精品| 亚洲欧美综合另类| 色小说视频一区| 九九热hot精品视频在线播放| 国产主播在线看| 中文字幕亚洲欧美在线不卡| 色欲av伊人久久大香线蕉影院| 热99精品里视频精品|