dubbo

Dubbo Admin 权重动态调整

2020-01-04  本文已影响0人  晴天哥_王志

开篇

provider侧权重调整

provider侧权重调整

consumer侧权重调整

consumer侧权重调整

权重调整记录

权重调整记录

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);
        }
    }
}

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;
    }
}

权重调整执行过程

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);
    }
}

权重调整的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
上一篇 下一篇

猜你喜欢

热点阅读