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,需将 @Extension 中 override 置为 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 内的目录和文件名需要遵守如下固定规则:
该文章对您有帮助吗?