[编织消息框架][消息服务]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等技术实现,消息对列可使用 ...
随机推荐
- SpringMVC集成Shiro、读取数据库操作权限
1.Maven添加Shiro所需的jar包 <dependency> <groupId>org.apache.shiro</groupId> <artifac ...
- 来自朝鲜的问候 golang入坑系列
鸿渐于陆 本想着写满十八式,但按照目前的进度来看,是很难凑够十八式了.所以还是那句话,量力而行,适可而止.能写多少就写多少,我没法保证看完这本golang脱口秀,一定能成为golang大拿.但入了门, ...
- Python中的选择排序
选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大 ...
- 前端测试框架Jest系列教程 -- 简介
写在前面: 随着互联网日新月异的发展,用户对于页面的美观度,流畅度以及各方面的体验有了更高的要求,我们的网页不再是简单的承载文字,图片等简单的信息传递给用户,我们需要的是更加美观的页面展示,更快的浏览 ...
- PHP招聘那些事,公司真的不需要培训班出来的人么?
就业形势严峻的情况下,每个企业对于人才的需求都不一样,并不是说公司不愿意招聘培训班出来的人,而是看你的能力是不是能胜任企业招聘人才的需求,是不是能给企业带来价值的人. 现在市面上的培训机构多如牛毛,然 ...
- HAUT 1261地狱飞龙 自适应辛普森 数值积分
1261: 地狱飞龙 时间限制: 1 秒 内存限制: 64 MB 提交: 300 解决: 68 题目描述 最近clover迷上了皇室战争,他抽到了一种地狱飞龙,很开心.假设地域飞龙会对距离为d的敌 ...
- SEO中TDK写法的意思以及注意事项
在SEO中,所谓的TDK其实就是title.description.keywords这三个标签,这三个标签在网站的优化过程中,至关重要所以今天童童来和大家分享下,如何去写好TDK标签! 1.title ...
- Python3学习笔记2:简易Web爬虫
开发环境 基础语法那章的内容我是在Docker容器中玩的,但是真正做项目的时候,没有IDE的强大辅助功能来协助的话是很累人的一件事.因此从本文中,我选择使用Jetbrain的Pycharm这个IDE来 ...
- javassist:字节码编辑器工具
简介: javassist是一款可以在运行时生成字节码的工具,可以通过它来构造一个新的class对象.method对象,这个class是运行时生成的.可以通过简短的几行代码就可以生成一个新的class ...
- Postgres是如何管理空值的
创建表test,y字段插入null. test=# create table test(x bigint,y bigint,z text); CREATE TABLE test=# insert in ...