一、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");
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 {
}
- 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());
}
}