SpringCloud - OpenFeign使用

本文介绍了如何在Java项目中利用OpenFeign简化接口调用,包括Feign的基本概念、使用步骤、配置详解、自定义拦截器和超时设置。重点展示了Spring Cloud下的Feign与Gateway集成以及不同HTTP客户端的选择。

一、Java项目中如何实现接口调用?

1)Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协 议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带的 URLConnection,提升了易用性和灵活性,使客户端发送 HTTP 请求变得容易,提高了开发的效率。

2)Okhttp 一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 拥有简洁的 API、高效的性能,并支持多种协议 (HTTP/2 和 SPDY)。

3)HttpURLConnection HttpURLConnection 是 Java 的标准类,它继承自 URLConnection,可用于向指定网站发送 GET 请求、 POST 请求。HttpURLConnection 使用比较复杂,不像 HttpClient 那样容易使用。

4)RestTemplate RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。 上面介绍的是最常见的几种调用接口的方法,我们下面要介绍的方法比上面的更简单、方便,它就是 Feign。

二、什么是Feign

Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。 Feign可帮助我们更加便捷、优雅地调用HTTP API。 Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。Spring Cloud openfeign对Feign进行了 增强,使其支持Spring MVC注解,另外还整合了Ribbon和Eureka,从而使得Feign的使用更加方便

1.1 优势

Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方 法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不 需要通过常规的 Http Client 构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法 一样,无需关注与远程的交互细节,更无需关注分布式环境开发。

Feign设计架构

在这里插入图片描述

三、OpenFeign使用

1、OpenFeign配置使用

OpenFeign的使用首先肯定得依赖Spring Cloud,作为Alibaba微服务架构,以下依赖必不可少。
在这里插入图片描述

1、引入pom依赖

<!-- openfeign服务调用 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

openFeign底层内置了Ribbon框架,从依赖关系就可以看出
在这里插入图片描述

2、消费端开启Feign服务调用

在订单服务(dt-order-service)启动器上开启Feign的服务调用,以此来调用库存服务端的接口方法。
@EnableFeignClients :开启服务调用
在这里插入图片描述

3、消费端动态代理Service接口

@FeignClient(name = "dt-stock-service",path = "/stock")
public interface StockFeignService {
    
    @GetMapping(value = "/getPort")
    String getPort();
}
@FeignClient(name = "dt-stock-service",path = "/stock")
dt-stock-service:服务提供者的服务名称,
path:服务提供者的统一前缀(即Controller的前缀路径,如果没有就不填)

在这里插入图片描述
在这里插入图片描述
提示:Feign的集成特性可以让服务的接口定义单独抽出来,作为公共的依赖,以方便使用。在实际的项目开发中都会将需要对外提供的服务统一放到一个API服务里面。

四、OpenFeign日志配置

在默认情况下,OpenFeign默认的日志是关闭的,在我们开发过程中,需要调试接口,或者看看调用性能,就需要配置OpenFeign的日志,把OpenFeign的调用日志清晰的打印出来,方便我们开发。
Feign日志级别:

NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。 
BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。 
HEADERS:记录BASIC级别的基础上,记录请求和响应的header。 
FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据

2.1 全局配置日志

OpenFeignConfig.class

/**
 * 全局配置:OpenFeign的全局日志配置
 * 局部配置:不加@Configuration注释
 * @author DT
 * @date 2021/8/9 22:00
 */
 // 注意: 此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置
@Configuration
public class OpenFeignConfig {

    @Bean
    public Logger.Level feignLoggerLevel(){
        // 输出日志级别FULL
        return Logger.Level.FULL;
    }
}

SpringBoot的日志级别默认为info,大于full,导致feign的日志配置不会输出,所以加以下配置:

#SpringBoot的日志级别默认为info,大于full,导致feign的日志配置不会输出,所以加以下配置
logging:
  level:
    com.dt.springcloud.openfeign: debug

在这里插入图片描述
输出打印:
在这里插入图片描述

2.2 针对单个服务配置日志

在这里插入图片描述
使用configuration = OpenFeignConfig.class
在这里插入图片描述
当然我们也可以通过配置文件的方式来配置.

3、通过配置文件配置日志

3.1 全局配置

针对所有服务配置:

# SpringBoot的日志级别默认为info,大于full,导致feign的日志配置不会输出,所以加以下配置
logging:
  level:
    com.dt.springcloud.openfeign: debug
# feign日志全局配置
feign:
  client:
    config:
      default:
        loggerLevel: BASIC

在这里插入图片描述

3.2 针对某个服务单独配置

当然你也可以针对某个服务进行配置单独的日志,将调用的微服务名称改成default就配置成全局的了:

# feign针对某个服务配置日志
feign:
  client:
    config:
      #想要调用的微服务名称
      dt-stock-service:
        loggerLevel: BASIC

在这里插入图片描述

五、OpenFeign自定义拦截器

