SOFA RPC学习
第一章:SOFA RPC 架构总览
1.1 框架背景与定位
SOFA RPC(Scalable Open Financial Architecture Remote Procedure Call)是蚂蚁集团开源的高性能、高可扩展性的分布式服务框架,作为 SOFAStack 微服务体系的核心组件之一,为金融级分布式应用提供了可靠的远程通信能力。其设计目标包括:
-
高性能:支持百万级 TPS 的请求处理能力
-
高可用:提供完善的容错、负载均衡和服务治理机制
-
可扩展:基于 SPI 机制支持组件的灵活替换和扩展
-
多语言:支持 Java、Go、Python 等多种语言的客户端
1.2 整体架构设计
SOFA RPC 采用分层架构设计,从逻辑上可分为以下几层:
┌─────────────────────────────────────────────────────────────┐ │ 应用层 │ │ (业务代码) │ ├─────────────────────────────────────────────────────────────┤ │ API层 │ │ (ServiceProxy, Config) │ ├─────────────────────────────────────────────────────────────┤ │ 核心层 │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ Config │ │ Registry │ │ Cluster │ │ Filter │ │ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 扩展层 │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ Transport │ │Serialization│ │ Metrics │ │Fault-Tolerance│ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 基础层 │ │ (Common, SPI, Util) │ └─────────────────────────────────────────────────────────────┘
1.3 核心模块功能
1.3.1 Config 模块
Config 模块是 SOFA RPC 的配置中心,负责管理服务提供者和消费者的各种配置参数。主要包括:
-
服务配置类:ProviderConfig、ConsumerConfig
-
协议配置类:ProtocolConfig
-
服务器配置类:ServerConfig
-
注册中心配置类:RegistryConfig
-
过滤器配置类:FilterConfig
这些配置类通过链式调用的方式进行配置,例如:
ProviderConfig<HelloService> providerConfig = new ProviderConfig<>()
.setInterfaceId(HelloService.class.getName())
.setRef(new HelloServiceImpl())
.setServer(new ServerConfig().setPort(12200))
.setRegistry(new RegistryConfig().setAddress("zookeeper://127.0.0.1:2181"))
.setWeight(100);
1.3.2 Registry 模块
Registry 模块实现了服务的注册与发现功能,支持多种注册中心:
-
ZooKeeper
-
Nacos
-
Eureka
-
Redis
-
Consul
注册中心的核心接口是Registry,主要方法包括:
public interface Registry {
// 服务注册
void register(ProviderInfo providerInfo);
// 服务注销
void unRegister(ProviderInfo providerInfo);
// 服务订阅
void subscribe(ConsumerInfo consumerInfo, NotifyListener listener);
// 服务取消订阅
void unSubscribe(ConsumerInfo consumerInfo, NotifyListener listener);
// 服务查询
List<ProviderGroup> lookup(ConsumerInfo consumerInfo);
// 注册中心启动
void init();
// 注册中心销毁
void destroy();
}
1.3.3 Cluster 模块
Cluster 模块负责集群管理,包括负载均衡、容错策略和服务路由等功能。主要组件包括:
-
Cluster:集群接口,定义了服务调用的核心逻辑
-
LoadBalancer:负载均衡接口,提供多种负载均衡策略
-
ProviderGroup:服务提供者分组,用于隔离不同环境的提供者
Cluster 接口的核心方法是invoke,负责处理服务调用请求:
public interface Cluster {
// 集群初始化
void init();
// 集群销毁
void destroy();
// 更新服务提供者
void updateAllProviders(List<ProviderGroup> providerGroups);
// 服务调用
SofaResponse invoke(SofaRequest request) throws SofaRpcException;
}
1.3.4 Filter 模块
Filter 模块实现了 AOP 增强机制,允许在服务调用前后执行额外的逻辑。主要组件包括:
-
Filter:过滤器接口,定义了请求处理方法
-
FilterChain:过滤器链,管理多个过滤器的执行顺序
Filter 接口的核心方法是invoke,用于处理请求:
public interface Filter {
// 是否启用该过滤器
boolean needToLoad(FilterInvoker invoker);
// 过滤器执行方法
SofaResponse invoke(FilterInvoker invoker, SofaRequest request) throws SofaRpcException;
// 异步响应处理
void onAsyncResponse(FilterInvoker invoker, SofaRequest request, SofaResponse response, Throwable throwable);
}
1.3.5 Remoting 模块
Remoting 模块负责底层的网络通信,支持多种协议:
-
Bolt:蚂蚁自研的高性能二进制协议
-
REST:基于 HTTP 的 RESTful 协议
-
gRPC:基于 HTTP/2 的高性能远程调用协议
-
Dubbo:兼容 Apache Dubbo 的协议
主要组件包括:
-
Server:服务器接口,负责接收客户端请求
-
ClientTransport:客户端传输接口,负责发送请求到服务器
-
Channel:网络通道接口,抽象了底层的网络连接
Server 接口的核心方法包括:
public interface Server {
// 服务器启动
void start() throws SofaRpcException;
// 服务器停止
void stop() throws SofaRpcException;
// 注册请求处理器
void registerProcessor(ProviderConfig providerConfig, Invoker invoker);
// 注销请求处理器
void unRegisterProcessor(String interfaceId);
// 判断服务器是否已启动
boolean isStarted();
}
第二章:服务注册源码深度解析
2.1 服务注册流程概述
服务注册是 SOFA RPC 的核心功能之一,主要流程包括:
-
服务提供者初始化配置
-
启动服务器监听请求
-
构建服务元数据
-
向注册中心注册服务
-
注册中心存储服务信息
2.2 关键类与接口详解
2.2.1 ProviderConfig 类
ProviderConfig 是服务提供者的配置类,继承自 AbstractInterfaceConfig,主要属性包括:
public class ProviderConfig<T> extends AbstractInterfaceConfig<T, ProviderConfig<T>> {
// 服务实现类
private T ref;
// 服务器配置列表
private List<ServerConfig> server;
// 注册中心配置列表
private List<RegistryConfig> registry;
// 服务权重
private Integer weight = Constants.DEFAULT_WEIGHT;
// 最大并发调用数
private Integer actives = Constants.DEFAULT_ACTIVES;
// 超时时间
private Integer timeout = Constants.DEFAULT_TIMEOUT;
// 是否注册到注册中心
private Boolean register = true;
// 服务分组
private String group = Constants.DEFAULT_GROUP;
// 服务版本
private String version = Constants.DEFAULT_VERSION;

最低0.47元/天 解锁文章
461

被折叠的 条评论
为什么被折叠?



