思路:可以将服务消费者调用服务提供者的地址改成服务名称,不必硬编码成ip 地址了,也不用使用DiscoveryClient 类
一, 将RestTemplate类引入注解@LoadBalanced
@SpringBootApplication
@EntityScan("com.zjk.order.entity")
@EnableEurekaClient
public class OrderApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}
@LoadBalanced
二,服务消费者使用服务提供者的服务名称请求
/**
* 基于ribbon 的服务调用,使用服务提供者的服务名称
* @param Id
* @return
*/
@GetMapping(value = "/findByIdByRibbon/{Id}")
public TbProduct findByIdByRibbon(@PathVariable Long Id){
try {
List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
ServiceInstance serviceInstance = instances.get(0);
TbProduct tbProduct = restTemplate.getForEntity("http://service-product/product/{Id}", TbProduct.class,Id).getBody();
return tbProduct;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
TbProduct tbProduct = restTemplate.getForEntity("http://service-product/product/{Id}", TbProduct.class,Id).getBody();
大家可以看出来,我们可以直接使用服务提供者的服务名称请求
其实,ribbon 最重要的作用是负载均衡