Spring Cloud - HTTP 客户端 Feign 、自定义配置、优化、最佳实践

这篇具有很好参考价值的文章主要介绍了Spring Cloud - HTTP 客户端 Feign 、自定义配置、优化、最佳实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、OpenFeign 是什么,有什么用呢?

二、OpenFeign 客户端的使用

2.1、远程调用

1.引入依赖

2.在order-service(发起远程调用的微服务)的启动类添加注解开启Feign的功能

3.编写 OpenFeign 客户端

4.通过 OpenFeign 客户端发起远程调用

2.2、自定义 OpenFeign 配置

1.配置文件方式

2.java代码方式

2.3、Feign 的性能优化

1.引入依赖

2.配置连接池

2.4、Feign 的最佳实践

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

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


一、OpenFeign 是什么,有什么用呢?


以往我们是通过 RestTemplate 发起远程调用,如下

springcloudfeign配置,Spring Cloud,spring cloud,http,spring

存在问题如下:

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

Feign  是一个声明式的 http 客户端,其作用就是用来把我们解决上述问题的~

二、OpenFeign 客户端的使用


2.1、远程调用

主要分为以下步骤:

1.引入依赖

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

注意:由于SpringCloud Feign高版本(例如 2020.1.0)不使用Ribbon而是使用spring-cloud-loadbalancer,所以需要引用spring-cloud-loadbalancer或者降版本

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

2.order-service(发起远程调用的微服务)的启动类添加注解开启Feign的功能

springcloudfeign配置,Spring Cloud,spring cloud,http,spring

3.编写 OpenFeign 客户端

主要是基于SpringMVC的注解来声明远程调用的信息,比如:

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值类型:User
import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Component
@FeignClient("userservice")
public interface UserClients {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);

}

如果是高版本的 SpringCloud,那么就需要使用 SpringCloud LoadBalencer 做负载均衡(也比较建议).

具体的添加@LoadBalancerClient注解:在调用服务的Service类上添加@LoadBalancerClient注解,并指定服务名。这样,负载均衡器将根据配置的属性来选择合适的服务实例进行调用。例如:

如下:

@FeignClient(value = "service-name", configuration = LoadBalancerClientConfiguration.class) 
public interface MyService {  
    @LoadBalanced  //启用负载均衡
    @GetMapping("/endpoint")  
    String getEndpointData();  
}

4.通过 OpenFeign 客户端发起远程调用

springcloudfeign配置,Spring Cloud,spring cloud,http,spring

用 Feign 来代替 RestTemplate 是不是十分优雅~

2.2、自定义 OpenFeign 配置

2.2.1、超时时间

Ps:OpenFeign早期版本(例如 Hoxton.SR6 )要求服务提供方在1秒内处理业务逻辑并返回响应。如果超过1秒没有返回,OpenFeign会直接报错,不会等待服务执行。随着版本的更新,OpenFeign已经对此做出了调整或优化(例如 2021.0.1)。

超时报错如下:

springcloudfeign配置,Spring Cloud,spring cloud,http,spring

修改超时时间:

a)在远程调用方的 application.yml 中配置,指定某个服务提供方的调用超时时间

feign:
  client:
    config:
      product: # 服务名
        connect-timeout: 5000 # 配置指定服务连接超时时间
        read-timeout: 5000 # 配置指定服务等待超时时间

b)在远程调用方的 application.yml 中配置,指定所有服务提供方的调用超时时间

feign:
  client:
    config:
      default: # 所有服务
        connect-timeout: 5000 # 配置指定服务连接超时时间
        read-timeout: 5000 # 配置指定服务等待超时时间

2.2.2、日志使用

OpenFeign 为了更好的方便在开发过程中检测 openfeign 数据传递 和 响应处理,在设计时提供了日志功能.  默认 openfeign 日志功能需要手动开启的.

日志级别有以下 4 种:

  1. NONE:不记录任何日志.
  2. BASIC:仅仅记录请求方法、url、响应状态代码及执行时间.
  3. HEADERS:记录 Basic 级别的基础上,记录请求和响应的header.
  4. FULL:展示所有 HTTP 协议状态.

配置Feign日志有以下两种方式:

1.配置文件方式(推荐)

a)开启 openfeign 日志展示

#开启 openfeign 日志
logging:
  level:
    org: # 这里是 feign 客户端接口包路径
      example:
        feign: debug

b)全局生效

feign:
  client:
    config:
      default: # 所有服务生效
        logger-level: FULL

c)局部生效

feign:
  client:
    config: 
      user: # 如果是写服务名称,则是针对某个微服务的配置
        logger-level: FULL

d)FULL 级别日志展示如下

springcloudfeign配置,Spring Cloud,spring cloud,http,spring

2.java代码方式

首先需要声明一个 Bean,如下

public class FeignClientConfiguration {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC;  //一般使用 BASIC 级别,因为太多的日志信息影响效率
    }
}

情况一:如果是全局配置,则把它放到@EnableFeignClients这个注解中:

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class) 

情况二:如果是局部配置,则把它放到@FeignClient这个注解中:

@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class) 

2.3、Feign 的性能优化

Feign 的底层客户端实现:

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

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

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

因此使用 HttpClient 或 OKHttp 代替 URLConnection

1.引入依赖

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

2.配置连接池

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

2.4、Feign 的最佳实践

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

仔细观察我们可以发现, Feign 发起远程调用的接口和接收远程调用请求的 controller 层实现代码是一样的,因此,我们我可以把他们的共性提取出来,写成一个公开的接口,将来我们使用的时候只需要继承这个接口即可,如下图

 springcloudfeign配置,Spring Cloud,spring cloud,http,spring

 但这种方式存在一定的问题,以下是官方提出的问题:

springcloudfeign配置,Spring Cloud,spring cloud,http,spring

也就是说

  • 服务紧耦合
  • 不适用于 Spring MVC (父接口参数列表中的映射不会被继承

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

springcloudfeign配置,Spring Cloud,spring cloud,http,spring

 具体步骤:

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

springcloudfeign配置,Spring Cloud,spring cloud,http,spring

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


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

springcloudfeign配置,Spring Cloud,spring cloud,http,spring


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

springcloudfeign配置,Spring Cloud,spring cloud,http,spring

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

5.重启测试

这个时候你重启项目,项目必然会报以下错误

springcloudfeign配置,Spring Cloud,spring cloud,http,spring

为什么 UserClients 没有对应的对象呢?

UserClients 之前有对象是因为扫描到 @FeignClient 注解注入了对象 ,而现在 order-service 扫描包的范围是启动类下的包,但由于我们刚刚把 UserClients 挪到了 feign-api 这个 Module 中,因此,扫描不到该注解,无法注入对象。

总而言之:当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。

有以下两种解决方式:

方式一:指定FeignClient所在包

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

这种方式会将指定包下的所有东西都拿过来。

方式二(推荐):指定FeignClient字节码

@EnableFeignClients(clients = {UserClient.class})

这种方式是精准打击,只拿指定的类,效率上更推荐使用,用哪个,就指定哪个.

springcloudfeign配置,Spring Cloud,spring cloud,http,spring文章来源地址https://www.toymoban.com/news/detail-591463.html

到了这里,关于Spring Cloud - HTTP 客户端 Feign 、自定义配置、优化、最佳实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务中间件--http客户端Feign

    以前利用RestTemplate发起远程调用的代码: 存在下面的问题: 代码可读性差,编程体验不统一 参数复杂URL难以维护 Feign的介绍 Feign是一个声明式的http客户端, 其作用就是帮助我们优雅的实现http请求的发送, 解决上面提到的问题。 使用Feign的步骤如下: 1.引入依赖: 2.在order-

    2024年02月11日
    浏览(44)
  • SpringCloud Alibaba - HTTP 客户端 OpenFeign 、自定义配置、优化、最佳实践

    目录 一、OpenFeign 是什么,有什么用呢? 二、OpenFeign 客户端的使用 2.1、远程调用 1.引入依赖 2.在order-service(发起远程调用的微服务)的启动类添加注解开启Feign的功能 3.编写 OpenFeign 客户端 4.通过 OpenFeign 客户端发起远程调用 2.2、自定义 OpenFeign 配置 1.配置文件方式 2.j

    2024年02月08日
    浏览(48)
  • Http远程调用(feign客户端通过POST传递FORM格式数据)

    目录       feign实现http远程调用(正文)       解决方案: 在正式讲解HTTP远程调用时,我们先来了解一下缺省方法的定义。 写在前面: 缺省参数可传可不传,可以传多个但他们必须是相同的类型 每个方法中缺省参数只能定义一个,并且只能在参数的最后定义; 缺省参

    2023年04月08日
    浏览(40)
  • Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon

    Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon 目前主流的负载均衡方案有两种,一种是集中式均衡负载,在消费者与服务提供者之间使用独立的代理方式进行负载,比如F5、Nginx等。另一种则是客户端自己做负载均衡,根据自己的请求做负载,Ribbon就属于客户端自己

    2024年02月09日
    浏览(52)
  • [Kafka集群] 配置支持Brokers内部SSL认证\外部客户端支持SASL_SSL认证并集成spring-cloud-starter-bus-kafka

    目录 Kafka 集群配置 准备 配置流程 Jaas(Java Authentication and Authorization Service )文件 zookeeper 配置文件 SSL自签名 启动zookeeper集群 启动kafka集群  spring-cloud-starter-bus-kafka 集成 下载统一版本Kafka服务包至三台不同的服务器上 文章使用版本为  kafka_2.13-3.5.0.tgz 下载地址 jdk版本 为 Ado

    2024年02月04日
    浏览(53)
  • 【WebClient】客户端HTTP 超时配置

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 1、项目升级到Springboot3,使用WebFlux自带的WebClient作为HTTP客户端 2、接口类客户端方式调用外部服务,默认超时5S 3、需根据业务动态修改超时时间,如60S 报错如下: java.lang.IllegalStateException: Timeout on bl

    2024年02月12日
    浏览(39)
  • Spring 教程—REST 客户端详解(WebClient 、RestTemplate、HTTP 接口)

    Spring框架为调用REST端点提供了以下选择: WebClient - 非阻塞、响应式客户端和 fluent API。 RestTemplate - 带有模板方法API的同步客户端。 HTTP 接口 - 注解式接口,并生成动态代理实现。 WebClient  是一个非阻塞的、响应式的客户端,用于执行HTTP请求。它在5.0中引入,提供了  Re

    2024年02月07日
    浏览(42)
  • 配置基于 AWS CRT 的 HTTP 客户端

    基于 AWS CRT 的 HTTP 客户端包括同步 AwsCrtHttpClient 和异步 AwsCrtAsyncHttpClient。基于 AWS CRT 的 HTTP 客户端具有以下 HTTP 客户端优势: 更快的 SDK 启动时间 更小的内存占用空间 降低的延迟时间 连接运行状况管理 DNS 负载均衡 SDK 中基于 AWS CRT 的组件 本主题中介绍的基于 AWS CRT 的 

    2024年02月21日
    浏览(43)
  • 基于Spring Boot2.0 & HTTP/2 实现服务器、客户端

    HTTP协议由于其无状态的特性以及超高的普及率,是当下大部分网站选择使用的应用层协议。然而,HTTP/1.x的底层传输方式的几个特性,已经对应用的整体性能产生了负面影响。特别是,HTTP/1.0在每次的TCP连接上只允许发送一次请求,在HTTP/1.1中增加了请求管线,但是这仅仅解决

    2023年04月09日
    浏览(63)
  • 十二、Feign客户端整合Hystrix服务保护

    目录 1、项目pom文件中引入feign客户端依赖 2、编写feign客户端接口,并配置fallback回调方法的类 3、编写controller,使用feign客户端进行RPC远程过程调用

    2024年02月05日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包