sofa rpc 源码阅读

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 的核心功能之一,主要流程包括:

  1. 服务提供者初始化配置

  2. 启动服务器监听请求

  3. 构建服务元数据

  4. 向注册中心注册服务

  5. 注册中心存储服务信息

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;
    
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值