Feign远程调用,Sentinel限流。
如何将Feign整合Sentinel实现服务容错?
如何获取Feign远程调用时的异常进行问题排查?
本章代码已分享至Gitee: https://gitee.com/lengcz/springcloudalibaba01.git
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
feign:
sentinel:
enabled: true #开启feign对sentinel的支持
/**
* value用于指定调用的nacos下哪个微服务
* fallback用于指定当前feign接口容错类
*/
@FeignClient(value="server-product",fallback = ProductServiceFallback.class)
public interface ProductService {
@RequestMapping("/product/{pid}")
Product findById(@PathVariable Integer pid);
}

4. 实现容错方法(当远程服务不可用时,进行服务容错,进入fallback指定的类的同名方法)
/**
* 容错类,需要实现Feign所在的接口,并去实现接口中的所有方法,一旦Feign远程调用出现问题了,就会进入当前类的同名方法,执行容错逻辑
*/
@Service
public class ProductServiceFallback implements ProductService {
@Override
public Product findById(Integer pid) {
Product product=new Product();
product.setPid(-1);
product.setPname("远程调用微服务异常,进入容错");
return product;
}
}
注:容错类的方法的返回值、方法名、参数必须和原来保持一致。
修改controller,当pid为-1表示下单失败。

启动order和product对应的微服务,发起请求测试,正常情况下可以查询到 Product的信息。

当将product微服务停止了,再次请求下单接口。

从第一节的内容,我们可以看到,当调用外部微服务发生异常时,我们并不能看到发生了什么异常,这导致我们很难进行问题排查。使用FacllbackFactory接口,就可以获取到Feign远程调用时发生的异常了。如何操作呢?对第一节的demo进行小小的改动。
/**
* 容错类,需要实现Feign所在的接口,并去实现接口中的所有方法,一旦Feign远程调用出现问题了,就会进入当前类的同名方法,执行容错逻辑
*/
@Service
@Slf4j
public class ProductServiceFallbackFactory implements FallbackFactory<ProductService> {
@Override
public ProductService create(Throwable throwable) {
log.error("======"+throwable.getMessage());
return new ProductService() {
@Override
public Product findById(Integer pid) {
Product product=new Product();
product.setPid(-1);
product.setPname("FallbackFactory远程调用微服务异常,进入容错");
return product;
}
};
}
}
/**
* value用于指定调用的nacos下哪个微服务
* fallback用于指定当前feign接口容错类
*/
//@FeignClient(value="server-product",fallback = ProductServiceFallback.class)
@FeignClient(value="server-product",fallbackFactory = ProductServiceFallbackFactory.class)
public interface ProductService {
@RequestMapping("/product/{pid}")
Product findById(@PathVariable Integer pid);
}

通过实现FallbackFactory<要实现的接口类>,我们可以捕获到发生的异常进行记录和处理,进行问题排查。