Feign

Feign概述

前面的可以发现当我们通过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接口编写

    @FeignClient(name = "接口对应需要调用的服务名")
    public interface UserFeignClient {
             @GetMapping("/getUser")
             public String getUserByNewsId(@RequestParam(required = false) Integer nid);
             @GetMapping("/test1")
             public String test1(@RequestParam("p1") String p1, @RequestParam("p2") Integer p2);
             @GetMapping("/query")
             public List<UserDto> query(@SpringQueryMap/*表单参数注解*/ UserDto user);
             @PostMapping("/queryJson")
             public UserDto queryJson(@RequestBody UserDto user);
             @GetMapping("/list")
             public List<UserDto> list();
             @GetMapping("/getById/{id}")
             public UserDto getById(@PathVariable Integer id);
    }
    

    3.调用

    @Autowired
    private UserFeignClient userFeignClient;
    UserDto user = userFeignClient.getById(1);
    

    Feign的配置

    Java配置

  6. 编写配置类

    @Configuration
    public class FeignConfig {
         //Feign的日志级别配置
         @Bean
         public Level createLevel() {
             return Level.FULL;
         }
    }
    
  7. 在主配置类指定

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

    属性配置

    feign:
    client:
      config:
        default: #这里可以换成服务名进行局部配置
          logger-level: full 
    httpclient:
     enabled: true #开启httpclient连接池配置   
     max-connections: 200
     max-connections-per-route: 50
     connection-timeout: 200000
    

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

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

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