摘要:讓我們優(yōu)先來實(shí)現(xiàn)一個(gè)的案例吧。為了防止被防火墻攔截,需要強(qiáng)制制定的通信端口,一般通過自定義一個(gè)類來實(shí)現(xiàn)。完美支持語言所獨(dú)有的特性,不支持其他語言。使用了原生序列化,所有序列化對象必須實(shí)現(xiàn)接口。
本博客 貓叔的博客,轉(zhuǎn)載請申明出處學(xué)習(xí)系列
RPC框架是啥?
Java自帶RPC實(shí)現(xiàn),RMI框架入門首先RMI(Remote Method Invocation)是Java特有的一種RPC實(shí)現(xiàn),它能夠使部署在不同主機(jī)上的Java對象進(jìn)行通信與方法調(diào)用,它是一種基于Java的遠(yuǎn)程方法調(diào)用技術(shù)。
讓我們優(yōu)先來實(shí)現(xiàn)一個(gè)RMI的RPC案例吧。
項(xiàng)目源碼地址:RPC_Demo,記得是項(xiàng)目里面的comgithubrmi
1、首先我們需要為服務(wù)端創(chuàng)建一個(gè)接口方法,而且這個(gè)接口最好繼承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、對于接口實(shí)現(xiàn)類,RMI接口方法定義必須顯式聲明拋出RemoteException異常,服務(wù)端方法實(shí)現(xiàn)必須繼承UnicastRemoteObject類,該類定義了服務(wù)調(diào)用與服務(wù)提供方對象實(shí)現(xiàn),并建立一對一的連接。
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、這里我們還需要一個(gè)針對服務(wù)端的配置類,因?yàn)镽MI的通信端口是隨機(jī)產(chǎn)生的,因此有可能會(huì)被防火墻攔截。為了防止被防火墻攔截,需要強(qiáng)制制定RMI的通信端口,一般通過自定義一個(gè)RMISocketFactory類來實(shí)現(xiàn)。
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、好了,這時(shí)你可以寫出服務(wù)端的啟動(dòng)代碼了。
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 { //注冊服務(wù) LocateRegistry.createRegistry(8866); //指定通信端口,防止被防火墻攔截 RMISocketFactory.setSocketFactory(new CustomerSocketFactory()); //創(chuàng)建服務(wù) MyService myService = new MyServiceImpl(); Naming.bind("rmi://localhost:8866/myService",myService); System.out.println("RMI 服務(wù)端啟動(dòng)正常"); } }
5、客戶端的啟動(dòng)就相對比較簡單,我們僅需要進(jìn)入服務(wù),并調(diào)用對應(yīng)的遠(yuǎn)程方法即可。
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 { //服務(wù)引入 MyService myService = (MyService) Naming.lookup("rmi://localhost:8866/myService"); //調(diào)用遠(yuǎn)程方法 System.out.println("RMI 服務(wù)端調(diào)用返回:" + myService.say("MySelf")); } }
最后可以看看效果。
支持真正的面向?qū)ο蟮亩鄳B(tài)性,這是RMI的優(yōu)勢。
完美支持Java語言所獨(dú)有的特性,不支持其他語言。
使用了Java原生序列化,所有序列化對象必須實(shí)現(xiàn)java.io.Serializablie接口。
底層通信是BIO(同步阻塞I/O)實(shí)現(xiàn)的Socket
由于BIO與原生序列化存在的性能問題,導(dǎo)致RMI的性能較差,如果你的項(xiàng)目性能要求較高,可能并不合適哦!
公眾號(hào):Java貓說學(xué)習(xí)交流群:728698035
現(xiàn)架構(gòu)設(shè)計(jì)(碼農(nóng))兼創(chuàng)業(yè)技術(shù)顧問,不羈平庸,熱愛開源,雜談程序人生與不定期干貨。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/74225.html
摘要:支持相關(guān)規(guī)范和標(biāo)準(zhǔn),包括同上。支持多種傳輸協(xié)議和協(xié)議綁定數(shù)據(jù)綁定。構(gòu)建端還有其服務(wù)實(shí)現(xiàn),接口使用注解,標(biāo)明是一個(gè)遠(yuǎn)程服務(wù)接口。然后編寫一個(gè)的啟動(dòng)程序,并運(yùn)行,我想你會(huì)成功的因?yàn)槲铱吹搅讼聢D是一種跨平臺(tái)的技術(shù)協(xié)議。 本博客 貓叔的博客,轉(zhuǎn)載請申明出處 學(xué)習(xí)系列 RPC框架是啥? RPC框架是啥之Java自帶RPC實(shí)現(xiàn),RMI框架入門 Apache CXF一款WebService RP...
摘要:具體可以參考消息隊(duì)列之具體可以參考實(shí)戰(zhàn)之快速入門十分鐘入門阿里中間件團(tuán)隊(duì)博客是一個(gè)分布式的可分區(qū)的可復(fù)制的基于發(fā)布訂閱的消息系統(tǒng)主要用于大數(shù)據(jù)領(lǐng)域當(dāng)然在分布式系統(tǒng)中也有應(yīng)用。目前市面上流行的消息隊(duì)列就是阿里借鑒的原理用開發(fā)而得。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問題,目前已經(jīng)開源,會(huì)一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snail...
摘要:對于與而言,則可以看做是消息傳遞技術(shù)的一種衍生或封裝。在生產(chǎn)者通知消費(fèi)者時(shí),傳遞的往往是消息或事件,而非生產(chǎn)者自身。通過消息路由,我們可以配置路由規(guī)則指定消息傳遞的路徑,以及指定具體的消費(fèi)者消費(fèi)對應(yīng)的生產(chǎn)者。采用和來進(jìn)行遠(yuǎn)程對象的通訊。 消息模式 歸根結(jié)底,企業(yè)應(yīng)用系統(tǒng)就是對數(shù)據(jù)的處理,而對于一個(gè)擁有多個(gè)子系統(tǒng)的企業(yè)應(yīng)用系統(tǒng)而言,它的基礎(chǔ)支撐無疑就是對消息的處理。與對象不同,消息本質(zhì)上...
摘要:微軟的雖然引入了事件機(jī)制,可以在隊(duì)列收到消息時(shí)觸發(fā)事件,通知訂閱者。由微軟作為主要貢獻(xiàn)者的,則對以及做了進(jìn)一層包裝,并能夠很好地實(shí)現(xiàn)這一模式。 在分布式服務(wù)框架中,一個(gè)最基礎(chǔ)的問題就是遠(yuǎn)程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關(guān)系呢,它們背后到底是基...
摘要:微軟的雖然引入了事件機(jī)制,可以在隊(duì)列收到消息時(shí)觸發(fā)事件,通知訂閱者。由微軟作為主要貢獻(xiàn)者的,則對以及做了進(jìn)一層包裝,并能夠很好地實(shí)現(xiàn)這一模式。 在分布式服務(wù)框架中,一個(gè)最基礎(chǔ)的問題就是遠(yuǎn)程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關(guān)系呢,它們背后到底是基...
閱讀 1498·2021-09-03 10:29
閱讀 3522·2019-08-29 16:24
閱讀 2190·2019-08-29 11:03
閱讀 1496·2019-08-26 13:52
閱讀 3006·2019-08-26 11:36
閱讀 2860·2019-08-23 17:19
閱讀 614·2019-08-23 17:14
閱讀 867·2019-08-23 13:59