第一、整合Ribbon
在Spring Cloud项目中集成Ribbon,需要以下依赖。如果SpringCloud中已经集成了Eureka,则也可以不需要配置,因为Eureka中已经引用了Ribbon。
· <!--Ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
第二、配置RestTemplate 其中@LoadBalanced是能够让RestTemplate具备负载均衡能力的注解,不可缺少。
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;
@Configuration
public class BeanConfiguration {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
第三步、接口调用。注意在调用的时候,使用的是微服务的服务名称,不是IP+端口。接口在调用的时候,框架内部会将服务名称替换成具体的服务IP信息,然后进行调用
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class HouseController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/house/getDemo")
public String getDemo(){
return restTemplate.getForObject("http://smile-eureka-client/user/hello",String.class);
}
}
说明:注解@LoadBalanced
该注解的原理就是给RestTemplate增加拦截器,在请求之前对请求的地址进行替换,或者根据具体的负载均衡策略选择服务地址,然后再去调用。