Dubbo Admin 权重动态调整

开篇


provider侧权重调整

provider侧权重调整
  • 提供者provider侧权重调整在提供者这栏通过倍权或者半权进行调整。


consumer侧权重调整

consumer侧权重调整
  • 消费者consumer侧权重调整在消费者这栏通过编辑进行调整。


权重调整记录

权重调整记录
  • provider和consumer侧的权重调整记录在权重调节栏展示。
  • 权重调节栏的新增功能个人感觉没有什么用,因为如果针对consumer侧的权重调整必须填写的是consumer的ip地址而不是provider的ip地址,所以这个功能持保留意见。


Provider侧权重调整流程分析

public class ProviderServiceImpl extends AbstractService implements ProviderService {

    public void setWeight(Long id, float factor) {
        if (id == null) {
            throw new IllegalStateException("no provider id");
        }
        Provider oldProvider = findProvider(id);
        if (oldProvider == null) {
            throw new IllegalStateException("Provider was changed!");
        }
        Map<String, String> map = StringUtils.parseQueryString(oldProvider.getParameters());
        String weight = map.get(Constants.WEIGHT_KEY);
        // 针对provider是动态注册的场景
        if (oldProvider.isDynamic()) {
            // 根据service名和provider的地址获取overrides信息。
            List<Override> overrides = overrideService.findByServiceAndAddress(oldProvider.getService(), oldProvider.getAddress());
            // 针对第一次添加override的场景处理
            if (overrides == null || overrides.size() == 0) {
                int value = getWeight(weight, factor);
                if (value != Constants.DEFAULT_WEIGHT) {
                    Override override = new Override();
                    override.setAddress(oldProvider.getAddress());
                    override.setService(oldProvider.getService());
                    override.setEnabled(true);
                    override.setParams(Constants.WEIGHT_KEY + "=" + String.valueOf(value));
                    overrideService.saveOverride(override);
                }
            } else {
                // 针对非第一次添加override的场景处理
                for (Override override : overrides) {
                    Map<String, String> params = StringUtils.parseQueryString(override.getParams());
                    String overrideWeight = params.get(Constants.WEIGHT_KEY);
                    if (overrideWeight == null || overrideWeight.length() == 0) {
                        overrideWeight = weight;
                    }
                    int value = getWeight(overrideWeight, factor);
                    if (value == getWeight(weight, 1)) {
                        params.remove(Constants.WEIGHT_KEY);
                    } else {
                        params.put(Constants.WEIGHT_KEY, String.valueOf(value));
                    }
                    if (params.size() > 0) {
                        override.setParams(StringUtils.toQueryString(params));
                        overrideService.updateOverride(override);
                    } else {
                        overrideService.deleteOverride(override.getId());
                    }
                }
            }
        } else {
            // 针对provider是非动态注册的场景
            int value = getWeight(weight, factor);
            if (value == Constants.DEFAULT_WEIGHT) {
                map.remove(Constants.WEIGHT_KEY);
            } else {
                map.put(Constants.WEIGHT_KEY, String.valueOf(value));
            }
            oldProvider.setParameters(StringUtils.toQueryString(map));
            updateProvider(oldProvider);
        }
    }
}
  • provider侧的权重调整根据provider的service名称和address的地址查找是否有对应的overrides规则。
  • 如果之前没有任何overrides规则,那么就执行saveOverride的save操作。
  • 如果之前有overrides规则,那么就执行updateOverride的update操作。


Consumer侧权重调整流程分析

public class Consumers extends Restful {

