服务提供者

服务接口:

  1. public interface HelloService {
  2. public String sayHello(String name);
  3. }

服务实现类:

  1. public class HelloServiceImpl implements HelloService {
  2. @Override
  3. public String sayHello(String name) {
  4. return "hello:" + name;
  5. }
  6. }

服务注册:

  1. public class ProviderReflect {
  2. private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 1, TimeUnit.MINUTES, new LinkedBlockingDeque<Runnable>(1000), new MyThreadFactory("providerReflact"));
  3.  
  4. /**
  5. * 服务发布
  6. *
  7. * @param service
  8. * @param port
  9. */
  10. public static void provider(final Object service, int port) {
  11. ServerSocket serverSocket = null;
  12.  
  13. try {
  14. serverSocket = new ServerSocket(port);
  15. while (true) {
  16. Socket socket = serverSocket.accept();
  17. executor.execute(new Runnable() {
  18. @Override
  19. public void run() {
  20. ObjectOutputStream oos = null;
  21. ObjectInputStream ois = null;
  22. try {
  23. ois = new ObjectInputStream(socket.getInputStream());
  24.  
  25. // 请求调用的方法名
  26. String methodName = ois.readUTF();
  27. // 请求的参数
  28. Object[] args = (Object[]) ois.readObject();
  29.  
  30. oos = new ObjectOutputStream(socket.getOutputStream());
  31. Object result = MethodUtils.invokeExactMethod(service, methodName, args);
  32. System.out.println(result);
  33. // 写结果
  34. oos.writeObject(result);
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. } catch (InvocationTargetException e) {
  38. e.printStackTrace();
  39. } catch (NoSuchMethodException e) {
  40. e.printStackTrace();
  41. } catch (IllegalAccessException e) {
  42. e.printStackTrace();
  43. } catch (ClassNotFoundException e) {
  44. e.printStackTrace();
  45. } finally {
  46. if (oos != null) {
  47. try {
  48. oos.close();
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. if (ois != null) {
  54. try {
  55. ois.close();
  56. } catch (IOException e) {
  57. e.printStackTrace();
  58. }
  59. }
  60. }
  61. }
  62. });
  63. }
  64. } catch (IOException e) {
  65. e.printStackTrace();
  66. } finally {
  67. if (serverSocket != null) {
  68. try {
  69. serverSocket.close();
  70. } catch (IOException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74.  
  75. }
  76. }
  77.  
  78. static class MyThreadFactory implements ThreadFactory {
  79. /**
  80. * 线程池中的线程名称前缀
  81. */
  82. private String namePrefix;
  83.  
  84. /**
  85. * 原子的整型
  86. */
  87. private AtomicInteger atomicInteger = new AtomicInteger(1);
  88.  
  89. public MyThreadFactory(String whatFeaturOfGroup) {
  90. this.namePrefix = "From MyThreadFactory:" + whatFeaturOfGroup + "-worker-";
  91. }
  92.  
  93. @Override
  94. public Thread newThread(Runnable r) {
  95. String name = namePrefix + atomicInteger.getAndIncrement();
  96. Thread thread = new Thread(r, name);
  97. System.out.println(thread.getName());
  98. return thread;
  99. }
  100. }
  101.  
  102. /**
  103. * 发布服务
  104. *
  105. * @param args
  106. */
  107. public static void main(String[] args) {
  108. HelloService helloService = new HelloServiceImpl();
  109. ProviderReflect.provider(helloService, 8082);
  110. }
  111. }

pom.xml:

  1. <dependency>
  2. <groupId>org.apache.commons</groupId>
  3. <artifactId>commons-lang3</artifactId>
  4. <version>3.4</version>
  5. </dependency>

服务消费者

消费接口:

  1. public interface HelloService {
  2. public String sayHello(String name);
  3. }

接口的代理:

  1. public class ConsumerProxy {
  2. public static <T> T consume(final Class<?> serviceClass, final String host, final int port) {
  3. return (T) Proxy.newProxyInstance(serviceClass.getClassLoader(), new Class<?>[]{serviceClass}, new InvocationHandler() {
  4. @Override
  5. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  6. Socket socket = null;
  7. ObjectOutputStream output = null;
  8. ObjectInputStream input = null;
  9. try {
  10. socket = new Socket(host, port);
  11. output = new ObjectOutputStream(socket.getOutputStream());
  12. // output.writeUTF(serviceClass.getName());
  13. output.writeUTF(method.getName());
  14. // output.writeObject(method.getParameterTypes());
  15. output.writeObject(args);
  16. input = new ObjectInputStream(socket.getInputStream());
  17. return input.readObject();
  18. } finally {
  19. if (socket != null) {
  20. socket.close();
  21. }
  22. if (output != null) {
  23. output.close();
  24. }
  25. if (input != null) {
  26. input.close();
  27. }
  28. }
  29. }
  30. });
  31. }
  32.  
  33. public static void main(String[] args) {
  34. HelloService helloService = ConsumerProxy.consume(HelloService.class, "127.0.0.1", 8082);
  35. String response = helloService.sayHello("yangyongjie");
  36. System.out.println(response);
  37. }
  38. }

输出:

hello:yangyongjie

自实现RPC调用的更多相关文章

  1. 闲话RPC调用

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 自SOA架构理念提出以来,应用程序间如何以最低耦合度通信的问题便呈现在所有架构师面前. 互联网系统的复杂度让我们不 ...

  2. RabbitMQ学习笔记5-简单的RPC调用

    利用空的queue名字("")让rabbitMQ生成一个唯一的队列名称,同时指定队列是:临时的(auto-delete).私有的(exclusive). 在发送的RPC调用消息里设 ...

  3. Hadoop学习记录(3)|HDFS API 操作|RPC调用

    HDFS的API操作 URL方式访问 package hdfs; import java.io.IOException; import java.io.InputStream; import java ...

  4. 使用RPC 调用NameNode中的方法

    用户在Client 端是很难对 NameNode中的信息进行直接访问的, 所以 ,在Hadoop系统中为 Client端 提供了一系列的方法调用,这些方法调用是通过RPC 方法来实现的, 根据RPC ...

  5. Unity3D RPC调用顺序问题

    使用Unity自带的Network实现多人协同任务时,因为使用RPC传递消息.RPC即远程过程调用,对于它的使用,第一反应的问题就是如果连续两次调用RPC,RPC的函数会顺序执行吗?还是只要RPC的消 ...

  6. 给Pomelo的聊天室添加time的RPC调用

    为了练手,给聊天应用增加一个rpc调用和一个time类型的服务器,在servers/time/remote/timeRemote.js中,添加如下代码: module.exports.getCurre ...

  7. [svc]简单理解什么是rpc调用?跟restapi有何区别?

    什么是rpc调用 restapi调用方式是对数据的crud. 常见的我们写flash写个api,或者借助django drf写个标准的resetapi,一个url可以借助httpget post pu ...

  8. RPC调用与GC垃圾回收

    RPC调用 多个服务协同完成一次业务时,由于业务约束(如红包不符合使用条件.账户余额不足等).系统故障(如网络或系统超时或中断.数据库约束不满足等),都可能造成服务处理过程在任何一步无法继续,使数据处 ...

  9. rpc调用过程

    在openstack中,各个组件之间的调用遵循RESTful风格,而组件内部各服务之间的相互调用采用rpc远程调用,比如nova-conductor和nova-compute rpc原理: 首先了解什 ...

  10. 浅谈RPC调用

    RPC英文全称remote procedure call 翻译成中文的意思就是远程过程调用.RPC的出现其实主要是为了解决分布式系统间的通信透明性的问题. 那什么是分布式系统的通信透明性问题?这个问题 ...

随机推荐

  1. SSH 代码笔记

    os.path :https://www.cnblogs.com/wuxie1989/p/5623435.html .format():https://blog.csdn.net/i_chaoren/ ...

  2. bzoj4889: [Tjoi2017]不勤劳的图书管理员(树套树)

    传送门 据说正解线段树套平衡树 然而网上参考(抄)了一个树状数组套动态开点线段树的 思路比较清楚,看代码应该就明白了 //minamoto #include<iostream> #incl ...

  3. 剑指Offer的学习笔记(C#篇)-- 整数中1出现的次数(从1到n整数中1出现的次数)

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...

  4. 剑指Offer的学习笔记(C#篇)-- 矩形覆盖

    题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 一 . 解题思路 这个貌似就是普通的跳台阶问题. 二 . 代 ...

  5. mysql-5.5.56免安装版配置方法

    1. 下载mysql-5.5.56-winx64 网址:dev.mysql.com/downloads/mysql/ 2. 解压MySQL压缩包    将以下载的MySQL压缩包解压到自定义目录下,我 ...

  6. [WebShow系列] 比赛结果报表导出

    操作说明 现场管理员在 浏览器地址栏 输入[现场打分实时展示系统-Web版]的详情排行网址[注:相对网址 /home/rankdshow ] 调用 详情排行. 点击 详情排行榜主题 文字,可以把此排行 ...

  7. 常用的js工具函数

    JS选取DOM元素的方法注意:原生JS选取DOM元素比使用jQuery类库选取要快很多1.通过ID选取元素document.getElementById('myid');2.通过CLASS选取元素do ...

  8. Codeforces 185B(数学结论)

    要点 有不等式\(x^ay^bz^c=a^ab^bc^c(\frac{x}{a})^a(\frac{y}{b})^b(\frac{z}{c})^c<=a^ab^bc^c(\frac{x+y+z} ...

  9. GYM 101933D(最短路、二分、dp)

    要点 非要先来后到暗示多源最短路,求最小的最大值暗示二分 二分内部的check是关键,dp处理一下,\(dp[i]\)表示第\(i\)笔订单最早何时送达,如果在ddl之前到不了则\(return\ 0 ...

  10. Hive进阶_Hive数据的导入

    使用Load语句执行数据的导入 语法: load data [local] inpath 'filepath' [overwrite] into table tablename [partition ...