1. Ribbon
Ribbon是Netflix发布的负载均衡器,有助于控制HTTP和TCP客户端的行为
为Ribbon配置服务提供者列表后,它可基于某种
负载均衡算法
(轮询、随机等,可自定义),自动地帮助消费者去请求
在Spring Cloud中,当
Ribbon与Eureka配合使用
时,Ribbon可以从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中的服务提供者实例
2.Spring Cloud使用Ribbon实现客户端侧负载均衡
2.1创建项目
使用之前写过的microservice-consumer-shopping
2.2添加依赖
如果已经在pom.xml中已经添加过了spring-cloud-starter-netflix-eureka-client依赖,该依赖包
含以下
spring-cloud-starter-netflix-ribbon
依赖,则
无需添加
<dependency>
<groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2.3添加@LoadBalanced注解
为RestTemplate添加
@LoadBalanced
注解(在项目启动文件中),就可以为RestTemplate整合
Ribbon,使其具备负载均衡能力
@SpringBootApplication
public class ConsumerShoppingApplication {
@Bean
@LoadBalanced //添加注解
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerShoppingApplication.class, args);
} }
2.4 对Controller代码进行修改
@RestController
public class ShoppingController {
private static final Logger LOGGER = LoggerFactory.getLogger(ShoppingController.class);
@Autowired
private RestTemplate restTemplate;
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);//将硬编码的URL修改为微服务虚拟主机名
}
@GetMapping("/users")
public List<User> findUsers() {
// Ribbon负载均衡支持,通过RestTemplate请求微服务,返回数据自动封装为List
return restTemplate.getForObject("http://microservice-provider-user/users", List.class);/将硬编码的URL修改为微服务虚拟主机名
}
// 其他代码
}
注:
1.请求地址修改为
http://microservice-provider-user/
,microservice-provider-user是用户微服务的虚拟主机名,默认情况下,虚拟主机名和服务名称一致,所以暂时理解为服务提供者的服务名称;
2.Ribbon和Eureka配合时,会将虚拟主机名映射为微服务的网络地址。
2.5 测试
1.
启动服务注册组件(Eureka Server)
microservice-discovery-eureka
2.启动 2 个或者更多
microservice-provider-user
实例
3.启动
microservice-consumer-shopping
4.访问
http://localhost:8761
,查看微服务实例情况
5.通过postman访问
http://localhost:8010/users
启动多个实例的方法:
//cmd窗口 注意jar包路径
java –jar microservice-provider-user-0.0.1-SNAPSHOT.jar
java –jar microservice-provider-user-0.0.1-SNAPSHOT.jar --server.port=8001
2.6. 对Controller代码再次进行修改,加入打印当前选择的节点功能
@Slf4j //简化日志代码编写
@RestController
public class ShoppingController {
private static final Logger LOGGER = LoggerFactory.getLogger(ShoppingController.class);
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;//注入loadBalancerClient
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);
}
@GetMapping("/users")
public List<User> findUsers() {
// Ribbon负载均衡支持,通过RestTemplate请求微服务,返回数据自动封装为List
return restTemplate.getForObject("http://microservice-provider-user/users", List.class);/将硬编码的URL修改为微服务虚拟主机名
}
@GetMapping("user-service-instance-log")//用户服务实例查询
public void logUserServiceInstance() {
ServiceInstance serviceInstance = loadBalancerClient.choose("microservice-provider-user");
log.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort());
}
}
要使用@lf4j注解,需要在pom.xml中添加lombok依赖:
<dependency>
<groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
2.7 再测试
通过postman访问 http://localhost:8010/user-service-instance-log多次,关注 microservice-provider-user 微服务的日志,可看到两个实例均可查询到~
2.8 报错
在2.5通过postman访问users时报错,500异常
原因:IDEA未安装Lombok插件,安装后重启即可。