微服务项目通信方法很多,有像springcloud解决方案的http通信,还有像阿里Dubbo的RPC通信,这里简单实现RPC调用。一共2个端,客户端server和客户端client.项目demo很简单,就不多讲了,看代码好了。

下面是服务端的demo,直接main函数启动。

package com.alvis.rpcserverdemo.server;/*** @author ALvis* @ctreate 2020/1/3*/import java.io.IOException;/*** RPC--服务端基本方法*/
public interface Server {/*** Socket 端口*/int PORT = 8111;/*** 启动服务端*/void start() throws IOException;/*** 停止服务端*/void stop();/*** 服务注册* @param serviceInterface  -- 对外暴露服务接口* @param impl  --  内部实现类*/void regist(Class<? extends IRpcService> serviceInterface, Class<? extends IRpcService> impl);
}
package com.alvis.rpcserverdemo.server;import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** @author ALvis* @ctreate 2020/1/3*/
public class ServerCenter implements Server {/*** 线程池 接收客户端调用*/private static ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 20, 200, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));/*** 服务注册缓存*/private static final HashMap<String, Class<?>> serviceRegistry = new HashMap<String, Class<?>>();/*** 启动服务*/@Overridepublic void start() throws IOException {ServerSocket server = new ServerSocket();server.bind(new InetSocketAddress(PORT));try {for (;;) {executor.execute(new ServiceTask(server.accept()));}} finally {server.close();}}/*** 停止服务*/@Overridepublic void stop() {executor.shutdown();}/*** 注册服务*/@Overridepublic void regist(Class<? extends IRpcService> serviceInterface, Class<? extends IRpcService> impl) {serviceRegistry.put(serviceInterface.getName(), impl);}/***服务具体调度--对象流反序列化,反射调用本地服务,并输出结果到客户端*/private static class ServiceTask implements Runnable {Socket clent = null;public ServiceTask(Socket client) {this.clent = client;}@Overridepublic void run() {ObjectInputStream input = null;ObjectOutputStream output = null;try {input = new ObjectInputStream(clent.getInputStream());String serviceName = input.readUTF();String methodName = input.readUTF();Class<?>[] parameterTypes = (Class<?>[]) input.readObject();Object[] arguments = (Object[]) input.readObject();Class<?> serviceClass = serviceRegistry.get(serviceName);if (serviceClass == null) {throw new ClassNotFoundException(serviceName + " not found");}Method method = serviceClass.getMethod(methodName, parameterTypes);Object result = method.invoke(serviceClass.newInstance(), arguments);// 3.将执行结果反序列化,通过socket发送给客户端output = new ObjectOutputStream(clent.getOutputStream());output.writeObject(result);} catch (Exception e) {e.printStackTrace();} finally {if (output != null) {try {output.close();} catch (IOException e) {e.printStackTrace();}}if (input != null) {try {input.close();} catch (IOException e) {e.printStackTrace();}}if (clent != null) {try {clent.close();} catch (IOException e) {e.printStackTrace();}}}}}}
package com.alvis.rpcserverdemo.server;/*** @author ALvis* @ctreate 2020/1/3*/
public interface IRpcService {
}
package com.alvis.rpcserverdemo.server;/*** @author ALvis* @ctreate 2020/1/3*/
public interface IHelloService extends IRpcService{String sayHi(String name, String msg);
}
package com.alvis.rpcserverdemo.server;/*** @author ALvis* @ctreate 2020/1/3*/
public class HelloServiceImpl implements IHelloService {private static final long serialVersionUID = 1L;@Overridepublic String sayHi(String name, String msg) {System.out.println(name+"调用");return new StringBuffer().append("hi~! ").append(name).append(",").append(msg).toString();}}
package com.alvis.rpcserverdemo.server;import java.io.IOException;/*** @author ALvis* @ctreate 2020/1/3*/
public class ServerTest {public static void main(String[] args) throws IOException {System.out.println("服务启动1");ServerCenter s = new ServerCenter();System.out.println("服务启动2");s.regist(IHelloService.class, HelloServiceImpl.class);System.out.println("服务启动3");s.start();System.out.println("服务关闭");}
}

下面是客户端,也是main函数启动

package com.alvis.rpcserverdemo.server;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.InetSocketAddress;
import java.net.Socket;/*** @author ALvis* @ctreate 2020/1/3*/
public class Client {/*** 客户端代理获取远程服务对象* @param serviceInterface* @param addr* @return*/@SuppressWarnings("unchecked")public static <T extends IRpcService> T getRemoteProxyObj(final Class<? extends IRpcService> serviceInterface, final InetSocketAddress addr){return (T) Proxy.newProxyInstance(serviceInterface.getClassLoader(), new Class<?>[]{serviceInterface}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Socket socket = null;ObjectOutputStream output = null;ObjectInputStream input = null;try {// 1.创建Socket客户端,根据指定地址连接远程服务提供者socket = new Socket();socket.connect(addr);// 2.将远程服务调用所需的接口类、方法名、参数列表等编码后发送给服务提供者output = new ObjectOutputStream(socket.getOutputStream());output.writeUTF(serviceInterface.getName());output.writeUTF(method.getName());output.writeObject(method.getParameterTypes());output.writeObject(args);// 3.同步阻塞等待服务器返回应答,获取应答后返回input = new ObjectInputStream(socket.getInputStream());return input.readObject();} finally {if (socket != null) socket.close();if (output != null) output.close();if (input != null) input.close();}}});}
}
package com.alvis.rpcserverdemo.server;/*** @author ALvis* @ctreate 2020/1/3*/
public interface IRpcService {
}
package com.alvis.rpcserverdemo.server;/*** @author ALvis* @ctreate 2020/1/3*/
public interface IHelloService extends IRpcService{String sayHi(String name, String msg);
}
package com.alvis.rpcserverdemo.server;import java.io.IOException;
import java.net.InetSocketAddress;/*** @author ALvis* @ctreate 2020/1/3*/
public class RpcTest {public static void main(String[] args) throws IOException {IHelloService service = Client.getRemoteProxyObj(IHelloService.class, new InetSocketAddress("localhost", 8111));System.out.println(service.sayHi("alvis", "hello 新年好!"));}
}

项目通信之RPC调用——java简单实现相关推荐

  1. RPC调用链通信方法

    RPC调用链可以将远程过程调用变成一个有效的堆栈. 当我们编写应用程序时,我们中的许多人认为REST是服务间通信的一个通用标准.然而,还有许多其他形式的通信,RPC就是其中之一.值得注意的是,通信方式 ...

  2. 在php中调用java的方法

    跨平台,跨语言的项目现在已经屡见不鲜,今天就说一说之前做过项目中,php调用java的方法: 无论是在linux远程服务器上,还是在windows下,最简单有效的方法,应该属于javabridge.j ...

  3. 深入剖析通信层和RPC调用的异步化(上)

    <Netty 进阶之路>.<分布式服务框架原理与实践>作者李林锋深入剖析通信层和 RPC 调用的异步化.李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的 ...

  4. CORBA 简单了解和JAVA与C++互操以及C++调用Java web service

    CORBA了解 CORBA(Common Object Request Broker Architecture, 公共对象请求代理体系结构)是由OMG(对象管理组织,Object Management ...

  5. java简单的增删改查项目 ATM机

    java简单的增删改查项目 login: package atm;import java.util.ArrayList; import java.util.List; import java.util ...

  6. 使用Dubbo实现简单的RPC调用(Spring配置文件版)

    更多文章和资源欢迎访问:SuperCoder Blog 文章目录 更多文章和资源欢迎访问:[SuperCoder Blog](https://supercoder.com.cn) 前言 一.Dubbo ...

  7. 【开发心得】java轻量级rpc调用,springBoot集成jsonrpc4j使用

    最近博主在项目中,遇到了java对接jsonrpc的需求,稍微折腾了下,特整理一份笔记.本文主要记录的是jsonrpc4j (github地址:GitHub - briandilley/jsonrpc ...

  8. 用java简单写一个信息管理系统(尚硅谷项目二)

    1.项目要求 模拟实现基于文本界面的<客户信息管理软件>. 该软件能够实现对客户对象的插入.修改和删除(用数组实现),并能够打印客户明细表 2.将项目抽象为几个类 我们可以先将项目抽离为几 ...

  9. Java之 Spring Cloud 微服务的 SpringCloud Config 配置中心(第四个阶段)【二】【SpringBoot项目实现商品服务器端调用】

    SpringCloud学习目录点击跳转对应的文章 Java之 Spring Cloud 微服务搭建(第一个阶段)[一][SpringBoot项目实现商品服务器端是调用] Java之 Spring Cl ...

最新文章

  1. django使用ckeditor富文本编辑器-转
  2. 【转:SAP PS】 创建项目Project
  3. centos系统中mysql密码_CentOS系统下强行重新修改MySQL密码
  4. maven 版本号插件_测试Maven版本插件自动递增版本号
  5. [java] 找出字符串中出现最多的字符和出现的次数
  6. linux box 黑屏,在linux16.04上安装virturalbox的时候出现问题
  7. 搭建 Harbor 1.10.6 高可用集群
  8. C++基础教程之函数
  9. MySQL存储过程(五)——存储过程查看、删除和修改
  10. printk与日志优先级设置
  11. 前端下载音频的两种处理方式
  12. 刘润老师的5分钟商学院营销案例~比例偏见!
  13. 五子棋项目结束总结_五子棋比赛总结报告
  14. win10 锁屏界面自动更换壁纸的办法,亲测有效
  15. 怎样调整计算机视角,电脑调节不了CAD极轴角度怎样解决|电脑中调节CAD极轴角度的方法...
  16. return true
  17. Android 横竖屏切换
  18. tomcat服务器连接数问题解决
  19. telnet不是内部或外部命令怎么办
  20. 现在学校应用较多的计算机学籍管理系统,计算机基础知识选择题500个

热门文章

  1. 浮点型变量和字符型变量
  2. Java Agent介绍及其使用
  3. Spark SQL 核心编程
  4. 以我对你的了解,我反对你来互联网工作
  5. Mybatis常用的注解
  6. 基于Python编程语言实现应用程序定时任务
  7. delphi fmx android 屏幕分辨率
  8. Android 补间动画原理
  9. 【内存】关于内存的一些名词解释
  10. 爱奇艺世界大会|中国影视行业该走出“作坊”了