OpenFeign拦截器,无非就是和我们SpringMVC中的拦截器一样,每次feign发起http调用之前,会去执行拦截器中的逻辑,比如统一添加header头信息,对body体中的信息做修改或替换。feign提供了 feign.RequestInterceptor 接口,只需实现该接口,实现对应方法,并将实现类通过 @Configuration交给spring容器管理,即可加上我们自己的通用处理逻辑。

通常我们调用的接口都是有权限控制的,很多时候可能认证的值是通过参数去传递的,还有就是通过请求头 去传递认证信息,比如 Basic 认证方式。

1、自定义拦截器

public class FeignAuthRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        String uuid = UUID.randomUUID().toString();
        requestTemplate.header("Authorization",uuid);
    }
}

2、配置

(1)使用配置文件

@Configuration
public class FeignConfig {

    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }

    @Bean
    public FeignAuthRequestInterceptor feignAuthRequestInterceptor(){
        return new FeignAuthRequestInterceptor();
    }
}

控制台打印结果:
在这里插入图片描述

(2)在yml中配置
除了上面的第一种全局配置方式以外,我们也可以在配置文件中,单独针对某个被调用的服务进行配置,和我们上面的日志配置方式一样。

# feign针对某个服务配置
feign:
  client:
    config:
      #想要调用的微服务名称
      gulimall-ware:
        connectTimeout: 5000  # 连接超时时间
        readTimeout: 5000     # 读取超时时间
        loggerLevel: BASIC
        request-interceptors: # 配置拦截器,相当于代码配置方式中的RequestInterceptor
          com.atguigu.gulimall.product.Interceptor.FeignAuthRequestInterceptor

3、通过@RequestHeader注解获取请求头里面设置的信息

上文中在客服端拦截器中设置的toekn信息,来到服务提供方里面可以获取到对应的值。

@GetMapping("/testOpenFeign")
    public R testOpenFeign(@RequestParam String str,@RequestHeader("Authorization") String token){
        log.info("获取请求头中的token:{}",token);
        String str1 = "hello";
        if("zhangsan".equals(str)){
            return R.ok().setData(str1);
        }
        return R.ok().setData(null);
    }

六、超时时间配置

通过 Options 可以配置连接超时时间和读取超时时间,Options 的第一个参数是连接的超时时间(ms), 默认值是 2s;第二个是请求处理的超时时间(ms),默认值是 5s。
(1)全局配置

	@Bean
    public Request.Options options(){
        return new Request.Options(5000,10000);
    }

(2)yml配置

feign:
  client:
    config:
      gulimall-ware:
        logger-level: FULL
        # 连接超时时间,默认2s
        connectTimeout: 5000
        # 请求处理超时时间,默认5s
        readTimeout: 10000
        request-interceptors: com.atguigu.gulimall.product.Interceptor.FeignAuthRequestInterceptor

说明:Feign的底层使用的是Ribbon,但是超时时间以Feign配置为准。

七、客户端组件配置

Feign 中默认使用 JDK 原生的 URLConnection 发送 HTTP 请求,我们可以集成别的组件来替换掉 URLConnection,比如 Apache HttpClient,OkHttp。

Feign发起调用真正执行逻辑:feign.Client#execute(扩展点)

5.1、配置Apache HttpClient

引入依赖

<!‐‐ Apache HttpClient ‐‐>
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>4.5.7</version>
</dependency>

<dependency>
	<groupId>io.github.openfeign</groupId>
	<artifactId>feign‐httpclient</artifactId>
	<version>10.1.0</version> 
</dependency>

再修改yml配置文件,将 Feign 的 Apache HttpClient启用 :

feign:
  #feign 使用 Apache HttpClient 可以忽略,默认开启
  httpclient:
    enabled: true

测试:调用会进入feign.httpclient.ApacheHttpClient#execute

5.2 配置 OkHttp

引入依赖

<dependency>
	<groupId>io.github.openfeign</groupId>
	<artifactId>feign‐okhttp</artifactId>
</dependency>

然后修改yml配置,将 Feign 的 HttpClient 禁用,启用 OkHttp,配置如下:

feign:
  #feign 使用 okhttp
  httpclient:
    enabled: false
  okhttp:
    enabled: true

八、OpenFeign与Getway关系

OpenFeign和GetWay之间的关系,当一个接口请求过来的时候首先会经过网关getway,通过getway网关权限检验后,再真正去调用服务A,此时A服务的这个接口同时也远程调用了服务B,此时服务A会直接通过OpenFeign去直接调用服务B,此时不会再调整到Getway网关里面进行权限检验。
在这里插入图片描述

