SpringCloud Feign通过FallbackFactory显示异常信息
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("=======================>UserFeignClientHystrix ");
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("=======================>UserFeignClientHystrix ");
//直接返回id为-1的用户
User user = new User();
user.setId(-1);
return user;
}
}
测试
启动注册中心,服务提供者,服务消费者。
访问服务消费者的接口,就能够得到服务提供者抛出的熔断结果和异常信息。
访问getUserById对应的接口,结果如下:

访问另一个接口,返回结果如下:

异常信息如下所示:
======================》fallback reason was: {} status 500 reading UserFeignClient#getUserNameById(Integer); content:
{"timestamp":1557456567128,"status":500,"error":"Internal Server Error","exception":"java.lang.Exception","message":"getUserNameByIdException","path":"/user/name/2"}
=======================>UserFeignClientHystrix
可以看到message中的异常getUserNameByIdException,就是我们在服务提供者中抛出的异常。
完整代码见Github
SpringCloud Feign通过FallbackFactory显示异常信息的更多相关文章
- ASP.NET MVC显示异常信息
开发ASP.NET多了,它的异常信息显示也习惯了.但在ASP.NET MVC中,却是另外一番情形. 以前只习惯使用IE浏览器,现在开发ASP.NET MVC程序,为了捕获到异常信息,Firefox的f ...
- 使用Microsoft.ExceptionMessageBox.dll捕获WinForm程序中异常信息并弹窗显示
WinForm程序开发中,在开发模式下对于异常的处理一般都是通过调试的方式来查找异常发生的未知与原因. 下面以“除数为0”的情况来具体说明. Button按钮事件如下: private void bu ...
- Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息
</pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...
- Spring MVC 学习笔记9 —— 实现简单的用户管理(4)用户登录显示局部异常信息
Spring MVC 学习笔记9 -- 实现简单的用户管理(4.2)用户登录--显示局部异常信息 第二部分:显示局部异常信息,而不是500错误页 1. 写一个方法,把UserException传进来. ...
- SpringCloud Feign的分析
Feign是一个声明式的Web Service客户端,它使得编写Web Serivce客户端变得更加简单.我们只需要使用Feign来创建一个接口并用注解来配置它既可完成. @FeignClient(v ...
- startActivity跳转失败而且没有异常信息
startActivity跳转不能显示目标activity的布局(显示空白页),而且没有异常信息 onCreate()方法重写错误 应该重写的是onCreate(Bundle savedInstanc ...
- 报告一个IE很奇葩的滚动条问题——百分比计算宽度为浮点数时的滚动条显示异常
起因: 做项目的时候做了一个表格内容超过DIV容器自动横向滚动处理.别的浏览器都正常:但是在IE下面明明表格table和容器DIV宽度一致但是却出现了滚动条.如图 然后本人做实验找了半天原因终于是找到 ...
- springCloud feign使用/优化总结
基于springCloud Dalston.SR3版本 1.当接口参数是多个的时候 需要指定@RequestParam 中的value来明确一下. /** * 用户互扫 * @param uid 被扫 ...
- SpringCloud+Feign环境下文件上传与form-data同时存在的解决办法(2)
书接上文. 上文中描述了如何在 SpringCloud+Feign环境下上传文件与form-data同时存在的解决办法,实践证明基本可行,但却会引入其他问题. 主要导致的后果是: 1. 无法与普通Fe ...
随机推荐
- .net core 使用swagger接口描述
首先安装nuget包 Swashbuckle.AspNetCore.Swagger Swashbuckle.AspNetCore.SwaggerGen Swashbuckle.AspNetCore.S ...
- 【转载】C#中Convert.ToInt32方法将字符串转换为Int32类型
在C#编程过程中,可以使用Convert.ToInt32方法将字符串或者其他可转换为数字的对象变量转换为ToInt32类型,Convert.ToInt32方法有多个重载方法,最常使用的一个方法将字符串 ...
- 关于 Safari 浏览器不支持 location [ window.location.href window.open()] 跳转问题的解决方案
最近在做项目时,碰到 safari 浏览器不支持location跳转问题,针对此问题,可以通过 js 模拟点击时间来解决,代码如下: <!DOCTYPE HTML> <html la ...
- day 04 作业 预科
目录 作业 1.分别列出 数字类型.字符串类型.列表.字典 的 作用.定义方式和使用方法. 数字类型 字符串类型 列表 字典 词云图 作业 1.分别列出 数字类型.字符串类型.列表.字典 的 作用.定 ...
- nginx负载调度算法,后端节点状态
- SQL进阶系列之9用SQL处理数列
写在前面 关系模型的数据结构里,并没有顺序的概念,但SQL处理有序集合也有坚实的理论基础 生成连续编号 --生成连续编号 CREATE TABLE Digits (digit INTEGER PRIM ...
- Ubuntu创建启动器(快捷方式)的方式
解压.tar.gz的navicat之后发现不能自动生成启动器了,研究了一下发现: 虽然不少带有图形界面的程序会在安装时自动在桌面上创建快捷方式,还有一些图形界面程序或者命令行程序可能需要你手动创建快捷 ...
- 微服务:springboot与swagger2的集成
现在测试都提倡自动化测试,那我们作为后台的开发人员,也得进步下啊,以前用postman来测试后台接口,那个麻烦啊,一个字母输错就导致测试失败,现在swagger的出现可谓是拯救了这些开发人员,便捷之处 ...
- python开发笔记之zip()函数用法详解
今天分享一篇关于python下的zip()函数用法. zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素按顺序组合成一个tuple,每个tuple中包含的是原 ...
- object store in javascript