微服务—OpenFeign

微服务---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)