# Spring Cloud(Kilburn 2022.0.2版本)系列教程(二) 服务消费者(RestTemplate+Loadbalancer)

# 一、服务消费

可以参考上节eurekaClientConsumer

image-20230421163829719

在启动类中,我们已经注入了一个restTemplate了,并且在上面增加了@LoadBalanced注解,这个是导入的org.springframework.cloud.client.loadbalancer.LoadBalanced包下的,不是netflix包下的,因为新版本的SpringCloud已经弃用了Ribbon,使用的事Spring自家的负载均衡Loadbalancer

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
      return new RestTemplate();
}
1
2
3
4
5

ConsumerController中新增方法eurekaClientConsumerChooseInstance,来看一下消费服务的时候到底调用的哪个URL

@RequestMapping("/eurekaClientConsumerChooseInstance")
public String eurekaClientConsumerChooseInstance() {
    ServiceInstance serviceInstance = loadBalancerClient.choose("eurekaClient");
    String server = serviceInstance.getInstanceId()+":"
      +serviceInstance.getHost()+":"
      +serviceInstance.getPort();
    System.out.println(server);
    return server;
}
1
2
3
4
5
6
7
8
9

# 二、Loadbalancer负载均衡

我们已经有一个eurekaClient的服务提供者,提供根据ID去查询用户的接口服务,为了体现负载均衡我们复制一下这个项目并修改名称为eurekaClientProvider,只需把端口号改成8002,其余都不变。

把所有项目都启动,稍等片刻,eureka上会有eurekaClienteurekaClientProvider注册上来。

image-20230421113420815

多次调用http://localhost:8001/eurekaClientConsumerChooseInstance,可以看到服务在80008002两个端口的服务器上轮询调用。

image-20230421161317480

# 三、切换Loadbalancer负载均衡策略

Loadbalancer一共有两种负载均衡策略,轮询和随机,分别对应于RoundRobinLoadBalancerRandomLoadBalancer

loadbalancer包下,新增一个配置类CustomLoadBalancerConfiguration。并设置默认策略为RandomLoadBalancer。注意类上面$\textcolor{red}{不加}$@Configuration注解。

package cc.huerpu.eurekaclient.loadbalancer;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

public class CustomLoadBalancerConfiguration {
    @Bean
    public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        //RoundRobinLoadBalancer RandomLoadBalancer
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

在启动类EurekaClientConsumerApplication上增加@LoadBalancerClients配置,这个是全局的。

@LoadBalancerClients(defaultConfiguration = {CustomLoadBalancerConfiguration.class})
1

如果只是在特定的服务上使用这个策略,可以增加name属性,标识服务应用名。

@LoadBalancerClient(value = "eurekaClient", configuration = CustomLoadBalancerConfiguration.class)
1

重启应用,多次调用http://localhost:8001/eurekaClientConsumerChooseInstance,可以看到服务在80008002两个端口的服务器上随机调用。

image-20230421162502940

本文参考loadbalancer官方文档:https://docs.spring.io/spring-cloud-commons/docs/4.0.2/reference/html/#spring-cloud-loadbalancer

最近更新: 12/3/2024
勤奋的凯尔森同学   |  
Spring Cloud(Kilburn 2022.0.2版本)系列教程(二) 服务消费者(RestTemplate+Loadbalancer)