Spring Cloud入门之客户端负载均衡Ribbon

导读:本篇文章讲解 Spring Cloud入门之客户端负载均衡Ribbon,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Spring Cloud 之 客户端负载均衡

1、负载均衡

  负载均衡是分布式(微服务)架构的重要组成部分,负载均衡机制决定了整个服务集群的性能和稳定。

  负载均衡可以分为服务端负载均衡和客户端负载均衡两类,其中服务端负载均衡可通过硬件设备或软件来实现,硬件有F5、Array等,软件有LVS、Nginx等;客户端负载均衡相对服务器负载均衡而言,主要指服务清单存放在客户端本地,一般是从注册中心进行抓取并进行维护。在前面学习服务治理框架的时候,提到的负载均衡就是指的客户端负载均衡器。

2、准备测试环境

  为了验证客户端负载均衡,则需要为一个服务启动多个实例,并注册到注册中心中。这里选择上一节中的注册中心和服务提供者,然后运行多个服务提供者实例即可。运行多实例的方式请参考《IntelliJ Idea如何为一个项目启动多个项目实例》

  运行多个实例后,进入注册中心,可以发现EUREKA-PROVIDER有了多个实例,如下所示:

Spring Cloud入门之客户端负载均衡Ribbon

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权重的轮询。
Spring Cloud入门之客户端负载均衡Ribbon

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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!