Spring Cloud 之 客户端负载均衡
1、负载均衡
负载均衡是分布式(微服务)架构的重要组成部分,负载均衡机制决定了整个服务集群的性能和稳定。
负载均衡可以分为服务端负载均衡和客户端负载均衡两类,其中服务端负载均衡可通过硬件设备或软件来实现,硬件有F5、Array等,软件有LVS、Nginx等;客户端负载均衡相对服务器负载均衡而言,主要指服务清单存放在客户端本地,一般是从注册中心进行抓取并进行维护。在前面学习服务治理框架的时候,提到的负载均衡就是指的客户端负载均衡器。
2、准备测试环境
为了验证客户端负载均衡,则需要为一个服务启动多个实例,并注册到注册中心中。这里选择上一节中的注册中心和服务提供者,然后运行多个服务提供者实例即可。运行多实例的方式请参考《IntelliJ Idea如何为一个项目启动多个项目实例》。
运行多个实例后,进入注册中心,可以发现EUREKA-PROVIDER有了多个实例,如下所示:
3、LoadBalancerClient实现负载均衡
Spring Cloud Commons模块提供了大量的与服务治理相关的抽象接口,除了上一篇中提到的服务发现接口DiscoveryClient外,还有今天要用到的LoadBalancerClient接口。
为了使用LoadBalancerClient实现负载均衡,我们重写上一篇中的消费者即可。
3.1、引入依赖
上一篇中提到简单使用服务发现,可以不用引入spring-cloud-starter-netflix-eureka-client依赖,其实在实际工作中,一般都是需要引入该依赖的,只有这样,该服务才会被注册到注册中心进行统一管理和维护。
这里,为了实现客服端负载均衡,该依赖也是必须要引入的,否则LoadBalancerClient的实现类不会被注入到Spring的IOC容器中。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.2、修改application.properties配置文件
这里必须设置Eureka注册中心的地址,否则因为引入了spring-cloud-starter-netflix-eureka-client依赖,使用默认的配置可能会出现错误。
spring.application.name=eureka-consumer
server.port=8020
#设置Eureka注册中心的地址。
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8000/eureka/
3.3、增加负载均衡测试类
这里通过注入LoadBalancerClient实例,然后通过loadBalancerClient.choose()方法,使用默认轮询策略选取服务提供者实例(为了验证结果,我们返回了实例的地址)。
@RestController
public class LoadBalancerController {
Logger logger = Logger.getLogger(LoadBalancerController.class);
@Autowired
private LoadBalancerClient loadBalancerClient;
@RequestMapping("/loadBalancer")
public String loadBalancer(){
logger.info("执行消费者LoadBalancerController的loadBalancer()方法!");
ServiceInstance instance = loadBalancerClient.choose("eureka-provider");
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/provider";
return url;
}
}
3.4、启动类、验证
其他类和配置都不需要改变,然后运行该应用,启动成功后,访问http://localhost:8020/loadBalancer地址,多次刷新会发现“http://localhost:8011/provider”和“http://localhost:8010/provider”结果会交替出现,说明该负载均衡的默认策略是1:1权重的轮询。
4、Spring Cloud Ribbon
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。Ribbon实现客户端负载均衡的步骤如下:
4.1、引入依赖
为了使用Ribbon负载均衡,需要引入spring-cloud-starter-ribbon依赖,如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
4.2、修改RestTemplate实例注入Spring IOC容器的方式
在启动类中,依赖注入RestTemplate实例的时候,增加了一个@LoadBalanced注解。这样RestTemplate实例对象,在调用服务地址的时候,就具备了负载均衡的能力,至于为什么具有了该能力,后续我们在深入了解。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
4.3、编写Ribbon测试类
这里和前面使用DiscoveryClient实现服务发现的区别在于:这里的url中,直接用服务名称代替了原来的IP+Port,为什么要这样子呢?在RestTemplate实例注入Spring IOC容器时,使用了@LoadBalanced注解,而RestTemplateCustomizer会对所有被@LoadBalanced注解的实例对象,添加了一个LoadBalancerInterceptor拦截器。利用RestTempllate的拦截器,就会实现负载均衡策略,并将请求的地址中的服务逻辑名转为具体的服务地址。
@RestController
public class RibbonController {
Logger logger = Logger.getLogger(RibbonController.class);
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/ribbon")
public String ribbon(){
logger.info("执行消费者ConsumerController的consumer()方法!");
String url = "http://eureka-provider/provider";
return restTemplate.getForObject(url,String.class);
}
}
4.4、启动,测试
正常启动应用后,多次访问http://localhost:8020/ribbon地址,在两个服务实例的控制台分别会打印方法中的日志,说明客户端负载均衡生效了。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/68776.html