以下都是书里的理论,Feign其实没什么理论可以说,要说也是源码的事情,但是现在只是稍微看了一下源码,没办法去写,大家就勉看看,为了保持队形,我也不容易。努力着,微笑着写博客。
我们在使用 Spring Cloud Ribbon 时, 通常都会利用它对 RestTemplate 的请求拦截来实现对依赖服务的接口调用, 而 RestTemplate 已经实现了对 HTTP 请求的封装处理, 形成了一套模板化的调用方法。在之前的例子中,我们只是简单介绍了 RestTemplate 调用的实现,但是在实际开发中,由于对服务依赖的调用可能不止于一处,往往一个接口会被多处调用,所以我们通常都会针对各个微服务自行封装一些客户端类来包装这些依赖服务的调用。 这个时候我们会发现, 由于 RestTemplate 的封装, 几乎每一个调用都是简单的模板化内容。综合上述这些情况, Spring Cloud Feign 在此基础上做了进一步封装, 由它来帮助我们定义和实现依赖服务接口的定义。在 Spring Cloud Feign 的实现下, 我们只需创建一个接口并用注解的方式来配置它, 即可完成对服务提供方的接口绑定, 简化了在使用 Spring Cloud伈bbon 时自行封装服务调用客户端的开发量。 Spring Cloud Feign 具备可插拔的注解支持,包括 Feign 注解和 JAX-RS 注解。 同时, 为了适应 Spring 的广大用户,它在 Netflix Feign 的基础上扩展了对 Spring MVC 的注解支待。 这对千习惯于 Spring MVC 的开发者来说, 无疑是一个好消息, 因为这样可以大大减少学习使用它的成本。 另外, 对于 Feign 自身的一些主要组件, 比如编码器和解码器等, 它也以可插拔的方式提供, 在有需求的时候我们可以方便地扩展和替换它们。
举个栗子:
User user = restTemplate.getForObject("http://microservice-provider-user/{id}" , User.class, id);
这个参数是要拼接上去的,如果我有很多的参数怎么办,可以用map,但是不会感觉很麻烦吗?
用了Feign:
@FeignClient(name = "microservice-provider-user") public interface UserFeignClient { @RequestMapping(value = "/{id}", method = RequestMethod.GET) User findById(@PathVariable("id") int id); }
package com.yjp.microservicesimpleconsumnermovie.client.controller; import com.yjp.microservicesimpleconsumnermovie.client.feign.UserFeignClient; import com.yjp.microservicesimpleconsumnermovie.client.pojo.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class MovieController { @Autowired private UserFeignClient userFeignClient; @GetMapping("/user/{id}") public User findById(@PathVariable int id) { return userFeignClient.findById(id); } }
这样就完成了我们的调用,比之前的话是要方便许多的。
努力吧,皮卡丘