自定义 Router

SOFARPC 中对服务地址的选择也抽象为了一条处理链,由每一个 Router 进行处理。同 Filter 一样, SOFARPC 对 Router 提供了同样的扩展能力。本文介绍如何自定义 Router 类。

自定义 Router 类的流程如下:

实现自定义 Router 类

自定义 Router 类时,需继承 com.alipay.sofa.rpc.client.Router类:

@Extension(value ="customerRouter")
@AutoActive(consumerSide =true)
public class CustomerRouter extends Router {

    @Override
    public void init(ConsumerBootstrap consumerBootstrap) {

    }
    @Override
    public boolean needToLoad(ConsumerBootstrap consumerBootstrap) {
        return true;
    }
    @Override
    public List<ProviderInfo> route(SofaRequest request, List<ProviderInfo> providerInfos) {
        return providerInfos;
    }
}

RPC 框架支持通过 @Extension 注解来扩展 Router,并且可以覆盖重名的 Router。如需覆盖原有 Router,需将 @Extensionoverride 置为 true,并确保 order 属性值大于要覆盖的重名 Router。未配置 order 属性时,默认为 0。

如上自定义了一个 CustomerRouter ,生效于所有消费者。其中:

  • init 参数 ConsumerBootstrap 是引用服务的包装类,能够拿到 ConsumerConfig、代理类、服务地址池等对象。

  • needToLoad 表示是否生效该 Router。route 方法即筛选地址的方法。

将自定义 Router 类配置到 RPC 架构

基于 SOFARPC 的 SPI 机制,您需要在类路径中新建扩展文件 META-INF/services/sofa-rpc/com.alipay.sofa.rpc.client.Router,将自定义的 Router 类配置到 RPC 架构。内容示例如下:

customerRouter=com.alipay.sofa.rpc.custom.CustomRouter
注意

resource 内的目录和文件名需要遵守如下固定规则:Image 1