Spring Cloud-4-服务发现与消费 Ribbon负载均衡

之前的例子中,已经搭建起来了服务注册中心,包括单节点模式和高可用模式,同时呢服务提供者也有了,就是eureka-client,然后接下来尝试构建一个消费者.

服务消费者

主要完成两个目标,发现服务以及消费服务.

其中,发现服务的任务是由eureka的客户端完成的,而服务消费的任务是由ribbon完成的. Ribbon是一个基于HTTP和TCP的客户端负载均衡器.

准备工作

为了实验Ribbon的客户端负载均衡功能,所以我们以jar的方式启动两个服务提供者(eureka-client)

1
2
java -jar eureka-client.jar --server.port=8081
java -jar eureka-client.jar --server.port=8082

启动完成后,从eureka信息面板中可以看到,已经有两个服务了
image

创建消费者工程

新创建一个工程,取名为consumer-ribbon

maven依赖

maven引入依赖:

1
2
3
4
5
6
7
8
9
<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>

application.yml配置

然后配置application.yml

1
2
3
4
5
6
7
8
9
spring:
application:
name: eureka-consumer
server:
port: 9000
eureka:
client:
service-url:
defaultZone: http://peer1:1111/eureka/,http://peer2:1112/eureka/

服务注册中心的地址,要和我们eureka-client的地址是一样的,不然是发现不了该服务的.

RestTemplate配置

创建一个配置类Config,加入@Configuration注解
然后创建RestTemplate的Spring实例, 具体如下:

1
2
3
4
5
6
7
8
9
10
@Configuration
public class Config {

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

}

@LoadBalanced注解,是用来开启客户端负载均衡

Controller创建

创建一个Controller,通过RestTemplate来对eureka-client提供的接口进行调用,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
@Slf4j
public class DcController {

@Autowired
private RestTemplate restTemplate;

@GetMapping("/consumer")
public String consumer(){
return restTemplate.getForObject("http://EUREKA-CLIENT/dc", String.class);
}
}

可以看到,这里的地址是服务名EUREKA-CLIENT,而不是一个具体的地址.

启动类

最后,启动类加入注解@EnableDiscoveryClient,然后启动应用

在看一下eureka信息面板
consumer
可以看到,除了之前的服务提供者(eureka-client)还多了一个EUREKA-CONSUMER的消费者应用.

测试

访问 http://localhost:9000/consumer ,这时候可以打开两个eureka-client的控制台,可以看到,接口被调用的日志是在两个进程交替打印的,可以用来判断消费者对eureka-client的调用是否是负载均衡的