SpringCloud07_Feign远程调用(HTTP客户端Feign)

203 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情


⭐️前面的话⭐️

✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《王道408》,📚《深入理解 Java 虚拟机-周志明》,📚《Java 核心技术卷》
💬算法刷题:✅力扣🌐牛客网
🎈Github
🎈码云Gitee


七、Feign远程调用(HTTP客户端Feign)

 // vaule和name 其实是一个属性
 public @interface FeignClient {
     @AliasFor("name")
     String value() default "";
 ​
     @AliasFor("value")
     String name() default "";
     ......
 }
 ​
 @FeignClient(name="${feign.name.element2:element-server2}")
 public interface IBaseDataFeignClient extends IBaseDataFeignController {
 }

7.1 Feign替代RestTemplate

  • RestTemplate方式调用存在的问题
 String url = "http://userservice/user/" + order.getUserId();
 User user = restTemplate.getForObject(url, User.class);

代码可读性差,编程体验不统一;参数复杂URL难以维护。

  • Feign的介绍

    • 官网:github.com/OpenFeign/f…
    • Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现 http 请求的发送,解决上面提到的问题。
 # 声明式
 理解声明式:如spring的声明式事务,对谁加事务规则定义好,spring来实现事务。
 ​
 feign接口定义:发http请求的信息写出来就可以

  • 定义和使用Feign客户端

1)引入依赖

 <!--feign客户端依赖-->
 <dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency>

2)在order-service的启动类添加注解开启Feign的功能:@EnableFeignClients

3)编写Feign客户端

7.2 自定义配置Feign日志的2种方式

方式1:配置文件

方式2:java代码方式,需要先声明一个Bean

7.3 Figen使用优化(性能调优)

Feign底层的客户端实现:

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

因此优化Feign的性能主要包括:

  • 使用连接池代替默认的URLConnection
  • 日志级别,最好用 basicnone

连接池配置(以HttpClient为例)

1)引入feign-httpClient依赖

 <!--引入HttpClient依赖-->
 <dependency>
   <groupId>io.github.openfeign</groupId>
   <artifactId>feign-httpclient</artifactId>
 </dependency>

2)配置文件开启httpClient功能,设置连接池参数

 feign:
   client:
     config:
       default: # default全局的配置
         loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息 
   httpclient:
     enabled: true # 支持HttpClient的开关
     max-connections: 200 # 最大连接数
     max-connections-per-route: 50 # 单个路径的最大连接数

Feign的优化:

1)日志级别尽量用basic

2)使用HttpClient或OKHttp代替URLConnection

引入feign-httpClient依赖

配置文件开启httpClient功能,设置连接池参数

7.4 Feign最佳实践(我做过的内容)

 所谓继承:让controller和FeignClient继承同一接口
 ​
 所谓抽取:将FeignClient、POJO、Feign的默认配置都定义到一个项目中,供所有消费者使用

方式一(继承)

给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。

方式二(抽取)

将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用

实现Feign最佳实践

 # 实现最佳实践方式二的步骤如下:
 ​
 (1)首先创建一个module,命名为feign-api,然后引入feign的starter依赖
 ​
 (2)将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
 ​
 (3)在order-service中引入feign-api的依赖
 ​
 (4)修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
 ​
 (5)重启测试

当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决: