一、介绍
- 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"); 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(); }}
四、Ribbon整合Nacos权重算法
- 1.注意
- 算法只能注入一个,不能注入多个
- 否则Ribbon就无法知道要采用哪个算法
- 所以这里需要将之前的Ribbon随机算法注释掉
@Configurationpublic class LoadBalanceConfig {}
- 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