自定义 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,需将 @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
内的目录和文件名需要遵守如下固定规则: