Feign

RestTemplate方式调用存在的问题

String url = "http://userservice/user/" + order.getUserId();

User user = restTemplate.getForObject(url,User.class);

代码可读性差,编程体验不统一

参数复杂URL难以维护

Feign的介绍

Feign是一个声明式的http客户端,官方地址https://github.com/OpenFeign/feign

其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。

 

定义和使用Feign客户端

引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

开启Feign

在orderservice启动类上添加EnableFeignClients

创建客户端接口UserClient

 

使用Feign方式拉取服务

 

自定义Feign配置

Feign配置参数

Feign运行自定义配置来覆盖默认配置,可以修改配置如下:

 

配置Feign日志的两种方式

方式一:配置文件方式

全局生效

feign:
  client:
    config:
      default: #这里使用default就是全局配置,如果写服务名称就是针对某个微服务的配置
        loggerLevel: FULL

局部生效

feign:
  client:
    config:
      default: #这里使用default就是全局配置,如果写服务名称就是针对某个微服务的配置
        loggerLevel: FULL

 

方式二:java代码方式

需要先声明一个Bean

全局配置,使用EnableFeignClient注解

局部配置,使用FeignClient注解,value指定服务名

 

Feign的性能优化

Feign底层的客户端实现

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

因此优化Feiign的性能主要包括

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

Feign的性能优化-连接池配置

Feign添加HttpClient的支持:

引入依赖(httpclient的依赖)

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

 

配置yml文件

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

 

 

Feign的最佳实践

方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。通过API来约束Fiegn客户端和提供者的服务

一般不推荐,会造成紧耦合。

 

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

 

抽取FeignClient的实现

1.首先创建一个module,命名为feign-api,然后引入feign的starter依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.将order-service中编写的UserClient,User,DefaultFeignConfiguration都复制到feign-api项目中。

 

3.在order-service中引入feign-api的依赖。

 

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

 

4.修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包

 

 

当定义FeignCLient不再SPringBootApplication的扫描包范围时,这些FeignClient无法使用,两种解决方案:

 

方式一:指定FeignClient所在包

方式二:指定FeignFlient字节码

posted @   Laplace蒜子  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示