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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RPC框架几行代码就够了

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RPC框架几行代码就够了 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉于作者梁飛在公司的Blog:?
http://pt.alibaba-inc.com/wp/experience_1330/simple-rpc-framework.html ?

因為要給百技上實訓課,讓新同學們自行實現一個簡易RPC框架,在準備PPT時,就想寫個示例,發現原來一個RPC框架只要一個類,10來分鐘就可以寫完了,雖然簡陋,也曬曬:?

Java代碼??
  • /*?
  • ?*?Copyright?2011?Alibaba.com?All?right?reserved.?This?software?is?the?
  • ?*?confidential?and?proprietary?information?of?Alibaba.com?("Confidential?
  • ?*?Information").?You?shall?not?disclose?such?Confidential?Information?and?shall?
  • ?*?use?it?only?in?accordance?with?the?terms?of?the?license?agreement?you?entered?
  • ?*?into?with?Alibaba.com.?
  • ?*/??
  • package?com.alibaba.study.rpc.framework;??
  • ??
  • import?java.io.ObjectInputStream;??
  • import?java.io.ObjectOutputStream;??
  • import?java.lang.reflect.InvocationHandler;??
  • import?java.lang.reflect.Method;??
  • import?java.lang.reflect.Proxy;??
  • import?java.net.ServerSocket;??
  • import?java.net.Socket;??
  • ??
  • /**?
  • ?*?RpcFramework?
  • ?*??
  • ?*?@author?william.liangf?
  • ?*/??
  • public?class?RpcFramework?{??
  • ??
  • ????/**?
  • ?????*?暴露服務?
  • ?????*??
  • ?????*?@param?service?服務實現?
  • ?????*?@param?port?服務端口?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?static?void?export(final?Object?service,?int?port)?throws?Exception?{??
  • ????????if?(service?==?null)??
  • ????????????throw?new?IllegalArgumentException("service?instance?==?null");??
  • ????????if?(port?<=?0?||?port?>?65535)??
  • ????????????throw?new?IllegalArgumentException("Invalid?port?"?+?port);??
  • ????????System.out.println("Export?service?"?+?service.getClass().getName()?+?"?on?port?"?+?port);??
  • ????????ServerSocket?server?=?new?ServerSocket(port);??
  • ????????for(;;)?{??
  • ????????????try?{??
  • ????????????????final?Socket?socket?=?server.accept();??
  • ????????????????new?Thread(new?Runnable()?{??
  • ????????????????????@Override??
  • ????????????????????public?void?run()?{??
  • ????????????????????????try?{??
  • ????????????????????????????try?{??
  • ????????????????????????????????ObjectInputStream?input?=?new?ObjectInputStream(socket.getInputStream());??
  • ????????????????????????????????try?{??
  • ????????????????????????????????????String?methodName?=?input.readUTF();??
  • ????????????????????????????????????Class<?>[]?parameterTypes?=?(Class<?>[])input.readObject();??
  • ????????????????????????????????????Object[]?arguments?=?(Object[])input.readObject();??
  • ????????????????????????????????????ObjectOutputStream?output?=?new?ObjectOutputStream(socket.getOutputStream());??
  • ????????????????????????????????????try?{??
  • ????????????????????????????????????????Method?method?=?service.getClass().getMethod(methodName,?parameterTypes);??
  • ????????????????????????????????????????Object?result?=?method.invoke(service,?arguments);??
  • ????????????????????????????????????????output.writeObject(result);??
  • ????????????????????????????????????}?catch?(Throwable?t)?{??
  • ????????????????????????????????????????output.writeObject(t);??
  • ????????????????????????????????????}?finally?{??
  • ????????????????????????????????????????output.close();??
  • ????????????????????????????????????}??
  • ????????????????????????????????}?finally?{??
  • ????????????????????????????????????input.close();??
  • ????????????????????????????????}??
  • ????????????????????????????}?finally?{??
  • ????????????????????????????????socket.close();??
  • ????????????????????????????}??
  • ????????????????????????}?catch?(Exception?e)?{??
  • ????????????????????????????e.printStackTrace();??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????}).start();??
  • ????????????}?catch?(Exception?e)?{??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?引用服務?
  • ?????*??
  • ?????*?@param?<T>?接口泛型?
  • ?????*?@param?interfaceClass?接口類型?
  • ?????*?@param?host?服務器主機名?
  • ?????*?@param?port?服務器端口?
  • ?????*?@return?遠程服務?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????@SuppressWarnings("unchecked")??
  • ????public?static?<T>?T?refer(final?Class<T>?interfaceClass,?final?String?host,?final?int?port)?throws?Exception?{??
  • ????????if?(interfaceClass?==?null)??
  • ????????????throw?new?IllegalArgumentException("Interface?class?==?null");??
  • ????????if?(!?interfaceClass.isInterface())??
  • ????????????throw?new?IllegalArgumentException("The?"?+?interfaceClass.getName()?+?"?must?be?interface?class!");??
  • ????????if?(host?==?null?||?host.length()?==?0)??
  • ????????????throw?new?IllegalArgumentException("Host?==?null!");??
  • ????????if?(port?<=?0?||?port?>?65535)??
  • ????????????throw?new?IllegalArgumentException("Invalid?port?"?+?port);??
  • ????????System.out.println("Get?remote?service?"?+?interfaceClass.getName()?+?"?from?server?"?+?host?+?":"?+?port);??
  • ????????return?(T)?Proxy.newProxyInstance(interfaceClass.getClassLoader(),?new?Class<?>[]?{interfaceClass},?new?InvocationHandler()?{??
  • ????????????public?Object?invoke(Object?proxy,?Method?method,?Object[]?arguments)?throws?Throwable?{??
  • ????????????????Socket?socket?=?new?Socket(host,?port);??
  • ????????????????try?{??
  • ????????????????????ObjectOutputStream?output?=?new?ObjectOutputStream(socket.getOutputStream());??
  • ????????????????????try?{??
  • ????????????????????????output.writeUTF(method.getName());??
  • ????????????????????????output.writeObject(method.getParameterTypes());??
  • ????????????????????????output.writeObject(arguments);??
  • ????????????????????????ObjectInputStream?input?=?new?ObjectInputStream(socket.getInputStream());??
  • ????????????????????????try?{??
  • ????????????????????????????Object?result?=?input.readObject();??
  • ????????????????????????????if?(result?instanceof?Throwable)?{??
  • ????????????????????????????????throw?(Throwable)?result;??
  • ????????????????????????????}??
  • ????????????????????????????return?result;??
  • ????????????????????????}?finally?{??
  • ????????????????????????????input.close();??
  • ????????????????????????}??
  • ????????????????????}?finally?{??
  • ????????????????????????output.close();??
  • ????????????????????}??
  • ????????????????}?finally?{??
  • ????????????????????socket.close();??
  • ????????????????}??
  • ????????????}??
  • ????????});??
  • ????}??
  • ??
  • }??


  • 用起來也像模像樣:?

    (1) 定義服務接口 ?
    Java代碼??
  • /*?
  • ?*?Copyright?2011?Alibaba.com?All?right?reserved.?This?software?is?the?
  • ?*?confidential?and?proprietary?information?of?Alibaba.com?("Confidential?
  • ?*?Information").?You?shall?not?disclose?such?Confidential?Information?and?shall?
  • ?*?use?it?only?in?accordance?with?the?terms?of?the?license?agreement?you?entered?
  • ?*?into?with?Alibaba.com.?
  • ?*/??
  • package?com.alibaba.study.rpc.test;??
  • ??
  • /**?
  • ?*?HelloService?
  • ?*??
  • ?*?@author?william.liangf?
  • ?*/??
  • public?interface?HelloService?{??
  • ??
  • ????String?hello(String?name);??
  • ??
  • }??


  • (2) 實現服務 ?
    Java代碼??
  • /*?
  • ?*?Copyright?2011?Alibaba.com?All?right?reserved.?This?software?is?the?
  • ?*?confidential?and?proprietary?information?of?Alibaba.com?("Confidential?
  • ?*?Information").?You?shall?not?disclose?such?Confidential?Information?and?shall?
  • ?*?use?it?only?in?accordance?with?the?terms?of?the?license?agreement?you?entered?
  • ?*?into?with?Alibaba.com.?
  • ?*/??
  • package?com.alibaba.study.rpc.test;??
  • ??
  • /**?
  • ?*?HelloServiceImpl?
  • ?*??
  • ?*?@author?william.liangf?
  • ?*/??
  • public?class?HelloServiceImpl?implements?HelloService?{??
  • ??
  • ????public?String?hello(String?name)?{??
  • ????????return?"Hello?"?+?name;??
  • ????}??
  • ??
  • }??


  • (3) 暴露服務 ?
    Java代碼??
  • /*?
  • ?*?Copyright?2011?Alibaba.com?All?right?reserved.?This?software?is?the?
  • ?*?confidential?and?proprietary?information?of?Alibaba.com?("Confidential?
  • ?*?Information").?You?shall?not?disclose?such?Confidential?Information?and?shall?
  • ?*?use?it?only?in?accordance?with?the?terms?of?the?license?agreement?you?entered?
  • ?*?into?with?Alibaba.com.?
  • ?*/??
  • package?com.alibaba.study.rpc.test;??
  • ??
  • import?com.alibaba.study.rpc.framework.RpcFramework;??
  • ??
  • /**?
  • ?*?RpcProvider?
  • ?*??
  • ?*?@author?william.liangf?
  • ?*/??
  • public?class?RpcProvider?{??
  • ??
  • ????public?static?void?main(String[]?args)?throws?Exception?{??
  • ????????HelloService?service?=?new?HelloServiceImpl();??
  • ????????RpcFramework.export(service,?1234);??
  • ????}??
  • ??
  • }??


  • (4) 引用服務 ?
    Java代碼??
  • /*?
  • ?*?Copyright?2011?Alibaba.com?All?right?reserved.?This?software?is?the?
  • ?*?confidential?and?proprietary?information?of?Alibaba.com?("Confidential?
  • ?*?Information").?You?shall?not?disclose?such?Confidential?Information?and?shall?
  • ?*?use?it?only?in?accordance?with?the?terms?of?the?license?agreement?you?entered?
  • ?*?into?with?Alibaba.com.?
  • ?*/??
  • package?com.alibaba.study.rpc.test;??
  • ??
  • import?com.alibaba.study.rpc.framework.RpcFramework;??
  • ??
  • /**?
  • ?*?RpcConsumer?
  • ?*??
  • ?*?@author?william.liangf?
  • ?*/??
  • public?class?RpcConsumer?{??
  • ??????
  • ????public?static?void?main(String[]?args)?throws?Exception?{??
  • ????????HelloService?service?=?RpcFramework.refer(HelloService.class,?"127.0.0.1",?1234);??
  • ????????for?(int?i?=?0;?i?<?Integer.MAX_VALUE;?i?++)?{??
  • ????????????String?hello?=?service.hello("World"?+?i);??
  • ????????????System.out.println(hello);??
  • ????????????Thread.sleep(1000);??
  • ????????}??
  • ????}??
  • ??????
  • }

  • from:?http://javatar.iteye.com/blog/1123915

    總結

    以上是生活随笔為你收集整理的RPC框架几行代码就够了的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。