Java里的RPC:远程方法调用技术,一文带你搞懂
Java中的远程方法调用之RPC使用2026年5月18日10时21分33秒, 更新时间, 作者。本文对RPC的基础概念予以介绍, 阐述了其核心思想, 说明了其于分布式系统里的作用, 着重对Java内的三种RPC实现方式进行讲解, 这三种方式是RMI以及Dubbo, 分别从适用场景、核心特点等方面展开对比, 还给出了其基本的实现代码示例, 归纳总结了各框架的优点与缺点, 为实际开发期间选择恰当的技术栈给予了参考。1. 什么是RPCRPC基础介绍Java里头的远程方法调用, 也就是Call, 或者说RPC, 是一项能让一个程序去调用另一台计算机上面方法的技术, 仿佛就在本地那般。RPC的核心观念是把分布式计算给简化掉 , 使得我们得以跨着网络去调用远程服务, 甚至于无需去操心底层网络的那些细节。简单来说 , 当它处在调用另一台计算机上方法的技术这个情况的时候 , 所产生的效果跟调用本地方法相类似。举个例子来讲标点符号。假定存在一个客户端程序, 其要去访问服务器之上的某种资源, 诸如用户信息之类的。借助RPC的方式, 那么客户端能够如同调用自身机器上面的方法那般, 对服务器所提供的“获取用户信息”这种方法进行远程调用。从客户端的视角来看, 它并不晓得此方法实际上是在另一台机器之上执行的, 所有的一切好似都是本地操作一样。RPC背后的核心目标RPC的目标在于让分布式系统里的方法调用变得简易, 借助RPC, 开发者无需去在意网络传输、数据格式转换等诸多细节, 仅需依照调用本地方法的那种状况来调用远程方法, 这样的透明化给分布式应用程序开发带来了极大的便利。RPC达成了如同“本地调用”这般的一种效果, 然而其实际上却是借助网络达成了远程方法的调用。2. 为什么使用RPC在分布式系统当中, 或者是微服务构架里面, 应用程序一般会被拆分成好多独立的服务, 每个服务都有可能运行在不一样的服务器之上。为了达成这些服务相互之间的通信, 我们能够采用RPC。以下是采用RPC的几个主要缘由呀:1. 解耦服务提升灵活性2. 简化网络通信3. 提高开发效率4. 便于跨语言、跨平台调用RPC给分布式系统赋予了强大的跨越服务、跨越语言的通信方面的能力, 对复杂的网络编程工作起到了简化的作用, 让多服务间的协作变得愈发自然。3. RPC的基本原理RPC这项工作的进程肉眼看似简易, 然大有乾坤实则涵括多个步骤, 在概念范畴之内, RPC能够清晰地划分成客户端请求以及服务器响应这两个部分状态, 我们首先要简略地知晓其完整大致程序先后序列。将每一步的工作机制进行细致入微地剖析研究处理。客户端请求, 客户端所进行的是调用一个“本地代理方法”, 此“本地代理方法”会达成将请求传递给远程服务器这样的行为。网络传输, 客户端把请求的数据借助网络发送至远程服务器。服务器处理, 服务器接到请求, 寻得相应的服务方法, 执行之后将结果回返过来。结果返回, 服务器把结果传回到客户端, 客户端予以接收并运用结果, 以此完成调用。关键组成部分。要实现这一流程RPC通常需要以下几个关键组成部分流程拆解我们再来看一下具体每一步发生了什么方法调用客户端代理序列化客户端代理数据传输网络传输解包与方法执行服务器代理返回结果RPC借助客户端代理, 以及服务器代理, 再加上网络传输的协同配合, 模拟出了“本地调用”的成效。其每一个步骤的背后, 皆为由RPC框架去完成繁杂的底层工作, 致使开发者无需去留意复杂的网络细节。4. Java中的RPC实现方式RMI 简介RMI是Java里面内置的RPC实现方式, 它能够让Java应用程序之间去调用远程对象, 这跟本地调用相类似, RMI仅仅支持Java语言, 所以在Java应用之间进行通信的时候相对便捷, 不过它只能被应用在Java环境里, 对跨语言调用形成了限制。特点使用场景简单远程调用, 像于单一Java环境里进行分布式处理、调用Java应用中的服务等情况, 小型Java系统之间适用RMI。然而, 因其性能以及跨语言局限性, 复杂的大规模微服务架构它并不适配。简介它是一种轻量级的, 二进制的RPC协议, 这种协议能支持Java和多种别的语言之间进行跨语言的调用, 它采用二进制格式去传输数据, 对于文本协议, 像JSON、XML而言, 它就具备更优的传输性能。特点使用场景是适宜跨语言且是轻量级分布式系统范畴内的, 特别是存在服务之间传输数量众多数据时这种情况, 其的二进制传输能够削减网络开销, 常常被应用于内部微服务通信领域, 像示例在Java与众多其他语言服务进行接口调用时, 是适合数据传输量比较大的应用场景的。Dubbo简介阿里巴巴开源的高性能Java RPC框架Dubbo, 在服务注册与发现、负载均衡、容错机制、监控等特性方面有所支持, 提供了更为完整的分布式服务治理功能 , 它不局限于RPC , 颇有益于构造复杂的微服务架构。特点使用场景杜波适用于大型微服务架构以及分布式系统, 尤其是那种有着服务治理需求以及负载均衡需要的繁复至极的系统。它在企业级分布式应用方面有着颇为广泛的适用性, 便比如电商系统之中的订单服务、支付服务之类的, 能够对服务的迅速扩展以及高性能方面的需求予以支持。三者对比与选择特性语言支持仅支持Java支持Java和其他语言主要支持Java序列化方式Java内置序列化二进制序列化支持多种协议和序列化性能较低较高高适合高并发服务治理有支持注册、发现、负载均衡等适用场景简单的Java远程调用跨语言轻量级RPC大型分布式系统、微服务架构要是对于多语言支持方面的需求程度比较高, 那就进行选择要是处于单一的Java微服务这种场景之下, 那就选择Dubbo。5.RMI、、Dubbo的实现详解RMI Java内置的RMI是种RPC实现方式, 它适合Java-to-Java的远程调用, 在RMI里, 服务器端的远程对象能够被客户端进行远程调用, 如同在本地调用那般, 下面, 我们借助四个步骤去实现RMI的基本过程。界定远程接口的达成途径: 点明到底是哪些方式能够被远程调用。对远程接口予以实现: 于服务器一端达成远程接口里的办法。开启RMI服务器: 着手把远程对象登记到RMI注册表当中, 以此供客户端去寻觅。客户端开展对远程方法的调用: 客户端借助RMI注册表查找相应远程对象, 进而调用方法。代码示例Step 1: 定义远程接口首先, 去界定出一个远程的接口, 使其继承自java.rmi. 且声明把它抛出, 就像举例来说, 我们去构建出一个接口。import java.rmi.Remote; import java.rmi.RemoteException; public interface HelloService extends Remote { String sayHello(String name) throws RemoteException; }Step 2: 实现远程接口在服务器端我们创建的实现类并实现其中的方法。import java.rmi.server.UnicastRemoteObject; import java.rmi.RemoteException; public class HelloServiceImpl extends UnicastRemoteObject implements HelloService { protected HelloServiceImpl() throws RemoteException { super(); } Override public String sayHello(String name) throws RemoteException { return Hello, name !; } }Step 3: 启动RMI服务器实例化那个会实现的类, 还要把这个已被实例化的类登记到RMI注册表里头, 如此一来, 客户端借助注册表就能找寻到这个远程对象了。import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class RMIServer { public static void main(String[] args) { try { HelloService service new HelloServiceImpl(); Registry registry LocateRegistry.createRegistry(1099); registry.bind(HelloService, service); System.out.println(RMI server is running...); } catch (Exception e) { e.printStackTrace(); } } }Step 4: 客户端调用远程方法在客户端连接到RMI注册表查找远程对象并调用方法。import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class RMIClient { public static void main(String[] args) { try { Registry registry LocateRegistry.getRegistry(localhost, 1099); HelloService service (HelloService) registry.lookup(HelloService); String response service.sayHello(Alice); System.out.println(Response from server: response); } catch (Exception e) { e.printStackTrace(); } } }它属于一个轻量级的二进制协议范畴, 具备支持跨语言调用的特性, 适用于在Java和其他语言之间展开通信, 其实现过程较为简单, 进行传输时数据体积较小, 序列化效率颇高, 以下便是其服务端以及客户端的实现步骤。有实现步骤, 要添加依赖, 比如引入Maven依赖, 还要定义远程接口跟实施, 好似编写接口类还有实现那别类。接着要配置, 把服务接口去暴露。客户端调用远程服务时, 客户端借由代理去调用那服务。代码示例Step 1: 添加依赖在Maven项目的pom.xml中加入以下依赖。com.caucho hessian 4.0.63com.caucho hessian 4.0.63Step 2: 定义远程接口和实现定义远程接口并实现它public interface HelloService { String sayHello(String name); }public class HelloServiceImpl implements HelloService { Override public String sayHello(String name) { return Hello, name !; } }Step 3: 配置在Web应用中使用将接口 暴露为远程服务。helloService com.caucho.hessian.server.HessianServlet home-api com.example.HelloService home-class com.example.HelloServiceImpl helloService /helloServicehelloService com.caucho.hessian.server.HessianServlet home-api com.example.HelloService home-class com.example.HelloServiceImpl helloService /helloServiceStep 4: 客户端调用远程服务客户端通过的代理远程服务。import com.caucho.hessian.client.HessianProxyFactory; public class HessianClient { public static void main(String[] args) { try { String url http://localhost:8080/helloService; HessianProxyFactory factory new HessianProxyFactory(); HelloService service (HelloService) factory.create(HelloService.class, url); String result service.sayHello(Alice); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } }DubboDubbo属高性能的这么一种Java RPC框架, 它在企业级微服务架构里有着广泛应用, 它具备服务治理功能, 该功能支持负载均衡、服务实现确定、做出熔断这类行为等功能, 对于大规模分布式操作系统来讲契合度较高。对实现步骤予以添加Dubbo以及依赖, 这个操作是引入Dubbo和依赖。针对定义远程接口和实现呢, 要编写服务接口以及实现类。对于配置Dubbo注册中心和服务而言, 需使用等注册中心去管理服务。而客户端调用远程服务时, 是借助Dubbo动态代理去调用服务。代码示例Step 1: 添加Dubbo和依赖在Maven项目的pom.xml中加入以下依赖org.apache.dubbo dubbo 2.7.8 org.apache.zookeeper zookeeper 3.5.7org.apache.dubbo dubbo 2.7.8 org.apache.zookeeper zookeeper 3.5.7Step 2: 定义远程接口和实现和前面类似定义接口和实现类。public interface HelloService { String sayHello(String name); }import org.apache.dubbo.config.annotation.Service; Service // Dubbo的Service注解 public class HelloServiceImpl implements HelloService { Override public String sayHello(String name) { return Hello, name !; } }Step 3: 配置Dubbo注册中心和服务Dubbo支持服务注册与发现通常使用作为注册中心。!-- Dubbo配置 --Step 4: 客户端调用远程服务客户端通过Dubbo的动态代理机制来调用远程服务。import org.apache.dubbo.config.ApplicationConfig; import org.apache.dubbo.config.ReferenceConfig; import org.apache.dubbo.config.RegistryConfig; public class DubboClient { public static void main(String[] args) { ReferenceConfig reference new ReferenceConfig(); reference.setApplication(new ApplicationConfig(HelloServiceConsumer)); reference.setRegistry(new RegistryConfig(zookeeper://localhost:2181)); reference.setInterface(HelloService.class); HelloService service reference.get(); String result service.sayHello(Alice); System.out.println(result); } }reference new ReferenceConfig(); reference.setApplication(new ApplicationConfig(HelloServiceConsumer)); reference.setRegistry(new RegistryConfig(zookeeper://localhost:2181)); reference.setInterface(HelloService.class); HelloService service reference.get(); String result service.sayHello(Alice); System.out.println(result); } }简要归纳, RMI适宜简单的Java到Java的调用, 它能够支持跨语言以及轻量级的远程调用, 而Dubbo则适用于大规模分布式系统, 还能提供服务治理功能。每一种实现的方式, 都存在着独特的使用场景, 在进行选择的时候, 能够依据系统的需求, 灵活地做出决定。上述这些乃是个人所拥有的经验, 期望可以给大伙一个可供参照的内容, 并且呢期望大伙能够多多给予脚本之家支持。