摘要:让我们优先来实现一个的案例吧。为了防止被防火墙拦截,需要强制制定的通信端口,一般通过自定义一个类来实现。完美支持语言所独有的特性,不支持其他语言。使用了原生序列化,所有序列化对象必须实现接口。
本博客 猫叔的博客,转载请申明出处学习系列
RPC框架是啥?
Java自带RPC实现,RMI框架入门首先RMI(Remote Method Invocation)是Java特有的一种RPC实现,它能够使部署在不同主机上的Java对象进行通信与方法调用,它是一种基于Java的远程方法调用技术。
让我们优先来实现一个RMI的RPC案例吧。
项目源码地址:RPC_Demo,记得是项目里面的comgithubrmi
1、首先我们需要为服务端创建一个接口方法,而且这个接口最好继承Remote
package com.github.rmi.server; import java.rmi.Remote; import java.rmi.RemoteException; /** * Create by UncleCatMySelf in 21:03 2019420 0020 */ public interface MyService extends Remote { String say(String someOne)throws RemoteException; }
2、对于接口实现类,RMI接口方法定义必须显式声明抛出RemoteException异常,服务端方法实现必须继承UnicastRemoteObject类,该类定义了服务调用与服务提供方对象实现,并建立一对一的连接。
package com.github.rmi.server; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; /** * Create by UncleCatMySelf in 21:05 2019420 0020 */ public class MyServiceImpl extends UnicastRemoteObject implements MyService { protected MyServiceImpl() throws RemoteException { } public String say(String someOne) throws RemoteException { return someOne + ",Welcome to Study!"; } }
3、这里我们还需要一个针对服务端的配置类,因为RMI的通信端口是随机产生的,因此有可能会被防火墙拦截。为了防止被防火墙拦截,需要强制制定RMI的通信端口,一般通过自定义一个RMISocketFactory类来实现。
package com.github.rmi.config; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.rmi.server.RMISocketFactory; /** * Create by UncleCatMySelf in 21:15 2019420 0020 */ public class CustomerSocketFactory extends RMISocketFactory { public Socket createSocket(String host, int port) throws IOException { return new Socket(host, port); } public ServerSocket createServerSocket(int port) throws IOException { if (port == 0){ port = 8855; } System.out.println("RMI 通信端口 : " + port); return new ServerSocket(port); } }
4、好了,这时你可以写出服务端的启动代码了。
package com.github.rmi.server; import com.github.rmi.config.CustomerSocketFactory; import java.rmi.Naming; import java.rmi.registry.LocateRegistry; import java.rmi.server.RMISocketFactory; /** * Create by UncleCatMySelf in 21:07 2019420 0020 */ public class ServerMain { public static void main(String[] args) throws Exception { //注册服务 LocateRegistry.createRegistry(8866); //指定通信端口,防止被防火墙拦截 RMISocketFactory.setSocketFactory(new CustomerSocketFactory()); //创建服务 MyService myService = new MyServiceImpl(); Naming.bind("rmi://localhost:8866/myService",myService); System.out.println("RMI 服务端启动正常"); } }
5、客户端的启动就相对比较简单,我们仅需要进入服务,并调用对应的远程方法即可。
package com.github.rmi.client; import com.github.rmi.server.MyService; import java.rmi.Naming; /** * Create by UncleCatMySelf in 21:10 2019420 0020 */ public class ClientMain { public static void main(String[] args) throws Exception { //服务引入 MyService myService = (MyService) Naming.lookup("rmi://localhost:8866/myService"); //调用远程方法 System.out.println("RMI 服务端调用返回:" + myService.say("MySelf")); } }
最后可以看看效果。
支持真正的面向对象的多态性,这是RMI的优势。
完美支持Java语言所独有的特性,不支持其他语言。
使用了Java原生序列化,所有序列化对象必须实现java.io.Serializablie接口。
底层通信是BIO(同步阻塞I/O)实现的Socket
由于BIO与原生序列化存在的性能问题,导致RMI的性能较差,如果你的项目性能要求较高,可能并不合适哦!
公众号:Java猫说学习交流群:728698035
现架构设计(码农)兼创业技术顾问,不羁平庸,热爱开源,杂谈程序人生与不定期干货。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74225.html
摘要:支持相关规范和标准,包括同上。支持多种传输协议和协议绑定数据绑定。构建端还有其服务实现,接口使用注解,标明是一个远程服务接口。然后编写一个的启动程序,并运行,我想你会成功的因为我看到了下图是一种跨平台的技术协议。 本博客 猫叔的博客,转载请申明出处 学习系列 RPC框架是啥? RPC框架是啥之Java自带RPC实现,RMI框架入门 Apache CXF一款WebService RP...
摘要:具体可以参考消息队列之具体可以参考实战之快速入门十分钟入门阿里中间件团队博客是一个分布式的可分区的可复制的基于发布订阅的消息系统主要用于大数据领域当然在分布式系统中也有应用。目前市面上流行的消息队列就是阿里借鉴的原理用开发而得。 我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snail...
摘要:对于与而言,则可以看做是消息传递技术的一种衍生或封装。在生产者通知消费者时,传递的往往是消息或事件,而非生产者自身。通过消息路由,我们可以配置路由规则指定消息传递的路径,以及指定具体的消费者消费对应的生产者。采用和来进行远程对象的通讯。 消息模式 归根结底,企业应用系统就是对数据的处理,而对于一个拥有多个子系统的企业应用系统而言,它的基础支撑无疑就是对消息的处理。与对象不同,消息本质上...
摘要:微软的虽然引入了事件机制,可以在队列收到消息时触发事件,通知订阅者。由微软作为主要贡献者的,则对以及做了进一层包装,并能够很好地实现这一模式。 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基...
摘要:微软的虽然引入了事件机制,可以在队列收到消息时触发事件,通知订阅者。由微软作为主要贡献者的,则对以及做了进一层包装,并能够很好地实现这一模式。 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基...
阅读 1395·2021-09-03 10:29
阅读 3402·2019-08-29 16:24
阅读 1945·2019-08-29 11:03
阅读 1373·2019-08-26 13:52
阅读 2883·2019-08-26 11:36
阅读 2763·2019-08-23 17:19
阅读 534·2019-08-23 17:14
阅读 749·2019-08-23 13:59