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 ...
随机推荐
- java实现顺序表、链表、栈 (x)->{持续更新}
1.java实现节点 /** * 节点 * @luminous-xin * @param <T> */ public class Node<T> { T data; Node& ...
- C++ primer学习笔记_6_函数---函数定义、参数传递
1. 习题参考: 6.14 举一个形参应该是引用类型的例子,再举一个形参不能是引用类型的例子. 答: 形参使用引用类型的情况:(1)避免拷贝传递大对象的时候,这里的string对象s:(2)当需要从函 ...
- Windows下搭建TensorFlow的GPU版本
1.下载python3.5.2版本并安装(必须是3.5版本,而且3.5后不带字母的版本) 2.使用下面的地址下载tensorflow的GPU版本 http://www.lfd.uci.edu/~goh ...
- HTMLTestRunner 用PyCharm执行测试成功但无法生成报告问题
在pythoncharm中运行时,运行成功,但是没有生成测试报告这个问题 代码: if __name__ == '__main__': # 创建测试套件suite suite = unittest.T ...
- JavaScript获得URL地址栏参数防乱码
JavaScript获得URL地址栏参数防乱码 JavaScript中经常需要解析地址栏中拼接的参数.下面的代码基本是固定的代码,这里摘录下备用. //获得地址栏参数值 function getUrl ...
- Gtest:死亡测试
转自:玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试 一.前言 “死亡测试”名字比较恐怖,这里的“死亡”指的的是程序的崩溃.通常在测试过程中,我们需要 ...
- WSL quick overview
简介 WSL,是Windows Subsystem for Linux的缩写,字面意义上理解就是WIndows下的Linux子系统.WSL 由Microsoft Windows内核团队创建,目前如果最 ...
- Replication Controller 和 Replica Set
使用Replication Controller . Replica Set管理Pod Replication Controller (RC) 简写为RC,可以使用rc作为kubectl工具的快速管理 ...
- Hikari java数据库连接池实战
环境InterlliJ2016.3 MySQL5.7.12 pom依赖: <dependency> <groupId>com.zaxxer</groupId> & ...
- 由Catalan数所引出的
百度一番: 历史 ·1758年,Johann Segner 给出了欧拉问题的递推关系: ·1838年,研究热潮: –GabrielLame给出完整证明和简洁表达式: –EugèneCharlesCat ...