<think> 我们被要求提供Spring Cloud OpenFeign的官方文档信息。根据引用内容,我们知道OpenFeign是一个声明式的HTTP客户端,用于简化服务间的HTTP调用。在Spring Cloud中,它集成了服务发现(如Eureka)和负载均衡(如Ribbon或Spring Cloud LoadBalancer)。 根据引用[2]和[4],我们得知在Spring Cloud项目中,我们通过`@EnableFeignClients`注解来启用Feign客户端,并通过`@FeignClient`注解来声明一个Feign客户端接口。同时,配置可以通过配置文件(如application.yml)进行。 但是,用户现在需要的是官方文档的地址。在引用[1]中,我们看到了一个GitHub地址和官方文档地址的提示,但引用中并没有给出具体的URL。 实际上,Spring Cloud OpenFeign的官方文档是Spring Cloud官方文档的一部分。我们可以根据Spring Cloud的版本,在官方网站上找到对应的文档。 通常,Spring Cloud OpenFeign的官方文档地址为: https://spring.io/projects/spring-cloud-openfeign 或者,针对特定版本的文档,例如Hoxton.SR12版本(对应Spring Cloud 2.2.x),文档地址为: https://docs.spring.io/spring-cloud-openfeign/docs/2.2.12.RELEASE/reference/html/ 由于用户没有指定Spring Cloud的版本,我们可以提供主版本和当前常用版本的文档链接。 另外,引用[1]中提到了一个GitHub地址,通常是Spring Cloud OpenFeign的GitHub仓库: https://github.com/spring-cloud/spring-cloud-openfeign 因此,我们可以这样回答: ### Spring Cloud OpenFeign 官方文档 1. **项目主页**(包含最新版本信息和概述): - [https://spring.io/projects/spring-cloud-openfeign](https://spring.io/projects/spring-cloud-openfeign) 2. **参考文档**(根据版本选择): - 最新版本:https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/ - 如果您使用的是特定版本(例如Hoxton.SR12对应的2.2.x),请将URL中的版本号替换为实际版本: `https://docs.spring.io/spring-cloud-openfeign/docs/{version}/reference/html/` 3. **GitHub仓库**(源代码和问题追踪): - [https://github.com/spring-cloud/spring-cloud-openfeign](https://github.com/spring-cloud/spring-cloud-openfeign) ### 使用提示 -Spring Boot项目中,您可以通过`@EnableFeignClients`注解启用Feign客户端[^3]。 - 每个Feign客户端接口需要使用`@FeignClient(name = "service-name")`注解,其中`service-name`是服务提供者在服务注册中心(如Eureka)中注册的名称[^4]。 ### 注意事项 - 请确保您的Spring Cloud版本与OpenFeign版本兼容。通常,Spring Cloud版本与OpenFeign子项目的版本保持一致(例如Spring Cloud Hoxton.SR12对应spring-cloud-openfeign 2.2.12.RELEASE)[^1]。 --- §§相关问题§§ 1. 如何查看当前项目中使用Spring Cloud OpenFeign版本? 2. Spring Cloud OpenFeignSpring Cloud Netflix Feign有什么区别? 3. 如何在Spring Cloud Alibaba中使用OpenFeign? </think> 以下是 Spring Cloud OpenFeign 的官方文档资源及相关使用指南: --- ### 一、官方文档地址 1. **主文档**(最新版本) [https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/](https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/) *包含完整配置、注解说明和高级特性* 2. **GitHub 仓库** [https://github.com/spring-cloud/spring-cloud-openfeign](https://github.com/spring-cloud/spring-cloud-openfeign) *源码、示例和 Issue 追踪* 3. **Spring Cloud 官方文档** [https://spring.io/projects/spring-cloud#overview](https://spring.io/projects/spring-cloud#overview) *在 "Spring Cloud OpenFeign" 部分查看集成指南* --- ### 二、核心使用步骤(基于官方文档) #### 1. 添加依赖 ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>3.1.7</version> <!-- 最新版本 --> </dependency> ``` #### 2. 启用 Feign 客户端 ```java @SpringBootApplication @EnableFeignClients // 关键注解 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 3. 声明服务接口 ```java @FeignClient(name = "user-service") // 与服务名一致 public interface UserClient { @GetMapping("/users/{id}") User getUser(@PathVariable("id") Long id); } ``` #### 4. 配置文件示例(application.yml) ```yaml spring: cloud: openfeign: client: config: default: # 全局配置 connectTimeout: 5000 readTimeout: 10000 loggerLevel: basic user-service: # 指定服务配置 connectTimeout: 3000 ``` --- ### 三、关键特性文档目录 | **章节** | **内容** | **官方文档位置** | |----------|----------|------------------| | 服务降级 | `fallback` 和 `fallbackFactory` | Section 2.4.5 | | 自定义编码器 | 文件上传/二进制流处理 | Section 2.2.8 | | 请求拦截器 | 添加认证头等操作 | Section 2.2.9 | | 日志配置 | 四级日志级别控制 | Section 2.3.1 | | 与 Ribbon 集成 | 负载均衡配置 | Section 2.1.4 | | 错误处理 | `ErrorDecoder` 自定义 | Section 2.2.11 | --- ### 四、注意事项(官方建议) 1. **服务发现集成** 默认支持 Eureka/Nacos,需确保 `@FeignClient` 的 `name` 与注册中心的服务 ID 一致[^4] 2. **包扫描规则** 若 Feign 接口不在主启动类包路径下,需指定扫描路径: ```java @EnableFeignClients(basePackages = "com.example.clients") ``` 3. **版本兼容性** Spring Cloud 2020.0.x+ 已移除 Ribbon,需显式添加负载均衡器: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值