1. 程式人生 > >SpringCloud Feign通過FallbackFactory顯示異常信息

SpringCloud Feign通過FallbackFactory顯示異常信息

ring 捕獲 ESS post 接下來 我們 erb var 實現類

SpringCloud Feign可以進行服務消費,而且內置了Hystrix,能夠進行熔斷。
Feign可以通過fallback指定熔斷回調的類。代碼示例及講解可見:
https://www.cnblogs.com/expiator/p/10826852.html
但是,有時候我們還需要記錄異常信息,可以通過fallbackFactory實現。

服務提供者 

示例如下:

@RestController
public class UserController {

        @PostMapping("/user/name/{id}")
        public JSONObject getUserNameById(@PathVariable("id") Integer id ) throws Exception {
            System.out.println("==================================================================>getUserNameById(),id為:"+id);
            //直接拋異常,是為了方便測試服務熔斷和降級。
            throw  new Exception("getUserNameByIdException");
        }

       @PostMapping("/user")
       public User getUserById(@RequestParam("id") Integer id  ) throws Exception {
         System.out.println("==================================================================>getUserById(),id為:"+id);
         throw  new Exception("getUserByIdException");
      }

}

服務消費者

FeignClient接口

首先是@FeignClient,屬性fallbackFactory指定實現類,如下:

/**
 *  使用fallbackFactory捕獲異常,並進行服務熔斷、服務降級。
 */
@FeignClient(value = "eureka-client",fallbackFactory = UserFeignClientFallbackFactory.class)
public interface UserFeignClient {

    @PostMapping(value = "/user/name/{id}")
    JSONObject getUserNameById(@PathVariable("id") Integer id);

    @PostMapping(value = "/user")
    User getUserById(@RequestParam("id") Integer id);
}

FallbackFactory實現類

接下來是FallbackFactory的實現類,需要重寫create()方法,這個方法的參數為Throwable異常類,可以借此記錄異常信息。
create()返回進行服務熔斷/降級的Hystrix類。

 @Component
public class UserFeignClientFallbackFactory implements FallbackFactory<UserFeignClient> {

    @Override
    public UserFeignClient create(Throwable cause) {
        System.out.println("====================================》fallback reason was:  " + cause.getMessage());

        return new UserFeignClientHystrix();
        //也可以不寫UserClientFallbackFactory類,直接用匿名對象寫成以下形式:
//        return new UserFeignClient(Integer id) {
//            @Override
//            public JSONObject getUserNameById() {
//                 JSONObject resultJson = new JSONObject();
//                 resultJson.put("id",  "-1" );
//                 resultJson.put("name", "null"   );
//                 return resultJson;
//            }
//        };

    }

}

FeignClient實現類(也就是Hystrix類)

Hystrix類如下所示:

@Component
public class UserFeignClientHystrix implements UserFeignClient {

    /**
     * 服務熔斷
     * @param id
     * @return
     */
    @Override
    public JSONObject getUserNameById(Integer id) {
        System.out.println("=======================>UserClientFallbackFactoryTest");
        JSONObject resultJson = new JSONObject();
        resultJson.put("errCode",  "0404" );
        String description="查詢id為"+id+"的用戶,服務異常,暫時熔斷";
        resultJson.put("description", description  );
        return resultJson;
    }


    @Override
    public User getUserById(Integer id) {
        System.out.println("=======================>UserClientFallbackFactoryTest");
         //直接返回id為-1的用戶
        User user = new User();
        user.setId(-1);
        return user;
     }

}

測試

啟動註冊中心,服務提供者,服務消費者。
訪問服務消費者的接口,能夠得到服務提供者拋出的異常信息。
如下所示:

SpringCloud Feign通過FallbackFactory顯示異常信息