JAVA中几种常用的RPC框架介绍

JAVA中几种常用的RPC框架介绍RPC 是远程过程调用的简称 广泛应用在大规模分布式应用中 作用是有助于系统的垂直拆分 使系统更易拓展 Java 中的 RPC 框架比较多 各有特色 广泛使用的有 RMI Hessian Dubbo 等 1 RMI 远程方法调用 JAVA 自带的远程方法调用工具 不过有一定的局限性 2 Hessian 基于 HTTP 的远程方法调用 基于 HTTP 协议传输 在性能方面还不够完美 负载均衡和失效转移依赖于

RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展。Java中的RPC框架比较多,各有特色,广泛使用的有RMI、Hessian、Dubbo等。RPC还有一个特点就是能够跨语言,本文只以JAVA语言里的RPC为例。

对于RPC有一个逻辑关系图,以RMI为例:

JAVA中几种常用的RPC框架介绍


其他的框架结构也类似,区别在于对象的序列化方法,传输对象的通讯协议,以及注册中心的管理与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 = L; / * @throws RemoteException */ protected ServiceImpl() throws RemoteException { super(); } /* (non-Javadoc) * */ @Override public 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包。

JAVA中几种常用的RPC框架介绍


3、Dubbo(淘宝开源的基于TCP的RPC框架)

基于Netty的高性能RPC框架,是阿里巴巴开源的,总体原理如下:

JAVA中几种常用的RPC框架介绍


在了解Dubbo之前,要先对Zookeeper有深入的理解,当理解了zookeeper后,Dubbo也就了无秘密了。

Dubbo的详细说明在淘宝开源里说的非常详细,在工作中很多生产项目都用了Dubbo,过程中也发现了很多需要注意的地方,尤其是那繁多的配置,设置不当都会让人烦脑,最好能再基于现有开源的Dubbo再定制优化一下。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202757.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午11:22
下一篇 2026年3月19日 下午11:22


相关推荐

  • Claude 4:AI 编程新王者登基!国内直接使用

    Claude 4:AI 编程新王者登基!国内直接使用

    2026年3月15日
    2
  • 程序员与代码的搞笑日常

    程序员与代码的搞笑日常

    2022年3月4日
    37
  • DeepFakes深度造假,AI换脸的技术原理是什么?

    DeepFakes深度造假,AI换脸的技术原理是什么?DeepFakes的出现还意味着我们可以在视频中进行大规模的“换脸”。我们大多数人都曾经把自己的照片上传到网络上,因此,我们大多数人的脸都能够轻易地被替换到一些视频中,成为视频的“主角”,凭空捏造一个人根本没有干过的事。不得不说,这是件非常可怕的事情。

    2022年5月25日
    48
  • 接口设计文档模板

    接口设计文档模板前言后端接口设计文档 个人认为需要告知接口调用者的内容博客地址 芒果橙的个人博客 http mangocheng com 接口设计说明 xx 系统修改记录本次修改记录 每次更新后删除 只显示当次内容日期 2020 05 01 2020 05 061 新增权限模块第 3 章节内容接口清单序号模块说明 1 权限模块主要包含用户的权限功能接口一 权限模块序号接口说明 1searchAutho 获取当前登录用的权限预定义

    2026年3月2日
    3
  • C语言操作Excel表格

    C语言操作Excel表格上网查找了好多的资料发现 C 语言不能操作 Execl 表格 说是比较用 C 语言好操作 想了解更多请点此链接 C 操作 Excel 表格 接下来介绍下一位学长介绍给我的方法 比较粗俗 但还是挺实用的 第一步 先实用 C 语言创建 xls 的后缀文件 之后把这个文件当做普通的 txt 文件打开来操作 第二步 对表格的处理 使用 C 语言打开表格后 文件指针指向整个表格的第 1 行第 1 列 假如想给它的同行的下一个单元 第 1 行

    2026年3月26日
    3
  • 渗透测试笔记大全_黑客秘笈-渗透测试实用指南

    渗透测试笔记大全_黑客秘笈-渗透测试实用指南【拿shell】1.直接上传aspasajspcerphpaspxhtrcdx格式的木马,不行就利用IIS6.0解析漏洞”:1.asp;1.jpg/1.asp;.jpg/1.asp;jpg/1.asp;.xls2.上传图片木马遇到拦截系统,连图片木马都上传不了,记事本打开图片木马在代码最前面加上gif89a,一般就能逃过拦截系统了。3.上传图片木马把地址复制到数据库备份里备份成…

    2026年2月9日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号