随记-OpenFeign的使用

216 阅读4分钟

简介:

OpenFeign是一款基于Java语言的声明式HTTP客户端,它是Netflix开源的项目之一,旨在简化HTTP客户端的开发。

在传统的HTTP客户端开发中,需要手动创建HTTP请求和处理响应数据,这些操作需要编写大量的重复代码,而OpenFeign则通过将HTTP请求映射到Java接口上,自动处理请求和响应数据的序列化和反序列化,大大简化了HTTP客户端的开发。 使用OpenFeign,只需要定义一个Java接口,然后使用注解来描述HTTP请求的URL、请求方法、请求参数等信息,就可以实现一个HTTP客户端,无需编写大量的模板代码。同时,OpenFeign还提供了很多可扩展的配置选项,可以满足不同的业务需求。

OpenFeign的设计理念是"契约优先",即在定义Java接口时,首先定义HTTP请求和响应的契约,然后通过实现这些契约来实现HTTP客户端。这种设计理念使得HTTP客户端的开发变得非常简单和直观,而且易于维护和扩展。

使用方法:

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

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

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

配置项目

// 设置包扫描路径
@EnableFeignClients(basePackages = "com.qianmo.mall.user.api.rpc")

@EnableFeignClients (开启fiegn客户端) 参数: basePackages 包扫描路径,数组类型

defaultConfiguration 默认配置类,一些openfiegn的配置的实现

个性化配置:

RequestInterceptor

用于实现请求前拦截器,可以在请求发起前做一些处理,如添加请求头、修改请求参数等。

apply(RequestTemplate)通过此模版对象即可设置一些请求头相关的数据

当存在多个拦截器时,按声明的前后顺序执行

Logger

用于实现日志记录器,可以在发送请求和接收响应时记录相关的日志信息。

/**
 -   NONE,不记录(默认)
 -   BASIC,只记录请求方法和URL以及响应状态代码和执行时间。
 -   HEADERS,记录基本信息以及请求和响应头。
 -   FULL,记录请求和响应的头、正文和元数据。   
*/
// 需要注意在外部需配置 才会正常显示
// logging.level.feign: DEBUG。
@Bean 
Logger.Level feignLoggerLevel() { 
    return Logger.Level.FULL; 
}

Encoder

用于实现请求数据的编码器,将请求对象转换为请求体数据。

encode(Object,bodyType,RequestTemplate) 调用逻辑: 每次请求后调用 实现逻辑: object为请求体,BodyType为请求体的格式,RequestTemplate为请求对象

默认实现

  • FormEncoder:将请求参数编码为 application/x-www-form-urlencoded 格式。
  • JacksonEncoder:使用 Jackson 库将请求参数编码为 JSON 格式。
  • GsonEncoder:使用 Gson 库将请求参数编码为 JSON 格式。
  • SpringEncoder:使用 Spring MVC 中的 HttpMessageConverter 将请求参数编码为指定的格式,例如 JSON、XML 等。

示例:上传文件

@Bean
public Encoder multipartFormEncoder() {
    return new SpringFormEncoder(
            new SpringEncoder(new ObjectFactory<HttpMessageConverters>() { 
                @Override 
                public HttpMessageConverters getObject() throws BeansException { 
                    return new HttpMessageConverters(new RestTemplate().getMessageConverters()); 
                } 
            })
    );
}

Decoder

用于实现响应数据的解码器,将响应数据转换为Java对象。

decode(Response,type) 实现逻辑: resp为响应体,type为响应类型

Retryer

用于实现请求重试器,可以在请求失败时自动重试请求。

continueOrPropagate(RetryableException)

调用逻辑: 当检测出异常的时调用 实现逻辑: 只要此方法不抛出异常会一直重试

clone()

调用逻辑: 每次新的请求都会调用,且每次都会生成一个新的Retryer避免数据污染

ErrorDecoder

用于实现异常处理器,将响应异常转换为自定义的异常类型。

RuntimeException decode(methodKey,response) 实现逻辑: methodKey:该请求的唯一标识符,由 HTTP 方法、请求 URI 和请求头部组成。 response:响应对象,包含响应头和响应体。 RuntimeException: 可以为自定义异常或内置异常

Contract

用于实现自定义的接口定义,可以通过该接口自定义接口的请求参数、请求方法、请求路径等信息。

注意事项

配置类局部实现不需要加@Configuration

@FeignClient注解详解

contextId: 如果配置了contextId,该值将会作为beanName。

fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口

fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码

url: url一般用于调试,可以手动指定@FeignClient调用的地址

实现负载均衡

warehouse-service: #服务提供者的微服务ID
  ribbon:
    #设置对应的负载均衡类
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

WeChat1af5b09a800aaa5271bd9ad688e3b2c0.png