Feign Fallback FallbackFactory 笔记

关于使用请查看 :https://blog.youkuaiyun.com/sun_shaoping/article/details/82079287

1.@SpringCloudApplication

该包包含三个注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker

2.安装 maven 包

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

3.新增开关

feign.hystrix.enabled=true

什么时候应该Fallback

2XX,成功,这个不用再讨论。
5XX,也相当明确,直接Fallback,这个也不用讨论。
4XX,可以一律认为是业务逻辑异常(或者更精确的说,可以认为4XX中的某几个是业务异常)。这时候,应该是用if/else来处理这个异常,而不应该动用Hystrix来Fallback。

Feign在默认情况下,对于非2XX,都认为是异常。这个地方是有问题的。特别是对于404这种非常容易抛出的业务异常来说,没两下就circuit break了。

@FeignClient(name = "marathon-lb", fallback = FooBarClientFallback.class, decode404 = true)
@RequestMapping(value = "/foo/bar")
public interface FooBarClient {
    ... ...
}
只需要加入 decode404 = true这一个参数,Feign对于2XX和404 ,都不会走Fallback了。
排除404,已经基本上够用了,如果想把409、400等status也加到例外中,可以重写一下Feign的errorDecoder。

REST返回码的选择

下面详细讲一下HTTP STATUS的选择问题。

关于HTTP返回码,看了很多参考(论战),"大概"可以这样选择:

成功: 2XX系列

  • 200 OK // 查询、删除成功用这个
  • 201 CREATED // 新增、修改时用这个。且返回BODY中无任何信息。

业务异常: 4XX系列

  • 400 BAD_REQUEST // 现在有很多人在业务异常时抛这个错。但400要慎重使用。稍后解释。
  • 404 NOT_FOUND // 查询不到结果时用这个
  • 403 FORBIDDEN // 这个也慎重使用。
  • 409 CONFLICT // 业务异常时,可以用这个。

主机异常:5XX系列

  • 500 INTERNAL_SERVER_ERROR // 对于未知异常,统一用这个了
  • 503 SERVICE_UNAVAILABLE // Hystrix异常用这个

参考:https://www.jianshu.com/p/8d47a4fc4e82

### FeignFallbackFactory 的用法 在 Spring Cloud 中,Feign 是一种声明式的 HTTP 客户端工具,用于简化微服务之间的通信。为了处理远程调用失败的情况,Spring Cloud 提供了 `@Fallback` `FallbackFactory` 来实现容错机制。 #### 使用 FallbackFactory 实现回退逻辑 当使用 Feign 进行远程调用时,可能会遇到网络异常或其他错误情况。通过配置 `FallbackFactory`,可以定义一个备用的响应逻辑来替代实际的服务调用。以下是具体实现方法: 1. **创建 Feign 接口并指定回退工厂类** 需要在 Feign Client 上标注 `@FeignClient` 注解,并设置 `fallbackFactory` 属性指向具体的 Factory 类[^1]。 ```java @FeignClient(name = "example-service", fallbackFactory = ExampleServiceFallbackFactory.class) public interface ExampleServiceClient { @GetMapping("/api/example") String getExample(); } ``` 2. **实现 FallbackFactory** 创建一个实现了 `FallbackFactory<T>` 接口的类,其中 T 表示对应的 Feign Client 接口类型。该接口提供了一个 `create` 方法,在发生异常时会触发此方法返回默认实例或数据[^2]。 ```java import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; @Component public class ExampleServiceFallbackFactory implements FallbackFactory<ExampleServiceClient> { @Override public ExampleServiceClient create(Throwable cause) { return new ExampleServiceClient() { @Override public String getExample() { return "Fallback response due to: " + cause.getMessage(); // 返回自定义消息 } }; } } ``` 3. **启用 Hystrix 支持(如果未开启)** 默认情况下,Hystrix 可能被禁用。要使 `FallbackFactory` 生效,需确保项目已引入依赖项 `spring-cloud-starter-netflix-hystrix` 并激活熔断器功能。可以在 application.yml 或 properties 文件中添加如下配置[^3]: ```yaml feign: hystrix: enabled: true ``` 4. **测试场景下的行为验证** 当目标服务不可达或者请求超时时,上述定义好的 `FallbackFactory` 将会被自动调用来生成相应的回退结果。这有助于提升系统的健壮性用户体验。 #### 常见问题排查 - 如果发现回退机制不起作用,请确认是否遗漏了必要的 Hystrix 依赖以及相关配置。 - 检查日志输出是否有任何关于线程池耗尽或者其他资源不足的信息提示[^4]。 ```java // 示例代码片段展示如何捕获异常信息并通过日志记录下来以便后续分析 import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Component public class ExampleServiceFallbackFactory implements FallbackFactory<ExampleServiceClient> { private static final Logger logger = LoggerFactory.getLogger(ExampleServiceFallbackFactory.class); @Override public ExampleServiceClient create(Throwable cause) { logger.error("Error occurred while calling example service:", cause); return new ExampleServiceClient() { @Override public String getExample() { return "Default message"; } }; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值