1、在我们不使用注册中心时,restTemplate远程调用一个端口时使用的是如下代码
restTemplate.getForObject("http://localhost:8088/demo/", String.class);
缺点:里面硬编码将服务提供者的ip及端口写入代码中,如果哪天服务提供者更换了ip及端口我们还要改代码,这显然不是我们想要的
2、于是就有了注册中心,所有的微服务都注册到注册中心后,服务消费者可以直接去注册中心获取服务提供者信息,选择一个调用,这样不存在硬编码,代码如下
//通过服务发现客户端从注册中心通过服务名称获取服务列表
List<ServiceInstance> instances = discoveryClient.getInstances("andy-provide");
//获取第一个服务实例(这里没有做负载均衡)
ServiceInstance serviceInstance = instances.get(0);
//获取服务的ip及端口
String host = serviceInstance.getHost();
int port = serviceInstance.getPort();
//动态拼接url进行调用
restTemplate.getForObject("http://"+host+":"+port+"/demo/", String.class);
缺点:显而易见,虽然动态拼接了url解决了硬编码,但是需要手动获取服务列表选择调用
3、负载均衡组件ribbon上场
@Bean
@LoadBalanced //在 RestTemplate 上加 LoadBalanced 注解就代表使用ribbon
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
//直接通过服务名称调用,ribbon会去注册中心获取服务列表
//并且负载均衡选择一个服务实例交给restTemplate调用
restTemplate.getForObject("http://andy-provide/demo/", String.class);
总结:当然最终我们是通过feign来调用,其实feign底层也是封装了restTemplate
以下为调用流程
更多知识请扫描关注公众号