Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的负载均衡算法
提供了一套微服务负载均衡解决方案
轮询策略(默认),随机策略,权重轮询策略,随机策略,最少并发数策略等等
搭建两个user-service服务提供者,一个user-consumer服务调用者
user-service,user-service2服务的配置文件相同,只是端口不同
server:
port: 9001
spring:
application:
name: user-service
eureka:
instance:
hostname: localhost
#开启ip注册
prefer-ip-address: true
client:
#默认值是true,是否将自己注册到注册中心
register-with-eureka: true
#默认值是true,是否从注册中心拉取服务
fetch-registry: true
#注册中信对外暴露的注册中心地址
service-url:
defaultZone: http://localhost:8761/eureka/
user-service2也是同样的代码
@RestController
public class UserController {
@Value("${server.port}")
private String port;
@GetMapping(value = "/provider/test")
public String test(){
return "---我是用户服务提供者---" + port;
}
}
服务消费者调用服务提供者,通过配置RestTemplate的Bean对象上面添加@LoadBalanced注解,即可实现默认的负载均衡–轮询策略
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
@RestController
public class UserController {
@Autowired
private RestTemplate restTemplate;
private static final String URL = "http://user-service";
@GetMapping(value = "/consumer/test")
public String test(){
String str = restTemplate.getForObject(URL + "/provider/test", String.class);
System.out.println("打印调用服务者的结果:" + str);
return "服务消费者调用服务提供者:" + str;
}
}
server:
port: 9003
spring:
application:
name: user-consumer
eureka:
instance:
hostname: localhost
#开启ip注册
prefer-ip-address: true
client:
#默认值是true,是否将自己注册到注册中心
register-with-eureka: true
#默认值是true,是否从注册中心拉取服务
fetch-registry: true
#注册中信对外暴露的注册中心地址
service-url:
defaultZone: http://localhost:8761/eureka/
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
dependency>
dependencies>
启动注册中心,启动服务提供者,启动消费者,访问消费者地址:
http://localhost:9003/consumer/test
直接在服务消费者配置RestTemplat类上面添加@LoadBalanced注解是全局的,也有局部配置,是针对某一个服务进行配置,该配置是写配置文件中的
# 负载均衡局部配置
user-service: # 服务名称
ribbon: #负载均衡策略
ConnectTimeout: 1000 #服务请求连接超时时间(毫秒)
ReadTimeout: 3000 #服务请求处理超时时间(毫秒)
OkToRetryOnAllOperations: true #对超时请求启用重试机制
MaxAutoRetriesNextServer: 1 #切换重试实例的最大个数
MaxAutoRetries: 1 # 切换实例后重试最大次数
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
重启消费者重新访问下地址,调用服务者的服务变成了随机