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 @ 2024-05-13 11:21  无涯子wyz  阅读(14)  评论(0编辑  收藏  举报