SpringCloudFeign通过FallbackFactory显⽰异常信息SpringCloud Feign可以进⾏服务消费,⽽且内置了Hystrix,能够进⾏熔断。
Feign可以通过fallback指定熔断回调的类。代码⽰例及讲解可见:
但是,有时候我们还需要记录异常信息,可以通过fallbackFactory实现。
服务提供者
⽰例如下:
@RestController
public class UrController {
@PostMapping("/ur/name/{id}")
public JSONObject getUrNameById(@PathVariable("id") Integer id ) throws Exception {
System.out.println("==========================>getUrNameById(),id为:"+id);
//直接抛异常,是为了⽅便测试服务熔断和降级。
throw new Exception("getUrNameByIdException");
}
@PostMapping("/ur")
public Ur getUrById(@RequestParam("id") Integer id ) throws Exception {
System.out.println("=====================>getUrById(),id为:"+id);
throw new Exception("getUrByIdException");
}
}
服务消费者
FeignClient接⼝
⾸先是@FeignClient,属性fallbackFactory指定实现类,如下:
/
**
* 使⽤fallbackFactory捕获异常,并进⾏服务熔断、服务降级。
*/
难过的一件事
@FeignClient(value = "eureka-client",fallbackFactory = UrFeignClientFallbackFactory.class)
public interface UrFeignClient {
@PostMapping(value = "/ur/name/{id}")
JSONObject getUrNameById(@PathVariable("id") Integer id);
@PostMapping(value = "/ur")
琢磨的意思是什么
Ur getUrById(@RequestParam("id") Integer id);
}
FallbackFactory实现类
肽合成
接下来是FallbackFactory的实现类,需要重写create()⽅法,这个⽅法的参数为Throwable异常类,可以借此记录异常信息。create()返回进⾏服务熔断/降级的Hystrix类。
@Component
public class UrFeignClientFallbackFactory implements FallbackFactory<UrFeignClient> {
@Override
public UrFeignClient create(Throwable cau) {
System.out.println("=================》fallback reason was: " + Message());
return new UrFeignClientHystrix();
//也可以不写UrClientFallbackFactory类,直接⽤匿名对象写成以下形式:
// return new UrFeignClient(Integer id) {
// @Override
// public JSONObject getUrNameById() {
// JSONObject resultJson = new JSONObject();
// resultJson.put("id", "-1" );
// resultJson.put("name", "null" );
// return resultJson;挂钟风水
// }
// };
}
}
FeignClient实现类(也就是Hystrix类)
Hystrix类如下所⽰:
@Component空调保修
public class UrFeignClientHystrix implements UrFeignClient {
/**
* 服务熔断
* @param id
* @return
*/
@Override
public JSONObject getUrNameById(Integer id) {那天如果
System.out.println("=======================>UrFeignClientHystrix ");
JSONObject resultJson = new JSONObject();
resultJson.put("errCode", "0404" );
String description="查询id为"+id+"的⽤户,服务异常,暂时熔断";
resultJson.put("description", description );
return resultJson;
}
@Override
public Ur getUrById(Integer id) {
System.out.println("=======================>UrFeignClientHystrix ");
//直接返回id为-1的⽤户圣诞节介绍
Ur ur = new Ur();
ur.tId(-1);
return ur;
库管是干什么的
}
}
测试
启动注册中⼼,服务提供者,服务消费者。
访问服务消费者的接⼝,就能够得到服务提供者抛出的熔断结果和异常信息。访问getUrById对应的接⼝,结果如下:
访问另⼀个接⼝,返回结果如下:
异常信息如下所⽰:
======================》fallback reason was: {} status 500 reading UrFeignClient#getUrNameById(Integer); content:
{"timestamp":1557456567128,"status":500,"error":"Internal Server Error","exception":"java.lang.Exception","message":"getUrNameByIdException","path":"/ur/name/2"} =======================>UrFeignClientHystrix
可以看到message中的异常getUrNameByIdException,就是我们在服务提供者中抛出的异常。
完整代码见Github