Spring Cloud(Kilburn 2022.0.2版本)系列教程(二) 服务消费者(RestTemplate+Loadbalancer)
为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000
一、服务消费
可以参考上节eurekaClientConsumer
。
在启动类中,我们已经注入了一个restTemplate
了,并且在上面增加了@LoadBalanced
注解,这个是导入的org.springframework.cloud.client.loadbalancer.LoadBalanced
包下的,不是netflix
包下的,因为新版本的SpringCloud
已经弃用了Ribbon
,使用的事Spring
自家的负载均衡Loadbalancer
。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
在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;
}
二、Loadbalancer负载均衡
我们已经有一个eurekaClient
的服务提供者,提供根据ID去查询用户的接口服务,为了体现负载均衡我们复制一下这个项目并修改名称为eurekaClientProvider
,只需把端口号改成8002
,其余都不变。
把所有项目都启动,稍等片刻,eureka
上会有eurekaClient
和eurekaClientProvider
注册上来。
多次调用http://localhost:8001/eurekaClientConsumerChooseInstance
,可以看到服务在8000
和8002
两个端口的服务器上轮询调用。
三、切换Loadbalancer负载均衡策略
Loadbalancer
一共有两种负载均衡策略,轮询和随机,分别对应于RoundRobinLoadBalancer
和RandomLoadBalancer
。
在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);
}
}
在启动类EurekaClientConsumerApplication
上增加@LoadBalancerClients
配置,这个是全局的。
@LoadBalancerClients(defaultConfiguration = {CustomLoadBalancerConfiguration.class})
如果只是在特定的服务上使用这个策略,可以增加name
属性,标识服务应用名。
@LoadBalancerClient(value = "eurekaClient", configuration = CustomLoadBalancerConfiguration.class)
重启应用,多次调用http://localhost:8001/eurekaClientConsumerChooseInstance
,可以看到服务在8000
和8002
两个端口的服务器上随机调用。
本文参考loadbalancer官方文档:
https://docs.spring.io/spring-cloud-commons/docs/4.0.2/reference/html/#spring-cloud-loadbalancer