Open Feign
1.Open Feign介绍
Spring Cloud OpenFeign
是一种基于Spring Cloud
的声明式REST客户端,它简化了与HTTP服务交互的过程。它将REST客户端的定义转化为Java接口,并且可以通过注解的方式来声明请求参数、请求方式、请求头等信息,从而使得客户端的使用更加方便和简洁。同时,它还提供了负载均衡和服务发现等功能,可以与Eureka、Consul等注册中心集成使用。Spring Cloud OpenFeign
能够提高应用程序的可靠性、可扩展性和可维护性,是构建微服务架构的重要工具之一。
Feign
是一个声明式的 Web Service
客户端。它使编写Web Service
客户端更容易。要使用 Feign
,需要创建一个接口并对其进行注解。它有可插拔的注解支持,包括 Feign
注解和 JAX-RS 注解。Feign 还支持可插拔的编码器和解码器。Spring Cloud
增加了对 Spring MVC 注解的支持,并支持使用 Spring Web 中默认使用的 HttpMessageConverters
。Spring Cloud
集成了 Eureka、Spring Cloud CircuitBreaker
以及Spring Cloud LoadBalancer
,以便在使用Feign
时提供一个负载均衡的http客户端。
2. Open Feign使用
2.1 引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2 主启动类开启Open Feign注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients // 开启Open Feign
public class MainFeign80 {
public static void main(String[] args) {
SpringApplication.run(MainFeign80.class,args);
}
}
2.3 定义Feign接口
@FeignClient(value = "cloud-payment-service", path = "/pay")
@RestController
public interface PayFeignApi {
@Operation(summary = "新增支付订单信息")
@PostMapping
public ResponseResult<String> save(@RequestBody PayDTO payDTO);
@Operation(summary = "删除支付订单信息")
@DeleteMapping("/{id}")
public ResponseResult<String> delete(@PathVariable("id") Integer id);
@Operation(summary = "更新支付订单信息")
@PutMapping
public ResponseResult<String> update(@RequestBody PayDTO payDTO);
@Operation(summary = "根据ID查询支付订单信息")
@GetMapping("/{id}")
public ResponseResult<PayVO> queryPayById(@PathVariable("id") Integer id);
@Operation(summary = "查询所有订单信息")
@GetMapping
public ResponseResult<List<PayVO>> getPayList();
}
下面是我们的Feign实现的原始接口,通常是在另一个微服务模块中,当我们想要调用另一个微服务中的接口,可以使用Open Feign来调用
@RestController
@RequestMapping("/pay")
@Tag(name = "支付模块", description = "支付相关接口")
@RefreshScope
public class PayController {
@Resource
private PayService payService;
@Operation(summary = "新增支付订单信息")
@PostMapping
public ResponseResult<String> save(@RequestBody PayDTO payDTO){
payService.save(payDTO);
return ResponseResult.success();
}
@Operation(summary = "删除支付订单信息")
@DeleteMapping("/{id}")
public ResponseResult<String> delete(@PathVariable Integer id){
payService.delete(id);
return ResponseResult.success();
}
@Operation(summary = "更新支付订单信息")
@PutMapping
public ResponseResult<String> update(@RequestBody PayDTO payDTO){
payService.updatePayById(payDTO);
return ResponseResult.success();
}
@Operation(summary = "根据ID查询支付订单信息")
@GetMapping("/{id}")
public ResponseResult<PayVO> queryPayById(@PathVariable Integer id){
return ResponseResult.success(payService.getPayById(id));
}
@Operation(summary = "查询所有订单信息")
@GetMapping
public ResponseResult<List<PayVO>> getPayList(){
return ResponseResult.success(payService.getPayList());
}
}
2.4 使用Feign接口
@RestController
@RequestMapping("/feign/pay")
public class OrderFeignController {
@Resource
private PayFeignApi payFeignApi;
@Operation(summary = "新增支付订单信息")
@PostMapping
public ResponseResult saveOrder(@RequestBody PayDTO payDTO){
return payFeignApi.save(payDTO);
}
@GetMapping("/{id}")
@Operation(summary = "根据ID查询订单信息")
public ResponseResult getOrderById(@PathVariable Integer id){
return payFeignApi.queryPayById(id);
}
@DeleteMapping("/{id}")
@Operation(summary = "删除订单信息")
public ResponseResult deleteOrderById(@PathVariable Integer id){
return payFeignApi.delete(id);
}
@PutMapping
@Operation(summary = "更新订单信息")
public ResponseResult updateOrderById(@RequestBody PayDTO payDTO){
return payFeignApi.update(payDTO);
}
}
2.5测试
3. 超时设置
我们可以在默认客户端和命名客户端上配置超时。OpenFeign
使用两个超时参数:
connectTimeout
防止因服务器处理时间过长而阻塞调用者。readTimeout
从连接建立时开始应用,当返回响应的时间过长时就会被触发。
feign:
httpclient:
connection-timeout: 2000
ok-http:
read-timeout: 60s
4.超时重试
Open Feign默认情况下超时不进行重试,我们可以编写下面配置,让Open Feign超时进行重试。
@Configuration
public class FeignConfig {
@Bean
public Retryer retryer(){
// 默认配置不进行重试
return Retryer.NEVER_RETRY;
}
}
@Configuration
public class FeignConfig {
@Bean
public Retryer retryer(){
// 初始间隔100ms ,最大间隔1s, 重试次数(1+2)
return new Retryer.Default(100,1,3);
}
}
5. Feign日志
每个创建的 Feign 客户端都会创建一个logger。默认情况下,logger 的名字是用于创建Feign客户端的接口的全类名称。Feign 的日志只响应 DEBUG
级别。
application.yml
logging.level.project.user.UserClient: DEBUG
你可以为每个客户端配置 Logger.Level
对象,告诉 Feign 要记录多少内容。选择是:
NONE
, 没日志(默认)。BASIC
, 只记录请求方法和URL以及响应状态代码和执行时间。HEADERS
, 记录基本信息以及请求和响应头。FULL
, 记录请求和响应的header、正文和元数据。
例如,下面将设置 Logger.Level
为 FULL
:
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析