开发者社区 > 云原生 > 正文

消费者端invoker.getUrl().getParameter("application.ver

环境:dubbo 3.0.8 + nacos 2.1.0 需求概述:自定义路由,根据前端传的参数,动态选择符合条件的provider

consumer端配置: dubbo.application.version=comsumer-1.0.0 provider老版本配置: dubbo.application.version=provider-1.0.0 provider新版本配置: dubbo.application.version=provider-2.0.0

provider端新老版本同时提供服务,根据前端的version参数,动态调用对应的provider

以下为自定义路由的伪代码:

@Activate(group = CommonConstants.CONSUMER) public class MyRouterFactory extends CacheableRouterFactory {

@Override
protected Router createRouter(URL url) {
    return new MyRouter();
}

}

public class MyRouter extends AbstractRouter {

public MyRouter() {
    setPriority(100);
}

@Override
public <T> RouterResult<Invoker<T>> route(List<Invoker<T>> invokers, URL url, Invocation invocation, boolean needToPrintMessage) throws RpcException {
    // 前端动态传递的版本号
    String version = RpcContext.getServiceContext().getAttachment("version");
    if (StrUtil.isNotEmpty(version)) {
        // 符合条件的invokers
        List<Invoker<T>> targetInvokers = new ArrayList<>();

        for(Invoker<T> invoker: invokers) {
            // **问题:这里取到的版本号,始终是consumer端的comsumer-1.0.0,而不是期望的provider-1.0.0/provider-2.0.0**
            String currentVersion = invoker.getUrl().getParameter("application.version");

            // TODO 根据provider的版本号判断是否符合
            // ...
        }
        return new RouterResult<>(targetInvokers);
    }
    return new RouterResult<>(invokers);
}

}

按理List invokers是所有可调用的provider集合,但为何里面的参数信息,不是对应的provider端的,该如何才能取到呢?

原提问者GitHub用户guipengfei

展开
收起
大圣东游 2023-05-11 15:42:27 132 0
1 条回答
写回答
取消 提交回答
  • 因为默认消费端优先。 你可以自己扩展一个 ProviderFirstParams 的实现,可以参考 DefaultProviderFirstParams 这个,将你要的字段设置为服务端优先就可以获取到了

    原回答者GitHub用户liufeiyu1002

    2023-05-12 10:16:35
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载