六、负载均衡(二):Ribbon

一、Ribbon介绍

  • 1.什么是Ribbon
    • Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用

二、Ribbon-轮询算法

  • 1.OrderToMemberService
    • 由于默认就已经引入了Ribbon,所以不需要单独的引用依赖
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class OrderToMemberService {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @RequestMapping("/orderToMember")
    public String orderToMember() {
        /*
         * 根据服务名称 从注册中心 获取 会员的接口地址
         * 服务提供 启动多个集群
         *
         */
         //默认采用轮询机制
        ServiceInstance serviceInstance = loadBalancerClient.choose("sjyl-producer-member");
        // 会员服务的ip和端口
        String memberUrl = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/" + "getMember";
        return "订单服务调用会员服务:" + restTemplate.getForObject(memberUrl, String.class) + "...端口:" + serviceInstance.getPort();
    }
}

三、Ribbon-随机算法

  • 1.新建一个LoadBalancerConfig
    • 这个主要就是为了注入RandomRule,这样Ribbon就会采用随机算法
    • OrderToMemberService不需要修改
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class LoadBalanceConfig {

    @Bean
    public RandomRule randomRule(){
        return  new RandomRule();
    }
}

四、Ribbon整合Nacos权重算法

  • 1.注意
    • 算法只能注入一个,不能注入多个
    • 否则Ribbon就无法知道要采用哪个算法
    • 所以这里需要将之前的Ribbon随机算法注释掉
@Configuration
public class LoadBalanceConfig {

//    @Bean
//    public RandomRule randomRule(){
//        return  new RandomRule();
//    }
}
  • 2.新建SjylWeightLoadBalance
    • 需要自己实现权重算法
    • OrderToMemberService不需要修改
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import org.springframework.cloud.alibaba.nacos.ribbon.NacosServer;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

@Component
public class SjylWeightLoadBalance extends AbstractLoadBalancerRule {
    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

    private AtomicInteger countAtomicInteger = new AtomicInteger(0);

    @Override
    public Server choose(Object key) {
        return choose(getLoadBalancer(), key);
    }

    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        }

        List<Server> upList = lb.getReachableServers();//获取上线的地址,不包括下线的地址
        ArrayList<NacosServer> newNacosServers = new ArrayList<>();
        upList.forEach((s) -> {
            NacosServer nacosServer = (NacosServer) s;
            double weight = nacosServer.getInstance().getWeight();
            for (int i = 0; i < weight; ++i) {
                newNacosServers.add(nacosServer);
            }
        });
        return newNacosServers.get(countAtomicInteger.incrementAndGet() % newNacosServers.size());
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无休止符

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值