03-OpenFeign

什么是OpenFeig?

OpenFeign 是一个声明式的、基于接口的 HTTP 客户端,它是 Spring Cloud 中的一个组件,用于简化服务间的 HTTP 调用。通过使用 OpenFeign,开发者可以使用注解方式定义接口,而不需要编写具体的 HTTP 请求代码,OpenFeign 会自动完成请求的封装和调用。

OpenFeign 主要具有以下特点和功能:

  1. 声明式接口:使用 OpenFeign,开发者只需要定义一个接口,然后通过注解来描述接口的 HTTP 请求方法、URL、参数等信息。不需要写具体的实现代码,OpenFeign 会自动生成实现。

  2. 自动封装和调用:OpenFeign 会根据接口的注解配置自动封装 HTTP 请求,并在需要的地方自动调用该接口。开发者只需要调用接口的方法,而不需要关注请求的细节。

  3. 服务间的声明式调用:通过 OpenFeign,可以直接调用其他微服务的接口,并且能够自动处理负载均衡、服务发现等问题。这简化了服务调用的过程,并提供了一种声明式的方式来实现服务间的通信。

  4. 整合了 Ribbon 和 Hystrix:OpenFeign 默认集成了 Ribbon 负载均衡和 Hystrix 熔断降级的功能。这使得服务间的请求可以具备负载均衡的能力,并且在服务不可用时可以进行熔断处理。

一、基础应用

  1. 调用端引用依赖

    <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
  2. 编写调用接口类

    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @FeignClient(name = "order-nacos",path="/test") //name:被调用服务,path:请求地址
    public interface OrderController {
    
        @RequestMapping("/test") //接口地址
        String test();
    
    }
  3. 编写调用方法

    @RestController
    @RequestMapping("/test")
    public class stockController {
    
        @Autowired
        private OrderController orderController;
    
        @RequestMapping("/feignTestOrder")
        public String feignTestOrder(){
            return orderController.testOrder();
        }
    }
  4. 启动类添加@EnableFeignClients注解

二、日志级别

  • NONE:不输出日志,默认的级别,不显示任何 Feign 请求和响应的信息。@TODO

  • BASIC:仅输出请求的方法、URL、响应的状态码和执行时间。

  • HEADERS:除了 BASIC 级别的信息外,还会输出请求和响应的头部信息。

  • FULL:输出完整的请求和响应的信息,包括头部、正文以及元数据。

配置:

logging:
  level:
    feign.client: FULL

三、契约配置

在使用 Feign 进行服务调用时,通过契约(Contract)配置可以自定义 Feign 的注解和规则,以适应不同的接口定义风格。Feign 支持两种契约配置:默认契约和 Spring Cloud 契约。

  1. 默认契约:Feign 的默认契约使用的是 SpringMVC 注解,适用于基于 SpringMVC 的项目。

    • 使用默认契约时,无需进行任何配置,Feign 将自动使用 SpringMVC 注解进行接口定义和转换。

  2. Spring Cloud 契约:Spring Cloud 提供了一种更加强大和灵活的契约,支持使用 OpenFeign 的扩展注解和规则。

    • 在项目的配置文件中添加以下配置来启用 Spring Cloud 契约:

      feign:
        contract:
          feignContract: com.netflix.client.config.DefaultFeignContract
    • 通过设置 feignContract 属性为 com.netflix.client.config.DefaultFeignContract,即可启用 Spring Cloud 契约。

使用 Spring Cloud 契约可以使用更多扩展注解,如@PathVariable, @RequestHeader, @RequestParam, @PostMapping等,以及自定义的注解和规则。这样更加灵活地定义和处理接口调用。

需要注意的是,当使用 Spring Cloud 契约时,需要在项目的依赖中引入 spring-cloud-starter-openfeign。

通过合适的契约配置可以更好地适应项目的接口定义,提高代码的可读性和可维护性。

四、超时时间配置

在使用 Feign 进行服务调用时,可以通过配置来设置超时时间,以控制请求的最长等待时间。

在 Spring Boot 项目中,可以在配置文件中添加以下配置来设置 Feign 的超时时间:

feign:
  client:
    config:
      default:
        connectTimeout: 5000  # 连接超时时间,单位为毫秒
        readTimeout: 5000  # 读取超时时间,单位为毫秒

上述配置中,connectTimeout 表示连接超时时间,即等待建立连接的最长时间;readTimeout 表示读取超时时间,即等待响应的最长时间。

如果需要对特定的客户端设置超时时间,可以使用客户端名称进行配置(例如,对名为 exampleClient 的特定客户端进行配置):

feign:
  client:
    config:
      exampleClient:
        connectTimeout: 5000  # 连接超时时间,单位为毫秒
        readTimeout: 5000  # 读取超时时间,单位为毫秒

在上述配置中,将 default 改为 exampleClient,表示对特定的客户端进行设置。

需要注意的是,设置的超时时间应根据实际需求进行调整,过长的超时时间可能导致请求等待过久,而过短的超时时间则可能导致请求过早超时。合理设置超时时间可以提高系统的稳定性和性能。

五、自定义拦截器

在 Feign 客户端中,可以通过自定义拦截器来对请求进行预处理或后处理,以实现一些自定义的功能或逻辑。

要自定义 Feign 拦截器,需要实现 feign.RequestInterceptor 接口,并实现其 apply() 方法。apply() 方法接收一个 RequestTemplate 参数,可以在该方法中对请求进行修改、添加头部等操作。

以下是一个自定义 Feign 拦截器的示例:

import feign.RequestInterceptor;
import feign.RequestTemplate;

public class CustomInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
       // 在此处可以对请求进行自定义处理,如添加头部、修改请求内容等
       template.header("Authorization", "Bearer token");
    }
}

在自定义拦截器中,可以根据需求对请求进行操作,例如添加头部信息、修改请求参数或请求路径等。可以在 apply() 方法中使用 RequestTemplate 对象来访问和修改请求的相关信息。

要在 Feign 客户端中使用自定义拦截器,可以通过 @FeignClient 注解的 configuration 属性指定自定义的拦截器类,或者通过 RequestOptions 对象来添加拦截器。

  • 使用 @FeignClient 注解的方式:

    @FeignClient(name = "exampleClient", configuration = CustomInterceptor.class)
    public interface ExampleClient {
        // ...
    }
  • 通过 RequestOptions 对象的方式:

    import feign.RequestInterceptor;
    import org.springframework.context.annotation.Bean;
    
    public class FeignConfig {
        @Bean
        public RequestInterceptor customInterceptor() {
            return new CustomInterceptor();
        }

通过以上方式,即可在 Feign 客户端中添加自定义的拦截器,实现更灵活的请求处理。

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值