前不久,我把Mall微服务版本全面升级了 ,在通过Gateway网关调用其他服务的时候,出现了Service Unavailable的问题。排查原因时发现作为负载均衡组件的Ribbon被弃用了,作为Netflix开源的一个组件,Ribbon早已进入维护状态。现在推荐使用的是Loadbalancer,今天我们就来聊聊Loadbalancer的使用!
LoadBalancer简介
LoadBalancer是Spring Cloud官方提供的负载均衡组件,可用于替代Ribbon。其使用方式与Ribbon基本兼容,可以从Ribbon进行平滑过渡。
使用
下面介绍下LoadBalancer的基本使用,我们将使用Nacos作为注册中心,通过nacos-loadbalancer-service和nacos-user-service两个服务间的相互调用来进行演示。
负载均衡
我们将使用RestTemplate来演示下LoadBalancer的负载均衡功能。
-
首先在nacos-loadbalancer-service模块的pom.xml文件中添加LoadBalancer相关依赖;
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
-
然后创建Java配置类,用于配置RestTemplate,同时使用@LoadBalanced注解赋予其负载均衡能力;
/** * RestTemplate相关配置 * Created by macro on 2019/8/29. */@Configurationpublic class RestTemplateConfig { @Bean @ConfigurationProperties(prefix = "rest.template.config") public HttpComponentsClientHttpRequestFactory customHttpRequestFactory() { return new HttpComponentsClientHttpRequestFactory(); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(customHttpRequestFactory()); }}
-
在application.yml中可以使用自定义配置对RestTemplate的调用超时进行配置;
rest: template: config: # RestTemplate调用超时配置 connectTimeout: 5000 readTimeout: 5000
-
然后在Controller中使用RestTemplate进行远程调用;
/** * Created by macro on 2019/8/29. */@RestController@RequestMapping("/user")public class UserLoadBalancerController { @Autowired private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String userServiceUrl; @GetMapp