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 中默认使用的 HttpMessageConvertersSpring 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.LevelFULL

复制
@Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
posted @   无涯子wyz  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示