转载请表明出处 https://blog.csdn.net/Amor_Leo/article/details/87875269 谢谢
Spring Cloud Ribbon
Spring Cloud Ribbon 概述
Spring Cloud Ribbon 是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的。它提供了很多负载均衡算法,例如轮询、随机等,在配置服务提供者地址后,可以将服务消费者请求按照负载均衡算法进行分发。
它主要包括六个组件:
- ServerList:负载均衡使用的服务器列表.这个列表会缓存在负载均衡器中,并定期更新.当Ribbon与Eureka结合使用时,ServerList的实现类就是DiscoveryEnabledNIWSServerList,它会保存Eureka Server中注册的服务实例表.
- ServerListFilter:服务器列表过滤器.这是一个接口,主要用于对Service Consumer获取到的服务器列表进行预过滤,过滤的结果也是ServerList.Ribbon提供了多种过滤器的实现.
- IPing:探测服务实例是否存活的策略.
- IRule:负载均衡策略,其实现类表述的策略包括:轮询、随机、根据响应时间加权等.我们也可以自己定义负载均衡策略,比如我们就利用自己实现的策略,实现了服务的版本控制和直连配置.实现好之后,将实现类重新注入到Ribbon中即可.
- ILoadBalancer:负载均衡器.这也是一个接口,Ribbon为其提供了多个实现,比如ZoneAwareLoadBalancer,而上层代码通过调用其API进行服务调用的负载均衡选择.一般ILoadBalancer的实现类中会引用一个IRule.
- RestClient:服务调用器.顾名思义,这就是负载均衡后,Ribbon向Service Provider发起REST请求的工具.
Ribbon提供的主要负载均衡策略介绍:
- 简单轮询负载均衡(RoundRobin): 以轮询的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。
- 随机负载均衡 (Random): 随机选择状态为UP的Server。
- 加权响应时间负载均衡 (WeightedResponseTime): 根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。
- 区域感知轮询负载均衡(ZoneAvoidanceRule): 复合判断server所在区域的性能和server的可用性选择server。
Spring Cloud Ribbon 搭建
- pom (Eureka里包含Ribbon)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- yml
spring:
application:
name: consumer-service
server:
port: 8080
eureka:
client:
service‐url:
defaultZone: http://localhost:8761/eureka
instance:
prefer‐ip‐address: true #访问路径可以显示ip地址
- Application 类
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- Controller
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/get/provider/test")
public String rpc() {
String forObject = restTemplate.getForObject("http://PROVIDER-SERVICE/test", String.class);
return forObject;
}
@GetMapping("/log-user-instance")
public void logUserInstance() {
ServiceInstance serviceInstance = this.loadBalancerClient.choose("PROVIDER-SERVICE");
// 打印当前选择的是哪个节点
MovieController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort());
- 如果要修改负载均衡算法
spring:
application:
name: consumer-service
server:
port: 8080
eureka:
client:
service‐url:
defaultZone: http://localhost:8761/eureka
instance:
prefer‐ip‐address: true #访问路径可以显示ip地址
provider-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
< ClientName >.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
- 如果不添加eureka依赖
- pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
- yml
spring:
application:
name: consumer-service
server:
port: 8080
provider-service:
ribbon:
listOfServers: localhost:8000,localhost:8001