日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

从零手写RPC

發(fā)布時(shí)間:2024/9/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零手写RPC 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

RPC概述

RPC(Remote Proceduce Call 遠(yuǎn)程過程調(diào)用) 一般用來實(shí)現(xiàn)部署在不同機(jī)器上的系統(tǒng)之間的方法調(diào)用,使程序能夠像訪問本地系統(tǒng)資源一樣,通過網(wǎng)絡(luò)傳輸過去訪問遠(yuǎn)端系統(tǒng)資源。

RPC 調(diào)用過程

  • Client 客戶端調(diào)用方法實(shí)現(xiàn),負(fù)責(zé)發(fā)起RPC調(diào)用。
  • ClientStub/SereverStub 可以看作一個(gè)代理對(duì)象,屏蔽RPC調(diào)用過程中復(fù)雜的網(wǎng)絡(luò)處理邏輯,使RPC透明化,使得調(diào)用遠(yuǎn)程方法想調(diào)用本地方法一樣。
  • Server 服務(wù)端提供遠(yuǎn)程服務(wù)。
  • Stub 主要作用
    * 序列化:負(fù)責(zé)數(shù)據(jù)的序列化發(fā)序列化。
    * 網(wǎng)絡(luò)傳輸:數(shù)據(jù)發(fā)送與接收。

    注:ServerStub又叫Skeleton。

    RPC 實(shí)現(xiàn)

    1. 遠(yuǎn)程服務(wù)接口

    public interface IHello {public String sayHello(String info); }

    2. 遠(yuǎn)程服務(wù)接口實(shí)現(xiàn)類(Server)

    public class HelloService implements IHello {public String sayHello(String info) {String result = "hello : " + info;System.out.println(result);return result;} }

    提供服務(wù)實(shí)現(xiàn)的類。

    3.服務(wù)器代理實(shí)現(xiàn)(Skeleton)

    public class RpcProxyServer {private IHello hello = new HelloService();public void publisherServer(int port) {try (ServerSocket ss = new ServerSocket(port)) {while (true) {try (Socket socket = ss.accept()) {try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {String method = ois.readUTF();Object[] objs = (Object[]) ois.readObject();Class<?>[] types = new Class[objs.length];for (int i = 0; i < types.length; i++) {types[i] = objs[i].getClass();}Method m = HelloService.class.getMethod(method, types);Object obj = m.invoke(hello, objs);try (ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())) {oos.writeObject(obj);oos.flush();}}} catch (Exception e) {e.printStackTrace();}}} catch (Exception e) {e.printStackTrace();}} }
  • 構(gòu)建一個(gè)ServerSocket服務(wù)監(jiān)聽來自客戶端的請(qǐng)求。
  • 接收請(qǐng)求的數(shù)據(jù)。(方法名和參數(shù))
  • 根據(jù)請(qǐng)求的數(shù)據(jù)(方法名和參數(shù)),使用反射調(diào)用相應(yīng)的服務(wù)。
  • 輸出服務(wù)的響應(yīng)數(shù)據(jù)。
  • 4. RPC 客戶端代理實(shí)現(xiàn)(ClientStub)

    public class RpcProxyClient<T> {public T proxyClient(Class<T> clazz) {return (T) clazz.cast(Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {try (Socket socket = new Socket("localhost", 8000)) {try (ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())) {oos.writeUTF(method.getName());oos.writeObject(args);oos.flush();try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {return ois.readObject();}}}}}));} }
  • 構(gòu)建一個(gè)Socket,連接遠(yuǎn)程服務(wù)。
  • 向遠(yuǎn)程服務(wù)發(fā)送數(shù)據(jù)。(方法名和方法參數(shù))
  • 接收遠(yuǎn)程服務(wù)響應(yīng)的數(shù)據(jù)。
  • 5.服務(wù)端發(fā)布服務(wù)

    public class RpcServer {//發(fā)布服務(wù)public static void main(String[] args) {RpcProxyServer server = new RpcProxyServer();server.publisherServer(8000);} }

    6.客戶端調(diào)用(Client)

    public class RpcClient {// 調(diào)用服務(wù)public static void main(String[] args) {RpcProxyClient<HelloService> rpcClient = new RpcProxyClient<>();IHello hello = rpcClient.proxyClient(HelloService.class);String s = hello.sayHello("dd");System.out.println(s);} }

    想了解更多精彩內(nèi)容請(qǐng)關(guān)注我的公眾號(hào)

    本人簡(jiǎn)書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
    點(diǎn)擊這里快速進(jìn)入簡(jiǎn)書

    GIT地址:http://git.oschina.net/brucekankan/
    點(diǎn)擊這里快速進(jìn)入GIT

    總結(jié)

    以上是生活随笔為你收集整理的从零手写RPC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。