Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送,解决硬编码的代码可读性差、参数复杂URL难以维护的问题。

使用步骤

Fegin的使用步骤非常简单
1) pom文件当中引入feign的依赖
2) 在启动类添加注解@EnableFeignClients开启Feign的功能
3) 编写Feign的客户端

@FeignClient("userservice")
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

该接口当中包含了如下信息:服务名称:userservice请求方式:GET请求路径:/user/{id}请求参数:Long id返回值类型:User,这样,Feign就可以帮助我们发送http请求

4) 调用
在需要发送该请求的地方,注入该接口,然后直接调用该方法即可

    @Autowired
    private UserClient userClient;

    public XXX XxxXxx(Xxx xxx) {
    	*****************
    	*****************
    	//直接调用
        User user = userClient.findById(id);
        *****************
        *****************
    }

使用优化

Feign底层客户端实现包括:

  • URLConnection:默认实现,不支持连接池

  • Apache HttpClient :支持连接池

  • OKHttp:支持连接池

因此可以使用HttpClient或者OKHttp代替默认的URLConnection来提高Feign的性能。
步骤也非常简单:
1) 引入依赖,feign-httpclient或者ok-http
2) 在配置文件中添加配置,配置连接池(以httpclient为例)

feign:
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

除了以上优化方法外,日志级别用basic也可以提高Feign的性能

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息

日志的级别分为四种:

  • NONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

实际开发当中的使用

实际开发当中我们将Feign的XxxClient抽取为独立模块feign-api,并且把有关的POJO、默认的Feign配置都放到这个模块中,所有微服务引用该模块的依赖包,即可直接调用。

        <dependency>
            <groupId>cn.itcast.demo</groupId>
            <artifactId>feign-api</artifactId>
            <version>1.0</version>
        </dependency>

在这里插入图片描述

注意:
模块feign-api当中XxxClient所在的包名通常与服务消费者的@EnableFeignClients注解所在的包名(启动类所在的包)不一致,因此无法扫描到UserClient。
有两种方式解决:

方式一:

指定Feign应该扫描的包:

@EnableFeignClients(basePackages = "cn.itcast.feign.clients")

方式二:

指定需要加载的Client接口:

@EnableFeignClients(clients = {UserClient.class})
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