亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

RPC框架是啥之Java自帶RPC實(shí)現(xiàn),RMI框架入門

ZHAO_ / 2038人閱讀

摘要:讓我們優(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"));
    }

}

最后可以看看效果。


關(guān)于RMI的一些關(guān)鍵點(diǎn)

支持真正的面向?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)文章

  • RPC框架啥之Apache CXF一款WebService RPC框架入門教程

    摘要:支持相關(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...

    SolomonXie 評論0 收藏0
  • 后端必備——數(shù)據(jù)通信知識(shí)(RPC、消息隊(duì)列)一站式總結(jié)

    摘要:具體可以參考消息隊(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...

    Kahn 評論0 收藏0
  • Java 遠(yuǎn)程通訊技術(shù)及原理分析

    摘要:對于與而言,則可以看做是消息傳遞技術(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ì)上...

    rozbo 評論0 收藏0
  • 分布式服務(wù)框架之遠(yuǎn)程通訊技術(shù)及原理分析

    摘要:微軟的雖然引入了事件機(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)系呢,它們背后到底是基...

    sorra 評論0 收藏0
  • 分布式服務(wù)框架之遠(yuǎn)程通訊技術(shù)及原理分析

    摘要:微軟的雖然引入了事件機(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)系呢,它們背后到底是基...

    0xE7A38A 評論0 收藏0

發(fā)表評論

0條評論

ZHAO_

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<