    public boolean update(Consumer newConsumer, Map<String, Object> context) {
        Long id = newConsumer.getId();
        String parameters = newConsumer.getParameters();
        Consumer consumer = consumerService.findConsumer(id);
        if (consumer == null) {
            context.put("message", getMessage("NoSuchOperationData", id));
            return false;
        }
        String service = consumer.getService();
        if (!super.currentUser.hasServicePrivilege(service)) {
            context.put("message", getMessage("HaveNoServicePrivilege", service));
            return false;
        }
        Map<String, String> oldMap = StringUtils.parseQueryString(consumer.getParameters());
        Map<String, String> newMap = StringUtils.parseQueryString(parameters);
        for (Map.Entry<String, String> entry : oldMap.entrySet()) {
            if (entry.getValue().equals(newMap.get(entry.getKey()))) {
                newMap.remove(entry.getKey());
            }
        }
        String address = consumer.getAddress();
        List<Override> overrides = overrideService.findByServiceAndAddress(consumer.getService(), consumer.getAddress());
        OverrideUtils.setConsumerOverrides(consumer, overrides);
        Override override = consumer.getOverride();
        if (override != null) {
            // consumer非第一次添加权重修改
            if (newMap.size() > 0) {
                override.setParams(StringUtils.toQueryString(newMap));
                override.setEnabled(true);
                override.setOperator(operator);
                override.setOperatorAddress(operatorAddress);
                overrideService.updateOverride(override);
            } else {
                overrideService.deleteOverride(override.getId());
            }
        } else {
            // consumer第一次添加权重修改
            override = new Override();
            override.setService(service);
            override.setAddress(address);
            override.setParams(StringUtils.toQueryString(newMap));
            override.setEnabled(true);
            override.setOperator(operator);
            override.setOperatorAddress(operatorAddress);
            overrideService.saveOverride(override);
        }
        return true;
    }
}
  • consumer侧的权重调整根据consumer的service名称和address的地址查找是否有对应的overrides规则。
  • 如果之前没有任何overrides规则,那么就执行saveOverride的save操作。
  • 如果之前有overrides规则,那么就执行updateOverride的update操作。


权重调整执行过程

public class OverrideServiceImpl extends AbstractService implements OverrideService {

    public void saveOverride(Override override) {
        URL url = getUrlFromOverride(override);
        registryService.register(url);
    }

    public void updateOverride(Override override) {
        Long id = override.getId();
        if (id == null) {
            throw new IllegalStateException("no override id");
        }
        URL oldOverride = findOverrideUrl(id);
        if (oldOverride == null) {
            throw new IllegalStateException("Route was changed!");
        }
        URL newOverride = getUrlFromOverride(override);

        registryService.unregister(oldOverride);
        registryService.register(newOverride);
    }

    public void deleteOverride(Long id) {
        URL oldOverride = findOverrideUrl(id);
        if (oldOverride == null) {
            throw new IllegalStateException("Route was changed!");
        }
        registryService.unregister(oldOverride);
    }

    public void enableOverride(Long id) {
        if (id == null) {
            throw new IllegalStateException("no override id");
        }

        URL oldOverride = findOverrideUrl(id);
        if (oldOverride == null) {
            throw new IllegalStateException("Override was changed!");
        }
        if (oldOverride.getParameter("enabled", true)) {
            return;
        }

        URL newOverride = oldOverride.addParameter("enabled", true);
        registryService.unregister(oldOverride);
        registryService.register(newOverride);
    }

    public void disableOverride(Long id) {
        if (id == null) {
            throw new IllegalStateException("no override id");
        }

        URL oldProvider = findOverrideUrl(id);
        if (oldProvider == null) {
            throw new IllegalStateException("Override was changed!");
        }
        if (!oldProvider.getParameter("enabled", true)) {
            return;
        }

        URL newProvider = oldProvider.addParameter("enabled", false);
        registryService.unregister(oldProvider);
        registryService.register(newProvider);
    }
}
  • OverrideServiceImpl执行的是overrides规则的真正执行操作。
  • saveOverride负责在注册中心注册新的overrides的url地址。
  • updateOverride负责在注册中心执行删除旧的overrides的url地址并添加新的overrides的url地址。


权重调整的URL

provider侧的权重调整URL的例子
override://192.168.1.5:20880/com.alibaba.dubbo.demo.DemoService?category=configurators&dynamic=false&enabled=true&weight=400


consumer侧的权重调整URL例子
override://192.168.1.5/com.alibaba.dubbo.demo.DemoService?category=configurators&dynamic=false&enabled=true&weight=70
  • provider和consumer权重调整的URL地址中区别在于provider的地址相比于consumer的地址多了一个port字段。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352