总结:
1.pom.xml文件中加ribbon的依赖包
2.配置类中 给RestTemplate 的bean 加注解@LoadBalanced 负载均衡注解
3.控制层 直接通过 服务名称 获取通信地址,相当于 http://ip地址:端口号
4.最后加上 接口的路径 ,组成完整的 url 地址
pom.xml
<!--负载均衡导包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
配置类:
@Configuration
public class ConsumerConfig {
@Bean
@LoadBalanced /*给RestTemplate加 负载均衡注解,因为是通过RestTemplate去实现的服务之间的调用*/
public RestTemplate getResttemplate(){
return new RestTemplate();
}
}
原代码:
@RestController
@RequestMapping("/consumer")
public class RemoteProviderController {
@Autowired
public RestTemplate restTemplate;
@Autowired
public DiscoveryClient discoveryClient;
@GetMapping("/getUser/{id}")
public User getUser(@PathVariable("id") Integer id){
List<ServiceInstance> provider = discoveryClient.getInstances("PROVIDER");
int size = provider.size();
Random r = new Random();
int index = r.nextInt(size);//如果size=10,范围是【0,10)
ServiceInstance serviceInstance = provider.get(index);
URI uri = serviceInstance.getUri();
String url =uri.toString()+"/user/"+id;
User user = restTemplate.getForObject(url, User.class);
return user;
}
}
用ribbon 实现负载均衡后 代码:
@RestController
@RequestMapping("/consumer")
public class RemoteProviderController {
@Autowired
public RestTemplate restTemplate;
@GetMapping("/getUser/{id}")
public User getUser(@PathVariable("id") Integer id){
String url = "http://PROVIDER/user/"+id; // 通过服务名称 获取地址
User user = restTemplate.getForObject(url, User.class);
return user;
}
}