写点什么

Dubbo 服务治理之灰度发布方案(版本发布控制影响范围)

作者:Java高工P7
  • 2021 年 11 月 09 日
  • 本文字数:1586 字

    阅读完需:约 5 分钟

各个项目,各个服务需要根据自身的需求,定义如下脚本:


/**


  • DemoService router,针对不同的方法,可能需要各自提供,主要是参数的获取,不同的过滤规则

  • 针对参数进行路由过滤

  • 本示例针对 DemoSerivce# ResponseResult createUser(User user) 方法,根据 user 的 orgId 进行路由选择

  • @param invokers

  • @param invocation

  • @param context

  • @returns


*/


function demoService_createUser_router(invokers, invocation, context) {


if(invokers == null || invokers.size() < 1) {


return invokers;


}


if(!"createUser".equals(invocation.getMethodName())) { // 如果方法不匹配,默认无条件通过该路由规则


return invokers;


}


var availableInvokers = new java.util.ArrayList(invokers.size());


for (var i=0;i<invokers.size(); i++) { // 先选择可用的服务提供者列表


if(invokers.get(i).isAvailable()) {


availableInvokers.add(invokers.get(i));


}


}


var invArguments = invocation.getArguments();


if(invArguments == null || invArguments.length == 0) { // 如果参数为空,无法根据参数进行路由选择


return availableInvokers;


}


// 获取需要进行路由的参数,这里使用第一个参数 ,这里各自根据各自的业务 进行获取,本实例默认使用第一个参数


var firstArgument = invArguments[0];


var orgId = firstArgument == null ? "" : firstArgument.getOrgId();


if(orgId == 1 || orgId == "1") { // 如果 orgId == 1 ,只走最后一个节点,其余的走其他节点


var selectInvokers = new java.util.ArrayList(1);


selectInvokers.add(availableInvokers.get(availableInvokers.size()-1));


return selectInvokers;


} else {


var selectInvokers = new java.util.ArrayList(availableInvokers.size()-1);


for(var i=0;i<availableInvokers.size()-1; i++) {


selectInvokers.add(availableInvokers.get(i));


}


return selectInvokers;


}


}


3.2 向注册中心注册 JS 脚本路由规则


上文已经说明,目前的 dubbo-admin 不支持在界面上注册路由规则,现给出基于 JAVA 代码来编写注册程序:


public static void main(String[] args) throws Exception{


URL registryUrl = URL.valueOf("zookeeper://127.0.0.1:2181");


ZookeeperRegistryFactory zookeeperRegistryFactory = new


ZookeeperRegistryFactory();


zookeeperRegistryFactory.setZookeeperTransporter(new


CuratorZookeeperTransporter());


Registry zookeeperRegistry = (ZookeeperRegistry)


zookeeperRegistryFactory.createRegistry(registryUrl);


URL routerURL =


URL.valueOf("script://0.0.0.0/com.alibaba.dubbo.demo.Demo


Serv


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


ice?category=routers&dynamic=false&enabled=true&fo


rce=false&name=demoService_createUser_router&priority=


0&runtime=true");


routerURL = routerURL.addParameter("rule",


URL.encode(get_demoService_createUser_router()));


zookeeperRegistry.register(routerURL); // 注册


// zookeeperRegistry.unregister(routerURL); // 取消注册


}


一旦运行上述代码,将会动态注册 URL,服务提供者无需重启,下次服务调用后会自动生效(其背后原理是基于注册中心的动态发现)。


上述示例代码,我已经在本地环境,已能成功运行,并达到预期效果,公司项目需要根据自身的特点,特别服务方法的参数(例如合作伙伴 ID 的获取方式),以及路由需求来定制编写其路由脚本(js 脚本)。


3.3 总结


上述展示了 Dubbo 服务基于业务灰度发布的方案,以及基于合作伙伴的服务隔离机制(根据服务调用业务参数来决定服务调用者的筛选)。主要是展示了基于脚步的路由规则,其条件表达式的路由规则请参考其 Demo,其核心理论支持是 Dubbo 提供的 Router,在进行负载均衡前,根据路由规则对服务提供者列表进行筛选。




用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Dubbo服务治理之灰度发布方案(版本发布控制影响范围)