微服务---OpenFeign
参考项目路径: D:\Users\lenovo\Desktop\Java学习-代码集\Myself_Practice
OpenFeign 是一个声明式的 Http 客户端
开启OpenFeign
①依赖:
            
            
              xml
              
              
            
          
          <dependency>
	<groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
        ②自动类加注解:
通过 @EnableFeignClients 注解,启用 OpenFeign 功能
③编写 FeignClient:
            
            
              java
              
              
            
          
          @FeignClient(value="item-service")
public interface itenClient{
		@GetMapping("/item"){
		List<ItemDTO>  queryItemByIds(@RequestParam("ids") Collection<Long> ids);
		}
}
        ④使用FeignClient 远程调用:
            
            
              java
              
              
            
          
          List<ItemDTO> items = itenClient.queryItemByIds(List.of(1,2,3));
        连接池
OpenFeign 对 Http 请求做了优雅的伪装, 不过其底层发起 http 请求,依赖于其他的框架。这些框架可以自己选择,包括以下三种:
- HttpURLConnection : 默认实现,不支持连接池。
 - Apache HttpClient : 支持连接池
 - OKHttp : 支持连接池
 
具体源码可以参考 FeignBlockingLoadBalancerClient 类中的 delegate 成员变量
OpenFeign 整合 OKHttp 的步骤如下
①引入依赖:
            
            
              xml
              
              
            
          
          <!--OKHttp -->
<dependency>
	<groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
</dependency>
        ②开启连接池功能:
            
            
              yaml
              
              
            
          
          feign:
	okhttp:
		enabled: true #开启 OKHttp 连接池功能
        实践使用
第一种: 我们可以把各个模块自己的 实体类 和 想要暴漏的 feign 的接口的客户端再分成几个小模块,然后,模块自己编写自己的 feign 的模块,里面编写自己想要展示的 feign 的接口
第二种: 我们可以再新增一个模块,来存放 将会调用的 feign 的 接口和feign接口返回的实体类,
示例:(第二种)
- 我们新增一个模块,用来存放 feign接口,和 返回的实体类 例如 api-model
 - 首先我们把 openfeign 的相关依赖,引入到 api-model 的pom 中去,这样之后,我们其他模块,在引入api-model 模块之后,就自动引入了openfeign 的相关依赖
 - 然后,我们在其他模块引用 api-model 的依赖之后,就可以直接只用 feignClient 调用其他模块的接口。
 
当定义的 FeignClient 不在 SpringBootApplication 的扫描包范围的时候,这些 FeignClient 无法使用,有两种方式可以解决:
以下两种注解是在 要使用feign的启动类上面加 (也就是 不是 api-model 这个类的启动类)
方式一: 指定 feignClient 所在的包
            
            
              java
              
              
            
          
          @EnableFeignClients(basePackages="com.xjh.api.client")
        方式二: 指定FeignClient 字节码
            
            
              java
              
              
            
          
          @EnableFeignClients(clients = {UserClient.class})
        日志输出
OpenFeign 只会在 FeignClient 所在包的日志级别为 DEBUG 时,才会输出日志,而且其日志级别有四级:
(Feign 默认的日志级别是 NONE ,所以我们默认是看不到日志的)
- NONE: 不记录任何日志信息,这是默认值
 - BASIC: 仅记录请求的方法、URL以及响应状态码的执行时间
 - HEADERS: 在basic 的基础上,额外记录了请求和响应的头部信息。
 - FULL: 记录所有请求和响应的明细,包括头信息,请求体,元数据。
 
要自定义日志级别需要声明一个类型为 Logger.level 的 bean ,在其中定义日志级别:
            
            
              java
              
              
            
          
          public class MyFeignConfig {
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}
        注意!!! 此时我们的 这个 Bean 还未生效,要想配置某个 FeignClient 的日志,可以在 启动类 注解中声明:
            
            
              java
              
              
            
          
          @EnableFeignClients( defaultConfiguration = MyFeignConfig.class)
        此时,对所有的 feign 客户端,这个日志级别都生效。
也可以 单独配置 ! 我们只需要在 @FeignClient 注解上进行配件就行
            
            
              java
              
              
            
          
          @FeignClient(value = "model-name" , configuration = MyFeignConfig.class)