业务场景:由于多个业务系统都实现了同一个服务,在调用中通过读取相关配置可以知道此次调用是限制请求到哪几个服务提供者上,而不是所有提供者中任取一个,这个就需要在dubbo上自定义自己的路由规则。
具体做法:实现Router接口,重写route方法,从注册中心所有服务提供者列表中选出符合规范的提供者列表并返回即可。
public class LimitIpRouter implements Router{ private final static Logger logger = LogManager.getLogger(LimitIpRouter.class); @Override public List<Provider> route(Invocation invocation, List<Provider> providers) { providers.stream().forEach(provider -> logger.info("provider:"+provider.toUrl())); //获取参数中的限制ip列表 String limitIps = getLimitIps(invocation); return providers.stream().filter(provider -> StringUtils.contains(limitIps, provider.getIp())).collect(Collectors.toList()); } }
同样,基于 SPI 机制, 需要添加 configfile
sgpScriptRouter=com.mobanker.sgpagent.client.dubbo.router.SgpScriptRouterFactory