[编织消息框架][消息服务]rmi
RMI(即Remote Method Invoke 远程方法调用)
远程对象: 用于远程客户端调用 必需继承java.rmi.Remote,每个调用方法必须添加java.rmi.RemoteException异常
远程对象实现:用于远程服务器,实现调用逻辑 必需继承UnicastRemoteObject
远程服务器:通过LocateRegistry注册服务
远程客户端:通过LocateRegistry查找服务,调用方法即可发送内容 Naming是LocateRegistry的辅助工具类
import java.rmi.Remote;
import java.rmi.RemoteException; public interface ITestRMIService extends Remote {
//必须加RemoteException否则运行出错: java.rmi.server.ExportException
public String a(String content) throws RemoteException; public TestRMIObj b(TestRMIObj input) throws RemoteException;
}
// UnicastRemoteObject用于导出的远程对象和获得与该远程对象通信的存根。否则运行出错:java.rmi.MarshalException
public class TestRMIServiceImpl extends UnicastRemoteObject implements ITestRMIService {
private static final long serialVersionUID = -6460154344452562895L; public TestRMIServiceImpl() throws RemoteException {
super();
} @Override
public String a(String content) {
System.out.println("call : a"+ content );
return "server >> " + content;
} @Override
public TestRMIObj b(TestRMIObj input) throws RemoteException {
System.out.println("call b : "+ input.getB().length );
input.setA(12);
return input;
}
}
//必须实现Serializable该对象要支持 Serializable
public class TestRMIObj implements Serializable { private static final long serialVersionUID = 2367853017282270281L;
private int a;
private Integer[] b; public int getA() {
return a;
} public Integer[] getB() {
return b;
} public void setA(int a) {
this.a = a;
} public static TestRMIObj of(int a, Integer... b) {
TestRMIObj ret = new TestRMIObj();
ret.a = a;
ret.b = b;
return ret;
}
}
public class ServerRMI {
public static void main(String[] args) {
try {
// 实例化实现了IService接口的远程服务ServiceImpl对象
ITestRMIService service02 = new TestRMIServiceImpl();
// 本地主机上的远程对象注册表Registry的实例,并指定端口为8888
LocateRegistry.createRegistry(8888);
// 把远程对象注册到RMI注册服务器上,并命名为service02
// 绑定的URL标准格式为:rmi://host:port/name
Naming.bind("rmi://localhost:8888/service02", service02);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("服务器向命名表注册了1个远程服务对象!");
}
}
public class ClientRMI {
private ITestRMIService service;
public void start() {
String url = "rmi://localhost:8888/";
try {
// 在RMI服务注册表中查找名称为service02的对象,并调用其上的方法
service = (ITestRMIService) Naming.lookup(url + "service02");
System.out.println(service.a("你好!"));
System.out.println(service.b(TestRMIObj.of(1, 2, 3, 4)).getA());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
ClientRMI rmi = new ClientRMI();
rmi.start();
while (true) {
Thread.sleep(500);
rmi.service.a("a");
}
}
}
使用rmi开发网络通信非常简单,代码量比写model还少,开发者不需要考虑对象序列化,网络IO模型,粘包/半包、传输协议等问题
但它应用场景非常少,不适合大规模的应用,比较适合s/s服务间调用,原因是对象序列化数据量大,采用的是BIO模型
RMI与RPC有什么区别呢
RPC(Remote Procedure Call Protocol)远程过程调用协议
程序可使用这种协议向网络中的另一台计算机上的程序请求服务。由于使用 RPC 的程序不必了解支持通信的网络协议的情况,因此 RPC 提高了程序的互操作性。在 RPC 中,发出请求的程序是客户程序,而提供服务的程序是服务器
可以这样理解rmi是sun公司基于rpc制定的实现标准
[编织消息框架][消息服务]rmi的更多相关文章
- [编织消息框架][消息服务]jmx
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序.设备.系统等植入管理功能的框架,使用的是RMI技术. 比较经典的应用jdk bin目录下 jcons ...
- 「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- [编织消息框架][netty源码分析]2 eventLoop
eventLoop从命名上看是专门处理事件 事件系统主要由线程池同队列技术组成,有以下几个优点 1.任务出队有序执行,不会出现错乱,当然前提执行线程池只有一个 2.解偶系统复杂度,这是个经典的生产者/ ...
- 使用 Spring Cloud Stream 构建消息驱动微服务
相关源码: spring cloud demo 微服务的目的: 松耦合 事件驱动的优势:高度解耦 Spring Cloud Stream 的几个概念 Spring Cloud Stream is a ...
- 消息驱动式微服务:Spring Cloud Stream & RabbitMQ
1. 概述 在本文中,我们将向您介绍Spring Cloud Stream,这是一个用于构建消息驱动的微服务应用程序的框架,这些应用程序由一个常见的消息传递代理(如RabbitMQ.Apache Ka ...
- Spring Cloud Alibaba学习笔记(12) - 使用Spring Cloud Stream 构建消息驱动微服务
什么是Spring Cloud Stream 一个用于构建消息驱动的微服务的框架 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互, ...
- 搭建websocket消息推送服务,必须要考虑的几个问题
近年,不论是正在快速增长的直播,远程教育以及IM聊天场景,还是在常规企业级系统中用到的系统提醒,对websocket的需求越来越大,对websocket的要求也越来越高.从早期对websocket的应 ...
- 优化技术专题-线程间的高性能消息框架-深入浅出Disruptor的使用和原理
前提概要 简单回顾 jdk 里的队列: 阻塞队列: ArrayBlockingQueue主要通过:数组(Object[])+ 计数器(count)+ ReetrantLock的Condition (n ...
- 异步tcp通信——APM.Server 消息推送服务的实现
消息推送服务 服务器推送目前流行就是私信.发布/订阅等模式,基本上都是基于会话映射,消息对列等技术实现的:高性能.分布式可以如下解决:会话映射可采用redis cluster等技术实现,消息对列可使用 ...
随机推荐
- ##6.1 Neutron控制节点-- openstack pike
##6.1 Neutron控制节点 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##6.1 Neutron控制节 ...
- 读懂源码:一步一步实现一个 Vue
源码阅读:究竟怎样才算是读懂了? 市面上有很多源码分析的文章,就我看到的而言,基本的套路就是梳理流程,讲一讲每个模块的功能,整篇文章有一大半都是直接挂源码.我不禁怀疑,作者真的看懂了吗?为什么我看完后 ...
- SQL Server插入数据和删除数据
首先在我的Student表中插入几条数据,由于我的表已经创建完成了,所以就没有创建表的 sql 语句了,不过可以看我的上一篇文章: http://www.cnblogs.com/Brambling/p ...
- Windows2000源代码 200+MB
全球最大的软件制造商微软2月12日警告公众称其一部分珍贵的Windows NT和Windows 2000操作系统源代码被泄漏到了一些在线文件共享网络中. 微软称被泄漏的代码只是整个程序的一小部分,但这 ...
- extjs 关于dom操作的几个库
经过几天的学习研究,发现ext与jquery的设计思路完全是来自两个方向. jquery是内聚,把所有东西都放在$的下面,而ext是采用分模块的设计思路,每个功能封装一个库.这样就形成了各自的实用风格 ...
- Java爬虫——网易云热评爬取
爬取目标网址 : http://music.163.com/#/song?id=409649818 需要爬取信息 : 网易云top13热评 使用之前的 HttpURLConnection 获取 ...
- POJ 3928 & hdu 2492 & Uva1428 PingPong 【树状数组】
Ping pong Time Limit: 2000/1000 MS (Java/Others) ...
- JVM垃圾收集相关经常使用參数
參 数 描 述 UseSerialGC 虚拟机执行在Client 模式下的默认值,打开此开关后,使用Serial + Serial Old 的收集器组合进行内存回收 UseParNewGC 打开此开关 ...
- hdu 5078 Osu! (2014 acm 亚洲区域赛鞍山 I)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5078 Osu! Time Limit: 2000/1000 MS (Java/Others) ...
- vertical-align 和 img属性 和 鼠标样式
一.vertical-align 一)定义:定义行内元素的基线相对于该所在基线的垂直对齐.(只针对行类块inline/inline-block/<img>,块级不适用!) 二)语法: 三 ...