Feign概述

注意事项 feign的版本跟 springCloud springboot 很容易有版本依赖冲突 ..在一定注意依赖版本
前面的可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻。
Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Sentinel(关于Sentinel我们后面再讲),可以让我们不再需要显式地使用这两个组件
Feign具有如下特性:

  1. 可插拔的注解支持,包括Feign注解和JAX-RS注解;
  2. 支持可插拔的HTTP编码器和解码器;
  3. 支持Sentinel和它的Fallback;
  4. 支持Ribbon的负载均衡;
  5. 支持HTTP请求和响应的压缩;

这看起来有点像我们springmvc模式的Controller层的RequestMapping映射。这种模式是我们非常喜欢的。Feign是用@FeignClient来映射服务的。
Feign是以接口方式进行调用,而不是通过RestTemplate来调用,feign底层还是ribbon,它进行了封装,让我们调用起来更加happy.总结,就是feign通过一个本地对服务接口的代理,进行对注册到注册中心的服务调用,对于调用者来说,就像调用本地接口一样。

Feign的操作

  1. 导包

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-openfeign</artifactId>
    4. </dependency>
  2. feign接口编写

    1. @FeignClient(name = "接口对应需要调用的服务名")
    2. public interface UserFeignClient {
    3. @GetMapping("/getUser")
    4. public String getUserByNewsId(@RequestParam(required = false) Integer nid);
    5. @GetMapping("/test1")
    6. public String test1(@RequestParam("p1") String p1, @RequestParam("p2") Integer p2);
    7. @GetMapping("/query")
    8. public List<UserDto> query(@SpringQueryMap/*表单参数注解*/ UserDto user);
    9. @PostMapping("/queryJson")
    10. public UserDto queryJson(@RequestBody UserDto user);
    11. @GetMapping("/list")
    12. public List<UserDto> list();
    13. @GetMapping("/getById/{id}")
    14. public UserDto getById(@PathVariable Integer id);
    15. }
  3. 调用 ```html @Autowired private UserFeignClient userFeignClient;

UserDto user = userFeignClient.getById(1);

  1. <a name="C1Hfh"></a>
  2. ## Feign的配置
  3. <a name="umq8d"></a>
  4. ### Java配置
  5. 1. 编写配置类
  6. ```java
  7. @Configuration
  8. public class FeignConfig {
  9. //Feign的日志级别配置
  10. @Bean
  11. public Level createLevel() {
  12. return Level.FULL;
  13. }
  14. }
  1. 在主配置类指定

    1. @FeignClient(configuration = FeignConfig.class)
    2. public class BaseConfig {}

    属性配置

    1. feign:
    2. client:
    3. config:
    4. default: #这里可以换成服务名进行局部配置
    5. logger-level: full
    6. httpclient:
    7. enabled: true #开启httpclient连接池配置
    8. max-connections: 200
    9. max-connections-per-route: 50
    10. connection-timeout: 200000

    Feign的原理: 通过定义的接口信息使用java动态代理生成执行对象,该对象ivcation方法里面会分封装一个RequestTemplate,该对象用来完成请求响应,在请求的时候它会调clientAPI(可能是HttpClient,okHttp),我们可以去选择开启谁,并且导入相关jar包,在发请求该对象会先去把配置的拦截器(RequestIntercepotor)执行了,还做做负载均衡服务发现处理,最后发请求
    注意:

  2. 普通的参数必须跟上@RequestParam

  3. JSON参数跟上@RequestBody
  4. 对象或则map的查询参数必须跟上@SpringQueryMap