负载均衡—Ribbon

一、简单介绍

Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具。负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,分摊服务器压力。我们知道,Eureka的服务实例可以进行集群集群部署,每个实例都均衡处理服务请求,那么这些请求是如何被分摊到各个服务实例中的呢?Ribbon就是帮我们解决这个问题的关键。

Ribbon默认提供了很多负载均衡算法,如:轮询、随机等,也可以实现自定义的负载均衡算法。

二、上手

1. 项目结构

我在写eureka的demo的时候创建了eureka-client-8762eureka-client-8763两个服务提供者,本次demo需要用到他们。先看看项目结构:

springcloud-collection

2 . ribbon-8764 项目创建

我们就创建上面的ribbon-8764

pom.xml 配置和eureka-client-8762eureka-client-8763 的依赖一样,只是比其多 一个ribbon的依赖:

<dependencies>
    <!--springboot-starter-web-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <!-- eureka-client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!--ribbon-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
</dependencies>

application.yml

server:
  port: 8764

spring:
  application:
    name: ribbon-8764

  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

EurekaRibbon8764 启动类 :

@SpringBootApplication
@EnableEurekaClient     // 客户端注册
public class EurekaRibbon8764 {

    public static void main(String[] args) {
        SpringApplication.run(EurekaRibbon8764.class,args) ;
    }
}

启动类同级目录下 创建 config文件夹,并在此下创建 RestTemplateConfigure类,用来配置ribbon的负载均衡配置。

package com.dzbiao.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfigure {


    @Bean
    @LoadBalanced       // Ribbon 负载均衡配置
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

8761、8762、8763、8764 全部启动,我们可以看到,ribbon-8764已经被注册成功。

ribbo-eureka

此时我们将ribbon-8764当做消费者,我们期许 通过访问ribbon提供的路径,http://localhost:8764/user ,通过RestTemplate去远程调用service服务。

ribbon-controller

至于上面的 http://service/user 中的service 是8762和8763两个服务在注册中心注册的名称,user 是该服务控制层中的方法路径。

我们通过访问 http://localhost:8764/user 可以看到 返回的带有端口的字符串,多次刷新,返回的字符串会在 8762和8763交替出现。

ribbonn-response-8762ribbon-response-8763

由此我们可以看到,ribbon-8764 通过轮询算法交替调用 8762 和8763 两个服务。通过交替调用,实现负载均衡,减轻服务压力。

posted @ 2021-03-16 15:56  xiaobiao~  阅读(106)  评论(0编辑  收藏  举报