feign远程调用学习

Feign是一个声明式HTTP客户端,帮助我们发送Http请求

https://github.com/OpenFeign/feign

为什么使用Feign?

    当一个微服务调用另外一个微服务时,通过Rest风格的http请求调用目标微服务的接口。之前学习中使用的RestTemplate,传入URL发出请求
    如http://localhost:注册的服务名/uri
    这种方式如果URL参数复杂,难以维护

    使用Feign可以帮助我们解决这个问题

使用Feign替代RestTemplate

使用步骤
  1. 引入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 添加注解
在服务的启动类上添加 @EnableFeignClients 注解
  1. 新建Feign接口
@FeignClient("目标服务名")
public interface 接口名{
    请求方式(请求路径)
    返回值类型 方法名(请求参数);

    例如:
    @@GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}
  1. 远程调用
1. 注入Feign接口
2. 使用接口方法
Feign配置
  1. logger.level 日志级别
1. 配置文件方式
feign:
  client:
    config:
      default(全局)/服务名(单个服务)
	  loggerLevel: BASIC
2. Java代码方式
  2.1 声明一个类,声明一个Logger.Level类型的对象
  2.2.1
    全局生效: 在启动类的@EnableFeignClient注解上添加defaultConfigeration属性,值为声明的类的class
    服务生效:在目标服务类的@FeignClient注解上添加value = 属性名,configeration = 配置类class
NONE 不记录任何日志,默认级别
BASIC 记录请求方法、URL、响应状态码、执行时间
HEADERS 在BASIC的基础上额外记录请求头和响应头
FULL 记录所有请求和响应的信息,包括头、体、元数据
Feign优化
  1. Feign发起http请求依赖其他客户端,使用支持连接池的客户端
  2. 日志级别
URLConnection 默认客户端,不支持连接池
Apcahe HttpClient 支持连接池
OKHttp 支持连接池

1.1 使用HttpClient替换默认客户端

添加HttpClient依赖

<!--httpClient的依赖 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

配置文件

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数
实践
  1. feign的接口与controller相似,抽取共性
1. 使用继承,controller与feign继承同一个接口,该接口写明了路径、方法、返回值、参数
简单且代码共享,但耦合度高,参数中的注解不会被继承,在controller中需要声明

2. 抽取为一个Feign远程调用的微服务,其他微服务依赖该服务
    将pojo与feign配置都放置在该服务中,所有消费者依赖该服务
流程
  1. 创建Feign服务,引入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 将Client,config,pojo放入该服务
  2. 在消费者服务中使用
1. 删除之前有关feign的类或接口
2. 进入自定义的feign服务依赖
3. 修改 @EnableFeignClients 扫描路径
    1. basePackages指定扫描包为Feign服务的client包 .格式的包名
    2. client属性指定加载的client接口 接收class
posted @ 2023-02-09 17:21  KoitoYuuuuuu  阅读(45)  评论(0)    收藏  举报