当前位置:   article > 正文

SpringCloud Feign通过FallbackFactory显示异常信息_feign fallbackfactory

feign fallbackfactory

SpringCloud Feign可以进行服务消费,而且内置了Hystrix,能够进行熔断
Feign可以通过fallback指定熔断回调的类。代码示例及讲解可见:https://www.cnblogs.com/expiator/p/10826852.html
但是,有时候我们还需要记录异常信息,可以通过fallbackFactory实现。

服务提供者

示例如下:

  1. @RestController
  2. public class UserController {
  3. @PostMapping("/user/name/{id}")
  4. public JSONObject getUserNameById(@PathVariable("id") Integer id ) throws Exception {
  5. System.out.println("==========================>getUserNameById(),id为:"+id);
  6. //直接抛异常,是为了方便测试服务熔断和降级。
  7. throw new Exception("getUserNameByIdException");
  8. }
  9. @PostMapping("/user")
  10. public User getUserById(@RequestParam("id") Integer id ) throws Exception {
  11. System.out.println("=====================>getUserById(),id为:"+id);
  12. throw new Exception("getUserByIdException");
  13. }
  14. }

服务消费者

FeignClient接口

首先是@FeignClient,属性fallbackFactory指定实现类,如下:

  1. /**
  2. * 使用fallbackFactory捕获异常,并进行服务熔断、服务降级。
  3. */
  4. @FeignClient(value = "eureka-client",fallbackFactory = UserFeignClientFallbackFactory.class)
  5. public interface UserFeignClient {
  6. @PostMapping(value = "/user/name/{id}")
  7. JSONObject getUserNameById(@PathVariable("id") Integer id);
  8. @PostMapping(value = "/user")
  9. User getUserById(@RequestParam("id") Integer id);
  10. }
FallbackFactory实现类

接下来是FallbackFactory的实现类,需要重写create()方法,这个方法的参数为Throwable异常类,可以借此记录异常信息。
create()返回进行服务熔断/降级的Hystrix类。

  1. @Component
  2. public class UserFeignClientFallbackFactory implements FallbackFactory<UserFeignClient> {
  3. @Override
  4. public UserFeignClient create(Throwable cause) {
  5. System.out.println("=================》fallback reason was: " + cause.getMessage());
  6. return new UserFeignClientHystrix();
  7. //也可以不写UserClientFallbackFactory类,直接用匿名对象写成以下形式:
  8. // return new UserFeignClient(Integer id) {
  9. // @Override
  10. // public JSONObject getUserNameById() {
  11. // JSONObject resultJson = new JSONObject();
  12. // resultJson.put("id", "-1" );
  13. // resultJson.put("name", "null" );
  14. // return resultJson;
  15. // }
  16. // };
  17. }
  18. }
FeignClient实现类(也就是Hystrix类)

Hystrix类如下所示:

  1. @Component
  2. public class UserFeignClientHystrix implements UserFeignClient {
  3. /**
  4. * 服务熔断
  5. * @param id
  6. * @return
  7. */
  8. @Override
  9. public JSONObject getUserNameById(Integer id) {
  10. System.out.println("=======================>UserFeignClientHystrix ");
  11. JSONObject resultJson = new JSONObject();
  12. resultJson.put("errCode", "0404" );
  13. String description="查询id为"+id+"的用户,服务异常,暂时熔断";
  14. resultJson.put("description", description );
  15. return resultJson;
  16. }
  17. @Override
  18. public User getUserById(Integer id) {
  19. System.out.println("=======================>UserFeignClientHystrix ");
  20. //直接返回id为-1的用户
  21. User user = new User();
  22. user.setId(-1);
  23. return user;
  24. }
  25. }

测试

启动注册中心,服务提供者,服务消费者。
访问服务消费者的接口,就能够得到服务提供者抛出的熔断结果和异常信息。
访问getUserById对应的接口,结果如下:

访问另一个接口,返回结果如下:
异常信息如下所示:

  1. ======================》fallback reason was: {} status 500 reading UserFeignClient#getUserNameById(Integer); content:
  2. {"timestamp":1557456567128,"status":500,"error":"Internal Server Error","exception":"java.lang.Exception","message":"getUserNameByIdException","path":"/user/name/2"}
  3. =======================>UserFeignClientHystrix

可以看到message中的异常getUserNameByIdException,就是我们在服务提供者中抛出的异常。

完整代码见Github

https://github.com/firefoxer1992/SpringCloudProject/tree/master/eureka-consumer-feign/src/main/java/com/example/demo

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/84675
推荐阅读
相关标签
  

闽ICP备14008679号