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 框架介绍相关推荐

  1. Java中几种常用的RPC框架介绍

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 Crouch down ...

  2. rpc框架有哪些java_JAVA中几种常用的RPC框架介绍

    1.dubbo: 使用Hessian的序列化协议,传输则是TCP协议,使用了高性能的NIO框架Netty 服务接口 1 public interface DemoService { 2 String ...

  3. JAVA中几种常用JSON库性能比较

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 作者:飞污熊 xncoding.com/2018/01/09/java/jsons.html 本 ...

  4. java 中几种常用数据结构

    原文地址:http://blog.csdn.net/u010947402/article/details/51878166 JAVA中常用的数据结构(java.util. 中) Java中有几种常用的 ...

  5. java中四种常用的引用类型_java中四种引用类型

    JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference).软引用(Soft Reference).弱引用(Weak Reference).虚引用 ...

  6. 互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!

    1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库. 但是,当深入实现细节时,我们想起了一位智者曾经说过 ...

  7. java中几种常见字符集与乱码介绍

    1.  ASCII和Ansi编码 字符内码(charcter code)指的是用来代表字符的内码 .读者在输入和存储文档时都要使用内码,内码分为  单字节内码 -- Single-Byte chara ...

  8. java中几种常用的对象类型(po,vo,bo,dto)

    PO(persistant object) 1.持久对象 在o/r映射的时候出现的概念,如果没有o/r映射,没有这个概念存在了.   2.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看 ...

  9. JAVA中方法的类型转换_Java中几种常用数据类型之间转换的方法

    Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...

最新文章

  1. C++拾趣——类构造函数的隐式转换
  2. dede php 调用自定义字段,在dedecms搜索结果列表页调用自定义字段的方法(绝对可用)...
  3. cocos2d-x触摸事件优先级
  4. [转]【Git】rebase 用法小结
  5. wxWidgets:wxMBConv概述
  6. 网页元素坐标表示及坐标计算方法
  7. python 正则re模块
  8. 7.使用reserve避免不必要的内存分配
  9. 基于JavaScript实现配对游戏
  10. Direct3d 显示视频的一个问题
  11. 联想服务器imm默认地址_命令下配置ip地址
  12. 虚拟化--001 view win7优化
  13. pcs7组态虚拟机中的服务器,用虚拟机做PCS7时,无法设置固定的IP地址-工业支持中心-西门子中国...
  14. 控制教程 —— 介绍篇:3.PID控制器设计
  15. Zemax单透镜设计
  16. 8086c语言编译器,8086汇编语言编译器MKStudio安装使用教程
  17. Vue el-upload插件上传批量文件
  18. Confluence 6 后台中的默认空间模板设置
  19. [原创]网站文章页面添加分享按钮,百度按钮代码复制使用时不显示问题解决!
  20. 分布式数据存储系统:三要素

热门文章

  1. 深入理解Webpack核心模块Tapable钩子[异步版]
  2. 使用随机数以及扩容表进行join代码
  3. 工作总结-基于R的数据分析
  4. c++ 11 移动语义
  5. Leetcode:371.Sum Of Two Integer
  6. UTF-8和Unicode
  7. Android Resources
  8. 复制公钥到多个服务器脚本
  9. vsftpd + mysql + virtual users
  10. 如何在page_load方法判断是服务器端控件引发的page_load方法