Dubbo负载均衡方式自定义拓展

13 篇文章 0 订阅

由于项目需求特殊,需要在dubbo中实现一种能指定远程地址的分发机制,使用了dubbo留出来的扩展点的方法实现了这个功能,也就是实现了AbstractLoadBalance接口,并重写了doSelect方法,在doSelect方法实现中,根据调度服务方法传进的参数也就是指定的远程主机的ip地址和端口进行了过滤,最终返回满足该条件的Invoker作为最终的返回值给调用端,
在通过SPI机制将拓展服务负载均衡方式加载到dubbo的服务体系中

主要是在dubbo-2.8.4.jar\META-INF\dubbo\internal\com.alibaba.dubbo.rpc.cluster.LoadBalance
里面增加拓展的服务负载解析器
在这里插入图片描述

random=com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance
roundrobin=com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
leastactive=com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance
consistenthash=com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance
amplify=com.wangyong.service.config.devLoadBalance

dubbo 拓展的负载方式

import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.cluster.loadbalance.AbstractLoadBalance;
import com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;

import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

/**
 * 针对开发场景做的Dubbo的负载均衡策略,可按IP规则做路由配置。
 * IP规则例子:192.168.*.*,172.*.*.*
 * 使用逗号分隔多个正则表达式规则,如果前面的匹配则不会执行后面的,如果都不匹配则使用默认的路由规则:随机策略。
 */
//@Configuration
public class DevLoadBalance extends AbstractLoadBalance {

    @Override
    protected <T> Invoker<T> doSelect(List<Invoker<T>> list, URL url, Invocation invocation) {
        String config = System.getProperty("loadbalance.dev");

        Long bigOrg = 1677773268481736704L;

        String orgId = url.getParameter("orgId");
        System.out.println("进行服务路由调度");

        if (StringUtils.isBlank(config)) {
            return new RandomLoadBalance().select(list, url, invocation);
        }
        String[] patterns = config.split(",");
        if (ArrayUtils.isEmpty(patterns)) {
            return new RandomLoadBalance().select(list, url, invocation);
        }

        for (String pattern : patterns) {
            for (Invoker<T> invoker : list) {
                if (invoker.getUrl().getHost().matches(pattern)) {
                    return invoker;
                }
            }
        }

        return new RandomLoadBalance().select(list, url, invocation);
    }
}

dubbo config:dubbo/providers.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 
    <dubbo:application name="test" owner="testOwner"/>
    <!-- 定义 zookeeper 注册中心地址及协议 -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" client="zkclient"/>
 
    <dubbo:protocol name="dubbo" port="-1"/>
 
    <dubbo:annotation package="test.service"/>
 
    <dubbo:provider timeout="10000" version="1.0.0" retries="0"/>
 
    <dubbo:consumer check="false" timeout="10000" retries="0" version="1.0.0" loadbalance="dev"/>
</beans>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值