软件系统定制开发六、负载均衡(二):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;@RestControllerpublic 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();    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

三、Ribbon-

  • 1.新建一个LoadBalancerConfig
    • 这个主要就是为了注入RandomRule,这样Ribbon就会采用随机算法
    • OrderToMemberService不需要修改
import com.netflix.loadbalancer.RandomRule;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class LoadBalanceConfig {    @Bean    public RandomRule randomRule(){        return  new RandomRule();    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

四、Ribbon整合Nacos权重算法

  • 1.注意
    • 算法只能注入一个,不能注入多个
    • 否则Ribbon就无法知道要采用哪个算法
    • 所以这里需要将之前的Ribbon随机算法注释掉
@Configurationpublic class LoadBalanceConfig {//    @Bean//    public RandomRule randomRule(){//        return  new RandomRule();//    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 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;@Componentpublic 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发