自实现RPC调用
服务提供者
服务接口:
- public interface HelloService {
- public String sayHello(String name);
- }
服务实现类:
- public class HelloServiceImpl implements HelloService {
- @Override
- public String sayHello(String name) {
- return "hello:" + name;
- }
- }
服务注册:
- public class ProviderReflect {
- private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 1, TimeUnit.MINUTES, new LinkedBlockingDeque<Runnable>(1000), new MyThreadFactory("providerReflact"));
- /**
- * 服务发布
- *
- * @param service
- * @param port
- */
- public static void provider(final Object service, int port) {
- ServerSocket serverSocket = null;
- try {
- serverSocket = new ServerSocket(port);
- while (true) {
- Socket socket = serverSocket.accept();
- executor.execute(new Runnable() {
- @Override
- public void run() {
- ObjectOutputStream oos = null;
- ObjectInputStream ois = null;
- try {
- ois = new ObjectInputStream(socket.getInputStream());
- // 请求调用的方法名
- String methodName = ois.readUTF();
- // 请求的参数
- Object[] args = (Object[]) ois.readObject();
- oos = new ObjectOutputStream(socket.getOutputStream());
- Object result = MethodUtils.invokeExactMethod(service, methodName, args);
- System.out.println(result);
- // 写结果
- oos.writeObject(result);
- } catch (IOException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } finally {
- if (oos != null) {
- try {
- oos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (ois != null) {
- try {
- ois.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- });
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (serverSocket != null) {
- try {
- serverSocket.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- static class MyThreadFactory implements ThreadFactory {
- /**
- * 线程池中的线程名称前缀
- */
- private String namePrefix;
- /**
- * 原子的整型
- */
- private AtomicInteger atomicInteger = new AtomicInteger(1);
- public MyThreadFactory(String whatFeaturOfGroup) {
- this.namePrefix = "From MyThreadFactory:" + whatFeaturOfGroup + "-worker-";
- }
- @Override
- public Thread newThread(Runnable r) {
- String name = namePrefix + atomicInteger.getAndIncrement();
- Thread thread = new Thread(r, name);
- System.out.println(thread.getName());
- return thread;
- }
- }
- /**
- * 发布服务
- *
- * @param args
- */
- public static void main(String[] args) {
- HelloService helloService = new HelloServiceImpl();
- ProviderReflect.provider(helloService, 8082);
- }
- }
pom.xml:
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- <version>3.4</version>
- </dependency>
服务消费者
消费接口:
- public interface HelloService {
- public String sayHello(String name);
- }
接口的代理:
- public class ConsumerProxy {
- public static <T> T consume(final Class<?> serviceClass, final String host, final int port) {
- return (T) Proxy.newProxyInstance(serviceClass.getClassLoader(), new Class<?>[]{serviceClass}, new InvocationHandler() {
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- Socket socket = null;
- ObjectOutputStream output = null;
- ObjectInputStream input = null;
- try {
- socket = new Socket(host, port);
- output = new ObjectOutputStream(socket.getOutputStream());
- // output.writeUTF(serviceClass.getName());
- output.writeUTF(method.getName());
- // output.writeObject(method.getParameterTypes());
- output.writeObject(args);
- input = new ObjectInputStream(socket.getInputStream());
- return input.readObject();
- } finally {
- if (socket != null) {
- socket.close();
- }
- if (output != null) {
- output.close();
- }
- if (input != null) {
- input.close();
- }
- }
- }
- });
- }
- public static void main(String[] args) {
- HelloService helloService = ConsumerProxy.consume(HelloService.class, "127.0.0.1", 8082);
- String response = helloService.sayHello("yangyongjie");
- System.out.println(response);
- }
- }
输出:
hello:yangyongjie
自实现RPC调用的更多相关文章
- 闲话RPC调用
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 自SOA架构理念提出以来,应用程序间如何以最低耦合度通信的问题便呈现在所有架构师面前. 互联网系统的复杂度让我们不 ...
- RabbitMQ学习笔记5-简单的RPC调用
利用空的queue名字("")让rabbitMQ生成一个唯一的队列名称,同时指定队列是:临时的(auto-delete).私有的(exclusive). 在发送的RPC调用消息里设 ...
- Hadoop学习记录(3)|HDFS API 操作|RPC调用
HDFS的API操作 URL方式访问 package hdfs; import java.io.IOException; import java.io.InputStream; import java ...
- 使用RPC 调用NameNode中的方法
用户在Client 端是很难对 NameNode中的信息进行直接访问的, 所以 ,在Hadoop系统中为 Client端 提供了一系列的方法调用,这些方法调用是通过RPC 方法来实现的, 根据RPC ...
- Unity3D RPC调用顺序问题
使用Unity自带的Network实现多人协同任务时,因为使用RPC传递消息.RPC即远程过程调用,对于它的使用,第一反应的问题就是如果连续两次调用RPC,RPC的函数会顺序执行吗?还是只要RPC的消 ...
- 给Pomelo的聊天室添加time的RPC调用
为了练手,给聊天应用增加一个rpc调用和一个time类型的服务器,在servers/time/remote/timeRemote.js中,添加如下代码: module.exports.getCurre ...
- [svc]简单理解什么是rpc调用?跟restapi有何区别?
什么是rpc调用 restapi调用方式是对数据的crud. 常见的我们写flash写个api,或者借助django drf写个标准的resetapi,一个url可以借助httpget post pu ...
- RPC调用与GC垃圾回收
RPC调用 多个服务协同完成一次业务时,由于业务约束(如红包不符合使用条件.账户余额不足等).系统故障(如网络或系统超时或中断.数据库约束不满足等),都可能造成服务处理过程在任何一步无法继续,使数据处 ...
- rpc调用过程
在openstack中,各个组件之间的调用遵循RESTful风格,而组件内部各服务之间的相互调用采用rpc远程调用,比如nova-conductor和nova-compute rpc原理: 首先了解什 ...
- 浅谈RPC调用
RPC英文全称remote procedure call 翻译成中文的意思就是远程过程调用.RPC的出现其实主要是为了解决分布式系统间的通信透明性的问题. 那什么是分布式系统的通信透明性问题?这个问题 ...
随机推荐
- SSH 代码笔记
os.path :https://www.cnblogs.com/wuxie1989/p/5623435.html .format():https://blog.csdn.net/i_chaoren/ ...
- bzoj4889: [Tjoi2017]不勤劳的图书管理员(树套树)
传送门 据说正解线段树套平衡树 然而网上参考(抄)了一个树状数组套动态开点线段树的 思路比较清楚,看代码应该就明白了 //minamoto #include<iostream> #incl ...
- 剑指Offer的学习笔记(C#篇)-- 整数中1出现的次数(从1到n整数中1出现的次数)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 剑指Offer的学习笔记(C#篇)-- 矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 一 . 解题思路 这个貌似就是普通的跳台阶问题. 二 . 代 ...
- mysql-5.5.56免安装版配置方法
1. 下载mysql-5.5.56-winx64 网址:dev.mysql.com/downloads/mysql/ 2. 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下,我 ...
- [WebShow系列] 比赛结果报表导出
操作说明 现场管理员在 浏览器地址栏 输入[现场打分实时展示系统-Web版]的详情排行网址[注:相对网址 /home/rankdshow ] 调用 详情排行. 点击 详情排行榜主题 文字,可以把此排行 ...
- 常用的js工具函数
JS选取DOM元素的方法注意:原生JS选取DOM元素比使用jQuery类库选取要快很多1.通过ID选取元素document.getElementById('myid');2.通过CLASS选取元素do ...
- 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} ...
- GYM 101933D(最短路、二分、dp)
要点 非要先来后到暗示多源最短路,求最小的最大值暗示二分 二分内部的check是关键,dp处理一下,\(dp[i]\)表示第\(i\)笔订单最早何时送达,如果在ddl之前到不了则\(return\ 0 ...
- Hive进阶_Hive数据的导入
使用Load语句执行数据的导入 语法: load data [local] inpath 'filepath' [overwrite] into table tablename [partition ...