简介:
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