摘要:讓我們優先來實現一個的案例吧。為了防止被防火墻攔截,需要強制制定的通信端口,一般通過自定義一個類來實現。完美支持語言所獨有的特性,不支持其他語言。使用了原生序列化,所有序列化對象必須實現接口。
本博客 貓叔的博客,轉載請申明出處學習系列
RPC框架是啥?
Java自帶RPC實現,RMI框架入門首先RMI(Remote Method Invocation)是Java特有的一種RPC實現,它能夠使部署在不同主機上的Java對象進行通信與方法調用,它是一種基于Java的遠程方法調用技術。
讓我們優先來實現一個RMI的RPC案例吧。
項目源碼地址:RPC_Demo,記得是項目里面的comgithubrmi
1、首先我們需要為服務端創建一個接口方法,而且這個接口最好繼承Remote
package com.github.rmi.server; import java.rmi.Remote; import java.rmi.RemoteException; /** * Create by UncleCatMySelf in 21:03 2019420 0020 */ public interface MyService extends Remote { String say(String someOne)throws RemoteException; }
2、對于接口實現類,RMI接口方法定義必須顯式聲明拋出RemoteException異常,服務端方法實現必須繼承UnicastRemoteObject類,該類定義了服務調用與服務提供方對象實現,并建立一對一的連接。
package com.github.rmi.server; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; /** * Create by UncleCatMySelf in 21:05 2019420 0020 */ public class MyServiceImpl extends UnicastRemoteObject implements MyService { protected MyServiceImpl() throws RemoteException { } public String say(String someOne) throws RemoteException { return someOne + ",Welcome to Study!"; } }
3、這里我們還需要一個針對服務端的配置類,因為RMI的通信端口是隨機產生的,因此有可能會被防火墻攔截。為了防止被防火墻攔截,需要強制制定RMI的通信端口,一般通過自定義一個RMISocketFactory類來實現。
package com.github.rmi.config; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.rmi.server.RMISocketFactory; /** * Create by UncleCatMySelf in 21:15 2019420 0020 */ public class CustomerSocketFactory extends RMISocketFactory { public Socket createSocket(String host, int port) throws IOException { return new Socket(host, port); } public ServerSocket createServerSocket(int port) throws IOException { if (port == 0){ port = 8855; } System.out.println("RMI 通信端口 : " + port); return new ServerSocket(port); } }
4、好了,這時你可以寫出服務端的啟動代碼了。
package com.github.rmi.server; import com.github.rmi.config.CustomerSocketFactory; import java.rmi.Naming; import java.rmi.registry.LocateRegistry; import java.rmi.server.RMISocketFactory; /** * Create by UncleCatMySelf in 21:07 2019420 0020 */ public class ServerMain { public static void main(String[] args) throws Exception { //注冊服務 LocateRegistry.createRegistry(8866); //指定通信端口,防止被防火墻攔截 RMISocketFactory.setSocketFactory(new CustomerSocketFactory()); //創建服務 MyService myService = new MyServiceImpl(); Naming.bind("rmi://localhost:8866/myService",myService); System.out.println("RMI 服務端啟動正常"); } }
5、客戶端的啟動就相對比較簡單,我們僅需要進入服務,并調用對應的遠程方法即可。
package com.github.rmi.client; import com.github.rmi.server.MyService; import java.rmi.Naming; /** * Create by UncleCatMySelf in 21:10 2019420 0020 */ public class ClientMain { public static void main(String[] args) throws Exception { //服務引入 MyService myService = (MyService) Naming.lookup("rmi://localhost:8866/myService"); //調用遠程方法 System.out.println("RMI 服務端調用返回:" + myService.say("MySelf")); } }
最后可以看看效果。
支持真正的面向對象的多態性,這是RMI的優勢。
完美支持Java語言所獨有的特性,不支持其他語言。
使用了Java原生序列化,所有序列化對象必須實現java.io.Serializablie接口。
底層通信是BIO(同步阻塞I/O)實現的Socket
由于BIO與原生序列化存在的性能問題,導致RMI的性能較差,如果你的項目性能要求較高,可能并不合適哦!
公眾號:Java貓說學習交流群:728698035
現架構設計(碼農)兼創業技術顧問,不羈平庸,熱愛開源,雜談程序人生與不定期干貨。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74225.html
摘要:支持相關規范和標準,包括同上。支持多種傳輸協議和協議綁定數據綁定。構建端還有其服務實現,接口使用注解,標明是一個遠程服務接口。然后編寫一個的啟動程序,并運行,我想你會成功的因為我看到了下圖是一種跨平臺的技術協議。 本博客 貓叔的博客,轉載請申明出處 學習系列 RPC框架是啥? RPC框架是啥之Java自帶RPC實現,RMI框架入門 Apache CXF一款WebService RP...
摘要:具體可以參考消息隊列之具體可以參考實戰之快速入門十分鐘入門阿里中間件團隊博客是一個分布式的可分區的可復制的基于發布訂閱的消息系統主要用于大數據領域當然在分布式系統中也有應用。目前市面上流行的消息隊列就是阿里借鑒的原理用開發而得。 我自己總結的Java學習的系統知識點以及面試問題,目前已經開源,會一直完善下去,歡迎建議和指導歡迎Star: https://github.com/Snail...
摘要:對于與而言,則可以看做是消息傳遞技術的一種衍生或封裝。在生產者通知消費者時,傳遞的往往是消息或事件,而非生產者自身。通過消息路由,我們可以配置路由規則指定消息傳遞的路徑,以及指定具體的消費者消費對應的生產者。采用和來進行遠程對象的通訊。 消息模式 歸根結底,企業應用系統就是對數據的處理,而對于一個擁有多個子系統的企業應用系統而言,它的基礎支撐無疑就是對消息的處理。與對象不同,消息本質上...
摘要:微軟的雖然引入了事件機制,可以在隊列收到消息時觸發事件,通知訂閱者。由微軟作為主要貢獻者的,則對以及做了進一層包裝,并能夠很好地實現這一模式。 在分布式服務框架中,一個最基礎的問題就是遠程服務是怎么通訊的,在Java領域中有很多可實現遠程通訊的技術,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關系呢,它們背后到底是基...
摘要:微軟的雖然引入了事件機制,可以在隊列收到消息時觸發事件,通知訂閱者。由微軟作為主要貢獻者的,則對以及做了進一層包裝,并能夠很好地實現這一模式。 在分布式服務框架中,一個最基礎的問題就是遠程服務是怎么通訊的,在Java領域中有很多可實現遠程通訊的技術,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關系呢,它們背后到底是基...
閱讀 1433·2021-09-03 10:29
閱讀 3457·2019-08-29 16:24
閱讀 2010·2019-08-29 11:03
閱讀 1409·2019-08-26 13:52
閱讀 2924·2019-08-26 11:36
閱讀 2785·2019-08-23 17:19
閱讀 559·2019-08-23 17:14
閱讀 811·2019-08-23 13:59