远程服务调用RMI框架 演示,和底层原理解析
远程服务调用RMI框架: 是纯java写的, 只支持java服务之间的远程调用,很简单,
// 接口要继承 Remote接口
public interface IHelloService extends Remote {
public String sayHello(String msg)throws RemoteException;
}
//实现类 要继承 UnicastRemoteObject 类, 并重写 构造方法
public class HelloServiceImpl extends UnicastRemoteObject implements IHelloService {
protected HelloServiceImpl() throws RemoteException {
super();
}
@Override
public String sayHello(String msg) throws RemoteException{
return "hello "+msg;
}
}
## 发布服务
public class RMI_Server {
public static void main(String[] args) throws Exception {
//这是将 本服务发布出去
IHelloService helloService = new HelloServiceImpl();
//这是将 locateRegistry 相当于注册中心, 发布出去
LocateRegistry.createRegistry(1099);
//这是将 rul 和 服务,存到 HashTable中, 并发布出去
Naming.bind("rmi://127.0.0.1/hello",helloService);
System.out.println("服务发布成功");
}
}
## 服务调用client
public class RMI_Client {
public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
IHelloService helloService = (IHelloService) Naming.lookup("rmi://127.0.0.1/hello");
System.out.println(helloService.sayHello("啦啦啦啦啊"));
}
}
运行结果:

源码解读: 这里参考别人博客,自己不重复造轮子:
https://blog.csdn.net/qq_20597727/article/details/80861906
自己理解:
HelloServiceImpl ---> 构造-->exportObject(obj, new UnicastServerRef(port));--->1:这里先对当前对象代理生成代理对象, 将代理对象包装成Target对象,发布出去--->TCPEndPoint发布服务(可以将这里看做传输层) ---> this.listen(); 监听( 这里面可看到 工厂模式 new 了一个 serverSocket, 并创建一个线程 (这个线程循环 socket阻塞, 当监听到client过来的时候, 线程池调用线程,发送,当前服务对象, 最后关闭 serverSocket) )
LocateRegistry.createRegistry(1099); ------>this.setup(new UnicastServerRef(var2, RegistryImpl::registryFilter));----->var1.exportObject(this, (Object)null, true);----> 接下来和 发布服务是一样的... 这个操作是将LocateRegistry 发布出去, LocateRegistry相当于注册中心,是单独的一个进程,在 java/bin下
Naming.bind("rmi://127.0.0.1/hello",helloService); -----> 这个是将url 和对应服务 绑定起来,---> 先获取这侧表, 然后注册表将 url 和 对应服务绑定 内部其实是一个Hashtable , url---key, 服务--->value , 获取一个新连接, 将 url和服务 发送出去
Client 端, IHelloService helloService = (IHelloService) Naming.lookup("rmi://127.0.0.1/hello"); --->先获取到注册表, 然后监听 对应的 rul, 先从HashTable中根据url 获取服务,有就直接返回
远程服务调用RMI框架 演示,和底层原理解析的更多相关文章
- 分布式远程服务调用(RPC)框架
分布式远程服务调用(RPC)框架 finagle:一个支持容错,协议无关的RPC系统 热门度(没变化) 10.0 活跃度(没变化) 10.0 Watchers:581 Star:6174 Fork: ...
- 远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo、SpringClound对比
远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo.SpringClound对比 远程服务调用RPC框架介绍,RPC简单的来说就是像调用本地服务一样调用远程服务. 分布式RPC需要 ...
- dubbo专题」dubbo其实很简单,就是一个远程服务调用的框架(1)
一.dubbo是什么? 1)本质:一个Jar包,一个分布式框架,,一个远程服务调用的分布式框架. 既然是新手教学,肯定很多同学不明白什么是分布式和远程服务调用,为什么要分布式,为什么要远程调用.我简单 ...
- git的核心命令使用和底层原理解析
文章目录: GIT体系概述 GIT 核心命令使用 GIT 底层原理 一.GIT体系概述 GIT 与 svn 主要区别: 存储方式不一样 使用方式不一样 管理模式不一样 1.存储方式区别 GIT把内容按 ...
- Spring Cloud底层原理解析
概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...
- Spring框架实现——远程方法调用RMI代码演示
1.spring_RMI02_server服务端02 <?xml version="1.0" encoding="UTF-8"?> <bean ...
- JAVA框架 Spring AOP底层原理
一:AOP(Aspect Oriented Programming)面向切面编程. 底层实现原理是java的动态代理:1.jdk的动态代理.2.spring的cglib代理. jdk的动态代理需要被代 ...
- 普通方法实现——远程方法调用RMI代码演示
1.spring_RMI01_server服务端 package com.wisezone.service; import java.rmi.Remote; import java.rmi.Remot ...
- 基于框架的RPC通信技术原理解析
RPC的由来 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时, ...
随机推荐
- android 代码中使用textAppearance
一开始在代码中我以为使用tvAge.setTextAppearance(context, resid);这样的的方式就能行, 运行之后发现这个设置并未生效,于是到处搜索在代码中设置系统样式的的解决方法 ...
- Tars-Java客户端源码分析
一.基本RPC框架简介 在分布式计算中,远程过程调用(Remote Procedure Call,缩写 RPC)允许运行于一台计算机的程序调用另一个地址空间计算机的程序,就像调用本地程序一样,无需额外 ...
- 【python】Leetcode每日一题-前缀树(Trie)
[python]Leetcode每日一题-前缀树(Trie) [题目描述] Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的 ...
- 第二章 FreeBSD之开机关机命令
立即关机,但是不关闭电源 # shutdown -h now 立即关机,并且关闭电源 # shutdown -p now 重启命令 # shutdown -r now
- 【.NET 与树莓派】六轴飞控传感器(MPU 6050)
所谓"飞控",其实是重力加速度计和陀螺仪的组合,因为多用于控制飞行器的平衡(无人机.遥控飞机).有同学会问,这货为什么会有六轴呢?咱们常见的不是X.Y.Z三轴吗?重力加速度有三轴, ...
- C++ primer plus读书笔记——第13章 类继承
第13章 类继承 1. 如果购买厂商的C库,除非厂商提供库函数的源代码,否则您将无法根据自己的需求,对函数进行扩展或修改.但如果是类库,只要其提供了类方法的头文件和编译后的代码,仍可以使用库中的类派生 ...
- Java项目中每一个类都可以有一个main方法
Java项目中每一个类都可以有一个main方法,但只有一个main方法会被执行,其他main方法可以对类进行单元测试. public class StaticTest { public static ...
- pip安装模块或者更新出现问题Error:Could not install packages due to an EnvironmentError
问题分析 出现此问题大致的原因: 就是包安装的位置没有读写的权限,这个多半是因为安装python的时候安装在了C盘,或者其他programs这类的文件夹里 或者就是环境变量的设置的安装位置的问题,导致 ...
- Linux(深度)系统安装富士施乐(网络)打印机
一般来讲,linux系统识别打印机没有问题,重点难点在于后面设置.此文特别感谢:河北石龙的陈一繁销售代表.P288dw施乐官网并未提供Linux的驱动并在安装过程中遇到很多问题,其不厌其烦的为我联系厂 ...
- ES6中函数参数默认值问题
参数默认值 // 以前的参数默认值写法 let fn = (a, b) => { a = typeof a === "undefined" ? 10 : a b = type ...