【Spring Cloud】Ribbon实现客户端负载均衡

【学习背景】

在前面几篇博客中,学习到的都是将服务部署到不同的注册中心。而在系统架构中,一般都要求做到高可用,从而注册中心,服务提供者和服务调用者都会搭建集群部署。集群环境下,我们调用服务的哪个节点,如何做到客户端负载均衡,是本篇博客接下来总结的内容。

【学习内容】

1. 什么是客户端负载均衡?

Nginx对我们来说,应该是听过且比较熟悉的,它可以帮助我们实现服务端的负载均衡。客户端所有请求统一交给Nginx,由Nginx进行实现负载均衡请求转发,属于服务端负载均衡。

而客户端负载均衡和服务端负载均衡最大的不同点在于服务所存储的位置。在客户端负载均衡中,所有客户端节点都维护着自己要访问的服务端清单,而这些服务端清单来自于服务注册中心。

2. 客户端负载均衡如何实现?

在Spring Cloud框架中,是通过Ribbon和Eureka的结合实现客户端服务均衡。Ribbon是从Eureka注册中心服务端上获取服务注册信息列表,缓存到本地,然后在本地实现轮询负载均衡。

通过Spring Cloud Ribbon 的封装,我们在微服务架构中是使用客户端负载均衡调用非常简单,只需要如下两步:

  • 服务提供者只需要启动多个服务实例并注册到一个注册中心或是多个相关联的服务注册中心。
  • 服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用。

这样,我们就可以将服务提供者的高可用和服务消费者的负载均衡调用一起实现了。

3. 客户端负载均衡demo

在本地环境中,模拟实现了一下客户端负载均衡的效果。

首先,本地环境启动了两个服务提供者实例,一个服务消费者实例,在Eureka服务管理界面可看到,如下:

在这里插入图片描述
提示:在使用IDEA启动两个服务提供者实例,我们需要将启动配置默认只有一个实例的设置去掉,如下:

在这里插入图片描述

然后,我们将服务消费者调用服务提供者的代码修改一下,最开始仅有一个服务提供者,所以直接通过端口指定访问的特定服务,现在改成多个实例后,下面改成通过应用名称访问服务,在RestTemplate上加上@LoadBalanced注解,实现负载均衡,代码如下:

	@Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

	@RequestMapping(value = "/router",method = RequestMethod.GET)
    public String router(){
        RestTemplate restTemplate=getRestTemplate();
         //根据应用名称调用服务
        String url="http://eureka-service-provider/user/1";
       
        //String json=restTemplate.getForObject("http://localhost:9000/user/1",String.class);

        String json=restTemplate.getForObject(url,String.class);
        return json;
    }

最后,我们可以调用服务消费者的接口,可以发现,访问服务提供者服务的端口号是轮询的,如下:

在这里插入图片描述

在这里插入图片描述

【学习demo】

学习实例搭建github地址:

https://github.com/huzhiting/spring-cloud

【学习总结】

在学习过程中,也参考了很多相关文章和书籍资料,实现客户端负载均衡的方法也是很多的,在RestTemplate上加@LoadBalanced注解算是最简单的一种。

猜你喜欢

转载自blog.csdn.net/u013034223/article/details/87348669