微服务—OpenFeign
微服务—OpenFeign
参考项目路径: D:\Users\lenovo\Desktop\Java学习-代码集\Myself_Practice
OpenFeign 是一个声明式的 Http 客户端
开启OpenFeign
①依赖:
<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
:
@FeignClient(value="item-service")
public interface itenClient{@GetMapping("/item"){List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);}
}
④使用FeignClient 远程调用:
List<ItemDTO> items = itenClient.queryItemByIds(List.of(1,2,3));
连接池
OpenFeign 对 Http 请求做了优雅的伪装, 不过其底层发起 http 请求,依赖于其他的框架。这些框架可以自己选择,包括以下三种:
- HttpURLConnection : 默认实现,不支持连接池。
- Apache HttpClient : 支持连接池
- OKHttp : 支持连接池
具体源码可以参考 FeignBlockingLoadBalancerClient
类中的 delegate 成员变量
OpenFeign 整合 OKHttp 的步骤如下
①引入依赖:
<!--OKHttp -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId>
</dependency>
②开启连接池功能:
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 所在的包
@EnableFeignClients(basePackages="com.xjh.api.client")
方式二: 指定FeignClient 字节码
@EnableFeignClients(clients = {UserClient.class})
日志输出
OpenFeign 只会在 FeignClient 所在包的日志级别为 DEBUG 时,才会输出日志,而且其日志级别有四级:
(Feign 默认的日志级别是 NONE ,所以我们默认是看不到日志的)
- NONE: 不记录任何日志信息,这是默认值
- BASIC: 仅记录请求的方法、URL以及响应状态码的执行时间
- HEADERS: 在basic 的基础上,额外记录了请求和响应的头部信息。
- FULL: 记录所有请求和响应的明细,包括头信息,请求体,元数据。
要自定义日志级别需要声明一个类型为 Logger.level 的 bean ,在其中定义日志级别:
public class MyFeignConfig {public Logger.Level feignLoggerLevel(){return Logger.Level.FULL;}
}
注意!!! 此时我们的 这个 Bean 还未生效,要想配置某个 FeignClient 的日志,可以在 启动类 注解中声明:
@EnableFeignClients( defaultConfiguration = MyFeignConfig.class)
此时,对所有的 feign 客户端,这个日志级别都生效。
也可以 单独配置 ! 我们只需要在 @FeignClient 注解上进行配件就行
@FeignClient(value = "model-name" , configuration = MyFeignConfig.class)