Java 中几种常用的 RPC 框架介绍
RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展。Java中的RPC框架比较多,各有特色,广泛使用的有RMI、Hessian、Dubbo等。RPC还有一个特点就是能够跨语言,本文只以JAVA语言里的RPC为例。
对于RPC有一个逻辑关系图,以RMI为例:
其他的框架结构也类似,区别在于对象的序列化方法,传输对象的通讯协议,以及注册中心的管理与failover设计(利用zookeeper)。
客户端和服务端可以运行在不同的JVM中,Client只需要引入接口,接口的实现以及运行时需要的数据都在Server端,RPC的主要依赖技术是序列化、反序列化和传输协议,JAVA里对应的就是对象的序列化、反序列化以及序列化后数据的传输。RMI的序列化和反序列化是JAVA自带的,Hessian里的序列化和反序列化是私有的,传输协议则是HTTP,Dubbo的序列化可以多种选择,一般使用Hessian的序列化协议,传输则是TCP协议,使用了高性能的NIO框架Netty。对于序列化,我还了解一些,像Google的ProBuffer、JBoss Marshalling和Apache Thrift等,之前有写一篇介绍ProBuffer的博文
1、RMI(远程方法调用)
JAVA自带的远程方法调用工具,不过有一定的局限性,毕竟是JAVA语言最开始时的设计,后来很多框架的原理都基于RMI,RMI的使用如下:
对外接口
public interface IService extends Remote {public String queryName(String no) throws RemoteException;}
服务实现
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;// 服务实现
public class ServiceImpl extends UnicastRemoteObject implements IService {/***/private static final long serialVersionUID = 682805210518738166L;/*** @throws RemoteException*/protected ServiceImpl() throws RemoteException {super();}/* (non-Javadoc)**/@Overridepublic String queryName(String no) throws RemoteException {// 方法的具体实现System.out.println("hello" + no);return String.valueOf(System.currentTimeMillis());}}
RMI客户端
import java.rmi.AccessException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;// RMI客户端
public class Client {public static void main(String[] args) {// 注册管理器Registry registry = null;try {// 获取服务注册管理器registry = LocateRegistry.getRegistry("127.0.0.1",8088);// 列出所有注册的服务String[] list = registry.list();for(String s : list){System.out.println(s);}} catch (RemoteException e) {}try {// 根据命名获取服务IService server = (IService) registry.lookup("vince");// 调用远程方法String result = server.queryName("ha ha ha ha");// 输出调用结果System.out.println("result from remote : " + result);} catch (AccessException e) {} catch (RemoteException e) {} catch (NotBoundException e) {}}
}
RMI服务端
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;// RMI服务端
public class Server {public static void main(String[] args) {// 注册管理器Registry registry = null;try {// 创建一个服务注册管理器registry = LocateRegistry.createRegistry(8088);} catch (RemoteException e) {}try {// 创建一个服务ServiceImpl server = new ServiceImpl();// 将服务绑定命名registry.rebind("vince", server);System.out.println("bind server");} catch (RemoteException e) {}}
}
服务注册管理器写在了Server里,当然也可以抽出来单独作为一个服务,在其他一些框架中,往往用Zookeeper充当注册管理角色。
2、Hessian(基于HTTP的远程方法调用)
基于HTTP协议传输,在性能方面还不够完美,负载均衡和失效转移依赖于应用的负载均衡器,Hessian的使用则与RMI类似,区别在于淡化了Registry的角色,通过显示的地址调用,利用HessianProxyFactory根据配置的地址create一个代理对象,另外还要引入Hessian的Jar包。
3、Dubbo(淘宝开源的基于TCP的RPC框架)
基于Netty的高性能RPC框架,是阿里巴巴开源的,总体原理如下:
在了解Dubbo之前,要先对Zookeeper有深入的理解,当理解了zookeeper后,Dubbo也就了无秘密了。
Dubbo的详细说明在淘宝开源里说的非常详细,在工作中很多生产项目都用了Dubbo,过程中也发现了很多需要注意的地方,尤其是那繁多的配置,设置不当都会让人烦脑,最好能再基于现有开源的Dubbo再定制优化一下。
Java 中几种常用的 RPC 框架介绍相关推荐
- Java中几种常用的RPC框架介绍
点击上方 "程序员小乐"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 Crouch down ...
- rpc框架有哪些java_JAVA中几种常用的RPC框架介绍
1.dubbo: 使用Hessian的序列化协议,传输则是TCP协议,使用了高性能的NIO框架Netty 服务接口 1 public interface DemoService { 2 String ...
- JAVA中几种常用JSON库性能比较
点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 作者:飞污熊 xncoding.com/2018/01/09/java/jsons.html 本 ...
- java 中几种常用数据结构
原文地址:http://blog.csdn.net/u010947402/article/details/51878166 JAVA中常用的数据结构(java.util. 中) Java中有几种常用的 ...
- java中四种常用的引用类型_java中四种引用类型
JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference).软引用(Soft Reference).弱引用(Weak Reference).虚引用 ...
- 互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!
1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库. 但是,当深入实现细节时,我们想起了一位智者曾经说过 ...
- java中几种常见字符集与乱码介绍
1. ASCII和Ansi编码 字符内码(charcter code)指的是用来代表字符的内码 .读者在输入和存储文档时都要使用内码,内码分为 单字节内码 -- Single-Byte chara ...
- java中几种常用的对象类型(po,vo,bo,dto)
PO(persistant object) 1.持久对象 在o/r映射的时候出现的概念,如果没有o/r映射,没有这个概念存在了. 2.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看 ...
- JAVA中方法的类型转换_Java中几种常用数据类型之间转换的方法
Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...
最新文章
- C++拾趣——类构造函数的隐式转换
- dede php 调用自定义字段,在dedecms搜索结果列表页调用自定义字段的方法(绝对可用)...
- cocos2d-x触摸事件优先级
- [转]【Git】rebase 用法小结
- wxWidgets:wxMBConv概述
- 网页元素坐标表示及坐标计算方法
- python 正则re模块
- 7.使用reserve避免不必要的内存分配
- 基于JavaScript实现配对游戏
- Direct3d 显示视频的一个问题
- 联想服务器imm默认地址_命令下配置ip地址
- 虚拟化--001 view win7优化
- pcs7组态虚拟机中的服务器,用虚拟机做PCS7时,无法设置固定的IP地址-工业支持中心-西门子中国...
- 控制教程 —— 介绍篇:3.PID控制器设计
- Zemax单透镜设计
- 8086c语言编译器,8086汇编语言编译器MKStudio安装使用教程
- Vue el-upload插件上传批量文件
- Confluence 6 后台中的默认空间模板设置
- [原创]网站文章页面添加分享按钮,百度按钮代码复制使用时不显示问题解决!
- 分布式数据存储系统:三要素