【RPC】市面上有哪些 RPC 框架?Dubbo 实战 + 手写 RPC 框架,彻底搞懂分布式调用!

2025-06-03 18:26:58 世界杯经典歌曲

市面上有哪些 RPC 框架?Dubbo 实战 + 手写 RPC 框架,彻底搞懂分布式调用!

大家好!今天我们来聊聊 RPC 框架。RPC(Remote Procedure Call,远程过程调用)是分布式系统中非常重要的技术,它允许程序调用远程服务就像调用本地方法一样简单。本文将分为三部分:

市面上有哪些 RPC 框架?Dubbo 框架代码实战。手写一个简单的 RPC 框架(Java 实现)。

通过这篇文章,你将彻底搞懂 RPC 的原理,并学会如何使用 Dubbo 和自己实现一个 RPC 框架!如果你对分布式系统、微服务架构感兴趣,这篇文章一定不要错过!

1. 市面上有哪些 RPC 框架?

目前市面上有很多成熟的 RPC 框架,以下是几个主流的 RPC 框架及其特点:

1.1 Dubbo

开发者:阿里巴巴特点:

高性能、轻量级。支持服务注册与发现、负载均衡、容错机制。生态完善,支持多种注册中心(如 Zookeeper、Nacos)。 适用场景:大型分布式系统。

1.2 gRPC

开发者:Google特点:

基于 HTTP/2 协议,性能高。支持多种语言(如 Java、Go、Python)。使用 Protocol Buffers 作为序列化工具。 适用场景:跨语言、高性能的微服务架构。

1.3 Thrift

开发者:Apache特点:

支持多种语言(如 Java、C++、Python)。提供完整的 RPC 解决方案,包括序列化、传输协议等。 适用场景:跨语言、高并发的分布式系统。

1.4 Spring Cloud

开发者:Pivotal特点:

基于 Spring Boot,集成 Spring 生态。提供完整的微服务解决方案(如服务注册与发现、配置中心、负载均衡)。 适用场景:基于 Spring 的微服务架构。

1.5 Motan

开发者:新浪微博特点:

轻量级、高性能。支持服务注册与发现、负载均衡、容错机制。 适用场景:中小型分布式系统。

2. Dubbo 框架代码实战

Dubbo 是阿里巴巴开源的高性能 RPC 框架,广泛应用于分布式系统中。下面我们通过一个简单的示例,快速上手 Dubbo。

2.1 引入依赖

在 Maven 项目中引入 Dubbo 依赖:

org.apache.dubbo

dubbo

2.7.8

org.apache.zookeeper

zookeeper

3.7.0

org.apache.curator

curator-framework

5.1.0

2.2 定义服务接口

定义一个简单的服务接口:

public interface GreetingService {

String sayHello(String name);

}

2.3 实现服务

实现服务接口:

public class GreetingServiceImpl implements GreetingService {

@Override

public String sayHello(String name) {

return "Hello, " + name;

}

}

2.4 发布服务

通过 Dubbo 发布服务:

import org.apache.dubbo.config.ApplicationConfig;

import org.apache.dubbo.config.ProtocolConfig;

import org.apache.dubbo.config.RegistryConfig;

import org.apache.dubbo.config.ServiceConfig;

public class Provider {

public static void main(String[] args) throws Exception {

// 服务实现

GreetingService greetingService = new GreetingServiceImpl();

// 应用配置

ApplicationConfig application = new ApplicationConfig();

application.setName("dubbo-demo-provider");

// 注册中心配置

RegistryConfig registry = new RegistryConfig();

registry.setAddress("zookeeper://127.0.0.1:2181");

// 协议配置

ProtocolConfig protocol = new ProtocolConfig();

protocol.setName("dubbo");

protocol.setPort(20880);

// 服务配置

ServiceConfig service = new ServiceConfig<>();

service.setApplication(application);

service.setRegistry(registry);

service.setProtocol(protocol);

service.setInterface(GreetingService.class);

service.setRef(greetingService);

// 发布服务

service.export();

System.out.println("Service published.");

System.in.read(); // 按任意键退出

}

}

2.5 调用服务

通过 Dubbo 调用服务:

import org.apache.dubbo.config.ApplicationConfig;

import org.apache.dubbo.config.ReferenceConfig;

import org.apache.dubbo.config.RegistryConfig;

public class Consumer {

public static void main(String[] args) {

// 应用配置

ApplicationConfig application = new ApplicationConfig();

application.setName("dubbo-demo-consumer");

// 注册中心配置

RegistryConfig registry = new RegistryConfig();

registry.setAddress("zookeeper://127.0.0.1:2181");

// 引用配置

ReferenceConfig reference = new ReferenceConfig<>();

reference.setApplication(application);

reference.setRegistry(registry);

reference.setInterface(GreetingService.class);

// 获取代理对象

GreetingService greetingService = reference.get();

System.out.println(greetingService.sayHello("World")); // 输出: Hello, World

}

}

3. 手写一个简单的 RPC 框架

为了更好地理解 RPC 的工作原理,我们可以手写一个简单的 RPC 框架。以下是实现步骤:

3.1 定义 RPC 接口

首先,我们定义一个简单的 RPC 接口:

public interface RpcService {

String sayHello(String name);

}

3.2 实现服务

接下来,我们实现这个接口:

public class RpcServiceImpl implements RpcService {

@Override

public String sayHello(String name) {

return "Hello, " + name;

}

}

3.3 实现服务端

服务端负责监听客户端请求,并调用相应的服务方法:

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class RpcServer {

public static void main(String[] args) throws Exception {

// 创建服务端 Socket

ServerSocket serverSocket = new ServerSocket(8080);

System.out.println("Server started.");

while (true) {

// 接受客户端连接

Socket socket = serverSocket.accept();

System.out.println("Client connected.");

// 处理请求

try (ObjectInputStream input = new ObjectInputStream(socket.getInputStream());

ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream())) {

// 读取方法名和参数

String methodName = input.readUTF();

String parameter = input.readUTF();

// 调用服务

RpcService service = new RpcServiceImpl();

String result = service.sayHello(parameter);

// 返回结果

output.writeUTF(result);

output.flush();

}

}

}

}

3.4 实现客户端

客户端负责向服务端发送请求,并接收服务端的响应:

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.Socket;

public class RpcClient {

public static void main(String[] args) throws Exception {

// 创建客户端 Socket

Socket socket = new Socket("127.0.0.1", 8080);

// 发送请求

try (ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());

ObjectInputStream input = new ObjectInputStream(socket.getInputStream())) {

// 发送方法名和参数

output.writeUTF("sayHello");

output.writeUTF("World");

output.flush();

// 接收结果

String result = input.readUTF();

System.out.println("Result: " + result); // 输出: Result: Hello, World

}

}

}

4. 总结

市面上有哪些 RPC 框架? 主流的 RPC 框架包括 Dubbo、gRPC、Thrift、Spring Cloud 和 Motan,它们各有特点,适用于不同的场景。

Dubbo 实战 通过 Dubbo 的代码实战,我们快速掌握了如何使用 Dubbo 发布和调用服务。

手写 RPC 框架 通过手写一个简单的 RPC 框架,我们深入理解了 RPC 的工作原理。虽然这个框架非常简单,但它涵盖了 RPC 的核心思想。

希望这篇文章能帮助你更好地理解 RPC 技术!如果你有任何问题或想法,欢迎在评论区留言!