Ribbon简介

Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。

在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。下图展示了Ribbon与Eureka配合使用时的架构。

实现过程

我们修改microservice-student-consumer-80子模块项目

引入依赖

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

修改application.yml

添加下面内容:

1
2
3
4
5
eureka:
client:
register-with-eureka: false #false 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
service-url:
defaultZone: http://eureka2001.ledao.com:2001/eureka/,http://eureka2002.ledao.com:2002/eureka/,http://eureka2003.ledao.com:2003/eureka/

添加@LoadBalanced注解

SpringCloudConfig.java的getRestTemplate()方法上添加@LoadBalanced注解(负载均衡配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.ledao.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;

/**
* SpringCloud相关配置
*
* @author LeDao
* @company
* @create 2021-08-11 14:46
*/
@Configuration
public class SpringCloudConfig {

/**
* 调用服务模版
*
* @return
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}

添加注解@EnableEurekaClient

因为和eureka整合,所以启动类StudentConsumerApplication_80 加个注解 @EnableEurekaClient

指定应用名称

在服务提供者microservice-student-provider-1001的application.yml以下配置(microservice-student为微服务应用名称)

1
2
application:
name: microservice-student

在spring配置下添加,完整spring配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 数据源配置
spring:
application:
name: microservice-student
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_springcloud?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
jpa:
hibernate:
ddl-auto: update
show-sql: true

修改PRE_HOST

修改服务消费者子模块项目的StudentConsumerController.java中的PRE_HOST为 http://MICROSERVICE-STUDENT

1
private static final String PRE_HOST = "http://MICROSERVICE-STUDENT";

测试

依次运行microservice-eureka-server-2001、microservice-eureka-server-2002、microservice-eureka-server-2003、microservice-student-provider-1001、microservice-student-consumer-80子模块项目

浏览器地址栏输入:http://localhost/student/list ,出现下面结果说明调用服务成功(下面是格式化过的JSON串)