分布式架构探索 - 1. RPC框架之Java原生RMI
1. 什么是RPC
RPC(Remote Procedure Call)即远程过程调用,指的是不同机器间系统方法的调用,这和
同机器动态链接库(DLL)有点类似,只不过RPC是不同机器,通过网络通信来访问远程的资源。
2. Java RMI技术
RMI(Remote Method Invocation)即远程方法调用,是Java原生的RPC技术。
* 使用了原生的序列化机制(序列化对象实现java.io.Serializable接口)
* 底层通信基于BIO(Block IO)实现的Socket来完成
* 性能较差
例子:
2-1) 首先,定义远程对外服务接口
// 必须继承Remote接口
public interface HelloService extends Remote {
String sayHello(String someOne) throws RemoteException;
}
2-2) 远程接口的实现
// UnicastRemoteObject定义了服务调用方与提供方对象实例,并建立一对一连接
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService { protected HelloServiceImpl() throws RemoteException {
super();
} @Override
public String sayHello(String someOne) throws RemoteException {
return "hello," + someOne;
}
}
2-3) 服务端远程服务启动
// 创建和注册服务
public class ServiceMain {
public static void main(String[] args) throws Exception {
LocateRegistry.createRegistry(8801);
//指定通讯端口,防止被防火墙拦截
RMISocketFactory.setSocketFactory(new CustomerSocketFactory()); HelloService helloService = new HelloServiceImpl();
Naming.bind("rmi://localhost:8801/helloService", helloService);
System.out.println("ServiceMain provide RPC service now.");
}
}
/**
* 指定通讯端口,防止被防火墙拦截
* Created by KG on 2017/3/8.
*/
public class CustomerSocketFactory extends RMISocketFactory {
@Override
public Socket createSocket(String host, int port) throws IOException {
return new Socket(host, port);
} @Override
public ServerSocket createServerSocket(int port) throws IOException {
if (port == 0) {
port = 8501;
}
System.out.println("rmi notify port:" + port);
return new ServerSocket(port);
}
}
2-4) 客户端调用RMI服务
public class ClientMain {
public static void main(String[] args) throws Exception {
//服务引入
HelloService helloService = (HelloService) Naming.lookup("rmi://localhost:8801/helloService");
//调用远程方法
System.out.println("RMI服务器返回的结果是 " + helloService.sayHello("Master HaKu"));
}
}
程序运行结果:
RMI服务器返回的结果是 hello,Master HaKu
分布式架构探索 - 1. RPC框架之Java原生RMI的更多相关文章
- 微服务架构介绍和RPC框架对比
微服务架构介绍和RPC框架对比 1.微服务架构 1.1 特征 自动化部署,端点智能化,语言和数据的去中心化控制. 1.2架构 一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中 ...
- 远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo、SpringClound对比
远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo.SpringClound对比 远程服务调用RPC框架介绍,RPC简单的来说就是像调用本地服务一样调用远程服务. 分布式RPC需要 ...
- 分布式架构的基石.简单的 RPC 框架实现(JAVA)
前言 RPC 的全称是 Remote Procedure Call,它是一种进程间通信方式.允许像调用本地服务一样调用远程服务. 学习来源:<分布式系统架构:原理与实践> - 李林锋 1. ...
- 分布式架构探索 - 2. WebService RPC框架之Apache CXF
Apache CXF是一个开源的WebService RPC框架. 例子: 1. 新建一个maven web项目, 添加pom 如下: <?xml version="1.0" ...
- 自定义RPC框架--基于JAVA实现
视频教程地址 DT课堂(原名颜群) 整体思路RPC(Remote Procedure Call),即远程过程调用.使用RPC,可以像使用本地的程序一样使用远程计算机上的程序.RPC使得开发分布式程序更 ...
- GRPC 1.3.4 发布,Google 高性能 RPC 框架(Java C++ Go)
GRPC 1.3.4 发布了,GRPC 是一个高性能.开源.通用的 RPC 框架,面向移动和 HTTP/2 设计,是由谷歌发布的首款基于 Protocol Buffers 的 RPC 框架. GRPC ...
- 完全开源Android网络框架 — 基于JAVA原生的HTTP框架
HttpNet网络请求框架基于HttpUrlConnection,采用Client + Request + Call的请求模型,支持https默认证书,数字安全证书.支持http代理!后续将会实现队列 ...
- 分布式架构核心RPC原理
在应用的迭代演进过程中,随着系统访问量提高,业务复杂度提高,代码复杂度提高,应用逐渐从单体式架构向面向服务的分布式架构转变.RPC(Remote Procedure Call Protocol远程过程 ...
- 分布式架构基石RPC的实现原理
RPC的由来 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时, ...
随机推荐
- element-ui upload组件上传
方法一: <el-table-column label="操作"> <template slot-scope="scope"> < ...
- js(javaScript)的各种事件触发,以常见为主eg:onclick
js的各种事件触发,以常见为主eg:onclick1.onclick,点击后触发事件 (1)<h1 onclick="this.innerHTML='谢谢!'">请点击 ...
- NSL:SOFM神经网络实现预测哪个样本与哪个样本处在同一层,从而科学规避我国煤矿突水灾难—Jason niu
load water_data.mat attributes = mapminmax(attributes); P_train = attributes(:,1:35); T_train = clas ...
- 大数据技术 - 分布式文件系统 HDFS 的设计
本章内容介绍下 Hadoop 自带的分布式文件系统,HDFS 即 Hadoop Distributed Filesystem.HDFS 能够存储超大文件,可以部署在廉价的服务器上,适合一次写入多次读取 ...
- python实现杨辉三角
刚刚学python,原来用c++,Java很轻松实现的杨辉三角,现在用python实现,代码是少了,理解起来却不容易啊. 这里主要用到的Python的生成器. 我们都知道Python有列表解析功能,根 ...
- IDEA安装使用Lombok插件
项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set.toString.equals和hashCode方法,虽然IDEA开发环境下都有自动生成的快捷方式,但自动生成这些代码 ...
- Javascript控制台打印Object对象
Javascript控制台打印Object对象 做项目的时候遇到一个问题,在调试代码时需要打印对象来查看具体数值,想了各种方法也没有实现,最后查资料知道了可以使用JSON.stringify()将ob ...
- pythonweb服务器编程(二)
Web静态服务器-1-显示固定的页面 #coding=utf-8 import socket from multiprocessing import Process def handleClient( ...
- GetLastError
GetLastError返回错误表[0]-操作成功完成. [1]-功能错误. [2]-系统找不到指定的文件. [3]-系统找不到指定的路径. [4]-系统无法打开文件. [5]-拒绝访问. [6]-句 ...
- docker 清理容器的命令
执行以下命令会彻底清除所有容器. docker rm -f $(docker ps -qa) rm -rf /var/lib/etcd /var/lib/cni /var/run/calico rm ...