一、它们都可以用来调用远程服务。
二、
1、RestTemplate可以直接调用远程服务
@GetMapping("/consumer/doRest1")
public String doRest1(){
//远端服务的url地址
String url="http://localhost:8081/provider/echo/{msg}";
return restTemplate.getForObject(url,
String.class,serverPort);
}
2、RestTemplate也可以用负载均衡的方式调用远程服务
1)使用loadBalancerClient这个API
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@GetMapping("/consumer/doRest2")
public String doRest2(){
//从nacos中动态获取服务列表,并基于内置负载均衡算法获取服务实例
//1)基于服务名(这个名字是nacos注册中心中的一个服务名)获取服务实例
ServiceInstance serviceInstance =
loadBalancerClient.choose("provider");
//2)基于服务实例构建远端服务url
String url="http://%s:%s/provider/echo/{msg}";
String ip=serviceInstance.getHost();
int port=serviceInstance.getPort();
url=String.format(url,ip,port);
//3)进行远端服务调用
return restTemplate.getForObject(url,
String.class,serverPort);
}
2)使用注解@LoadBalanced
@Bean
@LoadBalanced
public RestTemplate loadBalancedRestTemplate(){
return new RestTemplate();
}
@GetMapping("/consumer/doRest3")
public String doRest3(){
//1)构建请求url,这个url使用服务名替换ip:port
String url=String.format("http://%s/provider/echo/{msg}","provider");
//2)实现服务调用(这里的RestTemplate必须具备基于服务名查找服务实例的能力)
return loadBalancedRestTemplate.getForObject(url,
String.class,serverPort);
}
其中@LoadBalanced底层封装了LoadBalancerClient这个接口,而LoadBalancerClient这个接口是由RibbonLoadBalancerClient这个类来实现的。
3、 Feign也可以实现远程服务调用(用的较多)
Feign 是一种声明式Web服务客户端,底层封装了对Rest技术的应用。
Feign 方式的远程服务调用,底层会自动基于ribbon组件实现负载均衡。
@FeignClient(name="provider")
public interface RemoteProviderService{
@GetMapping("/provider/echo/{msg}")
public String Message(@PathVariable String msg);
}
如果调用的服务突然不可用了或者调用过程超时了还需要设置熔断机制:
其中需要设置fallbackFactory 来实现打印日志信息,并在application.yml配置文件中启动熔断处理。
三、
RestTemplate中涉及了模板方法
Feign中涉及到了代理模式、门面模式(@Slf4j)、策略模式