pom.xml
<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>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
注意必须设置:yml配置
feign:
sentinel:
enabled: true
如果不加feign.sentinel.enabled=true的配置,那么在@FeignClient中定的fallback属性定义的异常、限流等自定义的处理逻辑不会生效
Fallback(降级处理类):
- fallback 是一个类,用于定义服务调用失败时的降级处理逻辑
- Fallback 类需要实现被调用的 Feign 接口,并提供降级处理的逻辑
- 当服务调用失败时,Feign 将会调用 Fallback 类中相应的方法来处理失败情况
ProductFeignService (作用是当远程调用服务product-service发生异常的时候会执行ProductFeignFallBackService 的 get方法)在 Feign 客户端的配置中,通过 @FeignClient 注解的 fallback 属性指定对应的 Fallback 类
@FeignClient(value = "product-service", path = "/product", fallback = ProductFeignFallBackService.class)
public interface ProductFeignService {
@RequestMapping("/{id}")
public String get(@PathVariable Integer id);
}
ProductFeignFallBackService
@Component
public class ProductFeignFallBackService implements ProductFeignService {
@Override
public String get(Integer id) {
return "进入降级";
}
}
FallbackFactory(降级处理工厂类):
- fallbackFactory 是一个工厂类,用于动态创建降级处理实例
- FallbackFactory 类实现了 FallbackFactory 接口,通过 create 方法创建降级处理的实例
- 每次服务调用失败时,Feign 都会调用 create 方法来获取降级处理的实例,实现更灵活的降级逻辑
在 Feign 客户端的配置中,通过 @FeignClient 注解的 fallbackFactory 属性指定对应的 FallbackFactory 类:
```java
@FeignClient(value = "product-service", path = "/product", fallbackFactory = ProductFeignFallBackFactoryService.class)
public interface ProductFeignService {
@RequestMapping("/{id}")
public String get(@PathVariable Integer id);
@RequestMapping("/two")
public String two(@RequestParam("id") Integer id);
}
方法一:这是全部在ProductFeignFallBackFactoryService实现
@Component
public class ProductFeignFallBackFactoryService implements FallbackFactory<ProductFeignService> {
@Override
public ProductFeignService create(Throwable cause) {
return new ProductFeignService() {
@Override
public String get(Integer id) {
return "Fallback response: " + cause.getMessage();
}
@Override
public String two(Integer id) {
return "Fallback response: " + cause.getMessage();
}
};
}
}
方法二:ProductFeignFallBackFactoryService中,不是实现,新创建一个类实现
@Component
public class ProductFeignFallBackFactoryService implements FallbackFactory<ProductFeignService> {
@Override
public ProductFeignService create(Throwable cause) {
ProductFeignServiceFallBack fallback = ProductFeignServiceFallBack() ;
fallback.setCause(cause);
return fallback;
}
}
@Slf4j
public class ProductFeignServiceFallBack implements ProductFeignService {
@Setter
private Throwable cause;
@Override
public String get(Integer id) {
return "Fallback response: " + cause.getMessage();
}
@Override
public String two(Integer id) {
return "Fallback response: " + cause.getMessage();
}
}