SpringCloud Ribbon(二)之自定义负载均衡策略IRule

一、Ribbon负载均衡策略

一个服务对应一个LoadBalancer,一个LoadBalancer只有一个Rule,LoadBalancer记录服务的注册地址,Rule提供从服务的注册地址中找出一个地址的规则。

Ribbon提供七种负载均衡策略,默认的负载均衡策略是轮训策略。

名称解释
RoundRobinRule轮训策略
RandomRule随机策略
BestAvailableRule过滤出故障服务器后,选择一个并发量最小的
WeightedResponseTimeRule针对响应时间加权轮询
AvailabilityFilteringRule可用过滤策略,先过滤出故障的或并发请求大于阈值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个;
ZoneAvoidanceRule从最佳区域实例集合中选择一个最优性能的服务实例
RetryRule选择一个Server,如果失败,重新选择一个Server重试

 

二、 自定义负载均衡策略

本文自定义负载均衡规则提供根据指定URI优先转发到特定的机器的功能。

 

三、实现代码

(1)负载均衡策略实现类

public class MicroServiceLoadBalanceRule extends AbstractLoadBalancerRule {

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

    @Override
    public Server choose(Object key) {

        ILoadBalancer lb = getLoadBalancer();
        if (lb == null) {
            return null;
        }

        List<Server> servers = lb.getReachableServers();
        if (servers.isEmpty()){
            return null;
        }

        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String uri = request.getRequestURI();
        boolean specialApi = uri.startsWith("/api") ;
        // /api路径优先转发到指定的机器
        if(specialApi){
            String ip = "192.168.2.3";
            Server chooseServer = null;
            for (Server server : servers) {
                if (server.getHost().equals(ip)) {
                    chooseServer = server;
                }
            }

            if(chooseServer == null){
                chooseServer = servers.stream().findFirst().orElse(null);
            }
            return chooseServer;
        }

        return servers.get(new Random().nextInt(servers.size()));
    }
}

(2)application.yaml文件配置

micro-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.mk.springcloud.gateway.loadbalance.MicroServiceLoadBalanceRule

(3) 代码配置

public class MicroRibbonConfig {

    @Bean
    public IRule microIRule(){

        return new MicroServiceLoadBalanceRule();
    }

}

@RibbonClient(name = "micro-service", configuration = MicroRibbonConfig.class)
public class RibbonClientConfig {

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值