[编织消息框架][消息服务]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等技术实现,消息对列可使用 ...
随机推荐
- Centos7.0 下挂载磁盘
参考:
- spring mvc 复杂参数注入
过了这么久,又重新把博客拾起来了 来上海工作也已经有将近两周的时间了, 今天在整理项目的时候,遇到了一个关于参数注入的问题 背景: 我的开发前台用的是extjs4,在对后台spring mvc提交表单 ...
- 可以在手机上看电脑本地html步骤,我自己总结的哦!
1.打开控制面板 2.打开程序和功能 3.打开或关闭功能 4.internet信息服务展开后里面所有的都要选中 5.回到桌面,然后右键计算机,选择'管理' 6.先在E盘或者D盘创建一个文件夹,自己随意 ...
- javascript设计模式——命令模式
前面的话 假设有一个快餐店,而我是该餐厅的点餐服务员,那么我一天的工作应该是这样的:当某位客人点餐或者打来订餐电话后,我会把他的需求都写在清单上,然后交给厨房,客人不用关心是哪些厨师帮他炒菜.餐厅还可 ...
- AspNet Core Api Restful +Swagger 发布IIS 实现微服务之旅 (二)
上一步我们创建好CoreApi 接下来在框架中加入 Swagger 并发布 到 IIS (1)首先点击依赖项>管理Nuget包 (2)输入 Swashbuckle.aspnetCore 比 ...
- 側滑回退的layout(相似IOS側滑回退到上一个activity)
用过apple的同学应该都知道,大多数IOS应用都支持側滑回退,就不具体说明了,直接上图: 作为使用ios的android开发人员来说,我是特别喜欢这个功能的.既然这样,那就在android上也实现这 ...
- 【Jquery系列】之DOM属性
1 概述 本章将结合JQuery官方API,对Jquery属性进行分析与讲解.主要讲.addClass(),.attr(),,hasClass(),,html(),.prop(),.removeA ...
- Winform开发框架中工作流模块之审批会签操作(2)
前面随笔介绍了请假申请单和报销申请单两个不同的业务表单的流程处理,一个是单表信息,一个包含明细的主从表信息,后者包含了条件流程的处理,在流程审批中,一般还有一种流程处理就是会签的操作,会签处理是几个审 ...
- ASP.NET Core 异常重试组件 Polly
Polly 是一种 .NET 弹性和瞬态故障处理库,允许开发人员以流畅和线程安全的方式表达策略,如重试,断路器,超时,隔离隔离和备用,Polly 适用于 .NET 4.0,.NET 4.5 和 .NE ...
- CS:APP3e 深入理解计算机系统_3e Datalab实验
由于http://csapp.cs.cmu.edu/并未完全开放实验,很多附加实验做不了,一些环境也没办法搭建,更没有标准答案.做了这个实验的朋友可以和我对对答案:) 实验内容和要求可在http:// ...