Dubbo 实现一个Load Balance (用于灰度发布)
Dubbo 可以实现的扩展很多, 官方文档在这: https://dubbo.apache.org/zh/docs/v2.7/dev/impls/ (太简单了....)
下面我们实现一个Load Balance, 它会根据参数中的workzone来选择合适的Invoker实例, 可以实现一定程度上的灰度发布.
package com.cnscud.dubboroom.base.dubbo;
import org.apache.commons.lang.StringUtils;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.cluster.loadbalance.AbstractLoadBalance;
import org.apache.dubbo.rpc.cluster.loadbalance.RandomLoadBalance;
import org.apache.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* My Round robin load balance by workzone.
*/
public class MyDubboLoadBalancer extends AbstractLoadBalance {
private static Logger logger = LoggerFactory.getLogger(MyDubboLoadBalancer.class);
protected static RoundRobinLoadBalance roundRobinLoadBalance = new RoundRobinLoadBalance();
protected static RandomLoadBalance randomLoadBalance = new RandomLoadBalance();
public static final String NAME = "mylbl";
protected static String ZONE_KEY = "workzone";
protected RoundRobinLoadBalance getRoundRobinLoadBalance() {
return roundRobinLoadBalance;
}
protected RandomLoadBalance getRandomLoadBalance() {
return randomLoadBalance;
}
public MyDubboLoadBalancer() {
logger.info("MyDubboLoadBalancer 已启动...");
}
@Override
protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) {
//Object[] args = invocation.getArguments();
String workzone = invocation.getAttachment("workzone");
logger.info("url::::" + url);
logger.info("parameters: " + Arrays.toString(invocation.getArguments()));
logger.info("attachments: " + invocation.getAttachments());
List<Invoker<T>> newInvokerList = new ArrayList<>();
if (StringUtils.isEmpty(workzone)) {
//默认走RoundRobin的策略
return getRoundRobinLoadBalance().select(invokers, url, invocation);
}
//选择特定服务器
for (Invoker<T> invoker : invokers) {
URL serviceUrl = invoker.getUrl();
logger.info("loop serviceUrl: " + serviceUrl.toIdentityString() + " " + serviceUrl.getParameters() + ", port: " + serviceUrl.getPort());
if (serviceUrl.hasParameter(ZONE_KEY) && workzone!=null && workzone.equalsIgnoreCase(serviceUrl.getParameter(ZONE_KEY))) {
logger.info("find match invoker for workzone: " + workzone + " ip: " + serviceUrl.getIp() + " port: " + serviceUrl.getPort());
newInvokerList.add(invoker);
}
}
if (!newInvokerList.isEmpty()) {
return getRoundRobinLoadBalance().select(newInvokerList, url, invocation);
}
else {
logger.info("not find invoker for workzone: " + workzone);
return getRoundRobinLoadBalance().select(invokers, url, invocation);
}
}
}
声明 Load Balance: 文件名: META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance
mylbl=com.cnscud.dubboroom.base.dubbo.MyDubboLoadBalancer
在dubbo设置里声明:
dubbo:
consumer:
loadbalance: mylbl
这样就可以生效了......
(仅供参考!!)
Dubbo 实现一个Load Balance (用于灰度发布)的更多相关文章
- Dubbo 实现一个Route Factory(用于灰度发布)
Dubbo 可以实现的扩展很多, 官方文档在这: https://dubbo.apache.org/zh/docs/v2.7/dev/impls/ (太简单了....) 下面我们实现一个Route F ...
- dubbo的灰度发布
1,什么是灰度发布 当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用. 可以按照以下的步骤进行版本迁移: 在低压力时间段,先升级一半提供者为新版本 再将所有消费者升级为 ...
- 利用nginx+lua+memcache实现灰度发布
一.灰度发布原理说明 灰度发布在百度百科中解释: 灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式.AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什 ...
- 亲密接触Redis-第三天(Redis的Load Balance)
前言 上两天讲述了Redis的基本搭建和基于HA的集群布署方式以及相关的策略和注意点.今天开始讲述Redis的Cluster功能,而这块目前来说网上资料不是太全,就算有1,2篇也只是单讲服务端的搭建也 ...
- Neutron: Load Balance as a Service(LBaaS)负载均衡
load balancer 负责监听外部的连接,并将连接分发到 pool member. LBaaS 有三个主要的概念: Pool Member,Pool 和 Virtual IP Pool M ...
- Spark 灰度发布在十万级节点上的成功实践 CI CD
原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/spark/ci_cd/ 本文所述内容基于某顶级互联网公司数万节点下 Sp ...
- 蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别(转)
出处:https://www.baidu.com/link?url=QjboallwNm_jxcL3fHG57wEakiBfAs_3-TChTGu1eBXstlHEsGBc-NDA7AKTqsiroB ...
- 【nginx】nginx:利用负载均衡原理实现代码的热部署和灰度发布
事情起因很简单,代码的改动量很大.而且刚接手服务器,对原有的代码进行了一定程度的重构.虽然在测试服务器上做了较多的测试工作,但是直接将代码送入生产环境还是不放心,万一配置出问题服务直接崩溃怎么解?万一 ...
- A/B测试与灰度发布
1.A/B测试与灰度发布的理论 产品是多维度的,设计体验.交互体验.系统质量.运营支持等等, 测试的目的是为了系统最终的交付,一套各方面都足够好的系统,而不是文档上定义的系统,系统是需要不断进化的. ...
随机推荐
- centos7安装JDK、CentOS
1.安装JDK 1.1查看系统是否已有自带的JDK rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj 1.2卸载已有安装 如果没有输出信息, ...
- Java并发之ReentrantLock源码解析(三)
ReentrantLock和BlockingQueue 首先,看到这个标题,不要怀疑自己进错文章,也不要怀疑笔者写错,哈哈.本章笔者会从BlockingQueue(阻塞队列)的角度,看看juc包下的阻 ...
- 14、web服务器介绍
14.1.用户访问网站流程: 1. dns解析原理: 客户端到dns服务器之间的查询为递归查询: dns服务器到根域名服务器的查询是迭代查询: [lc@m01 ~]$ dig www.baidu.co ...
- 3、dns服务搭建
3.1.dns服务简介: 1.DNS(Domain Name System)域名系统. 目前提供网络服务的应用使用唯一的32位的IP地址来标识,但是由于数字比较复杂.难以记忆,因此产生了域名系统(DN ...
- activiti版本下载
activiti工作流历史各个版本下载地址修改版本号后在浏览器地址栏回车即可 例如: https://github.com/Activiti/Activiti/releases/download/ac ...
- API安全综述
API安全综述 译自:An Overview on API Security. 本文概括了API防护有关的方方面面,从上层视角介绍了API防护中主要注意的点,并给出了相应的建议.本文可以作为一个API ...
- php混淆加密解密实战
在查看别人的php源码的时候,我们经常会看到加密后的php代码.那么php加密原理是什么呢?怎么解密呢? 混淆加密 我们从百度随便搜索一个加密网站,例如:http://dezend.qiling.or ...
- Java实验项目三——平面图形和立体图形抽象类
Program:按照下面要求完成类的设计 (1)设计一个平面图形抽象类和一个立体图形抽象类,提供该类对象公共的方法和属性. (2)修改项目三中第2题中所设计的球类.圆柱类,圆锥类.矩形类.三角形类.圆 ...
- OpenFlow协议分析
OpenFlow协议分析实验手册 启动虚拟机mininet 和 控制器 ODL 启动wireshark,在控制器的ens32 网卡抓包 使用mininet创建简单拓扑,并连接控制器,指定交换机为ovs ...
- Kotlin Coroutine(协程): 三、了解协程
@ 目录 前言 一.协程上下文 1.调度器 2.给协程起名 3.局部变量 二.启动模式 CoroutineStart 三.异常处理 1.异常测试 2.CoroutineExceptionHandler ...