全部产品

基础模型

本文介绍在使用 SOFARPC 进行开发时会涉及的基础模型。

消息

内部全部使用 SofaRequestSofaResponse 进行传递。

如果需要转换为其它协议,那么在真正调用和收到请求的时候,转换为实际要传输的对象。

可以对 SofaRequestSofaResponse 进行写入操作的模块如下:

  • Invoker

  • Filter

  • ServerHandler

  • Serialization

对消息体是只读的模块如下:

  • Cluster

  • Router

  • LoadBalance

日志

日志的初始化也是基于扩展机制。虽然是扩展,但是由于日志的加载应该是最早的,所以在 rpc-config.json 里有一个单独的 Key。

{
//日志实现,日志早于配置加载,所以不能适应Extension机制
"logger.impl":"com.alipay.sofa.rpc.log.MiddlewareLoggerImpl"
}

配置项

使用者的 RPC 配置

用户的配置,例如端口配置(虽然已经开放对象中设置端口的字段,但是 SOFA 默认是从配置文件里取的),线程池大小配置等。

  • 通过 SofaConfigs 加载配置,调用 ExternalConfigLoader 读取外部属性。

  • 通过 SofaConfigs 提供的 API 进行获取。

  • 所有内部配置的Key都在 SofaOptions 类。

  • 优先级: System.property > sofa-config.properties(每个应用一个)> rpc-config.properties

RPC 框架配置

框架自身的配置,例如默认序列化,默认超时等。

  • 通过 RpcConfigs 加载配置文件。

  • 通过 RpcConfigs 其提供的 API 进行获取和监听数据变化。

  • 所有内部配置的Key都在 RpcOptions 类。

  • 优先级: System.property > custom rpc-config.json(可能存在多个自定义,会排序)> rpc-config-default.json

常量

  • 全局的基本常量在 RpcConstants 中,例如:

    • 调用方式:sync、oneway

    • 协议 bolt/grpc、序列化 hessian/java/protobuf

    • 上下文的 key

  • 如果扩展实现自身的常量,请自行维护。

    • 例如 BOLT 协议的常量。

      • SERIALIZE_CODE_HESSIAN = 1

      • PROTOCOL_TR = 13

  • 例如 DSR 配置中心相关的常量。

    • _WEIGHT、_CONNECTTIMEOUT 这种配置中心特有的 key。

地址

  • 地址信息放到 ProviderInfo 类中

  • ProviderInfo 的值主要分为三部分:

    • 字段:一般是一些必须项目,例如 IP、端口、状态等

    • 静态字段:例如应用名

    • 动态字段:例如预热权重等

  • 字段枚举维护在 ProviderInfoAttrs 类中