01_Feign介绍
RPC概述:
RPC 全称是 Remote Procedure Call ,即远程过程调用,其对应的是我们的本地调用。
RPC 的目的是:让我们调用远程方法像调用本地方法一样。
//本地调用 R result = orderService.findOrderByUserId(id); //RPC远程调用 orderService为代理对象 R result = orderService.findOrderByUserId(id)
RPC框架设计架构:
什么是Feign:
Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。
Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不需要通过常规的 Http Client 构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。
Spring Cloud openfeign对Feign进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Eureka,从而使得Feign的使用更加方便。
Ribbon&Feign对比:
Ribbon+RestTemplate进行微服务调用
@RequestMapping(value = "/findOrderByUserId/{id}") public R findOrderByUserId(@PathVariable("id") Integer id) { log.info("根据userId:" + id + "查询订单信息"); // ribbon实现,restTemplate需要添加@LoadBalanced注解 String url = "http://mall-order/order/findOrderByUserId/" + id; return restTemplate.getForObject(url, R.class); }
Feign进行微服务调用
实现feign接口:
@FeignClient(value = "mall-order", path = "/order") public interface OrderFeignService { @RequestMapping("/findOrderByUserId/{userId}") R findOrderByUserId(@PathVariable("userId") Integer userId); }
使用feign进行调用:
@Autowired OrderFeignService orderFeignService; @RequestMapping(value = "/findOrderByUserId/{id}") public R findOrderByUserId(@PathVariable("id") Integer id) { //feign调用 return orderFeignService.findOrderByUserId(id); }
Feign的设计架构