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 ...
随机推荐
- Unity shader error: “Too many texture interpolators would be used for ForwardBase pass”
Unity shader error: "Too many texture interpolators would be used for ForwardBase pass" 解决 ...
- mysql DML 数据插入,删除,更新,回退
mysql插入,删除,更新地址:https://wenku.baidu.com/view/194645eef121dd36a32d82b1.html http://www.cnblogs.com/st ...
- elasticsearch获取字段missing的数据
用head查询: demo如下 http://localhost:9200/sj_0505/lw_point_location/ _search post { "query": { ...
- 搭建nginx做文件下载服务器
一.安装nginx yum install -y nginx 二.修改配置文件/etc/nginx/nginx.conf user nginx; worker_processes auto; erro ...
- Flask项目-循环导入及蓝图
在学习flask时,肯定有许多人好奇,为什么一定要使用蓝图,而不能直接使用app应用程序对象导来导去,很多可能会说那是由于 循环导入的缘故,但是当我们通过url访问视图函数的时候,为什么会报404 n ...
- 【Spring Boot】Spring Boot之统一异常处理
一.统一异常处理的作用 在web应用中,请求处理时,出现异常是非常常见的.所以当应用出现各类异常时,进行异常的统一捕获或者二次处理(比如空指针异常或sql异常正常是不能外抛)是非常必要的,然后右统一异 ...
- 网页代码编辑器Blocs for mac如何进行行的控制?
行是Blocs应用程序中的关键结构元素之一,它们是列和Bloc容器,它们构成了构建站点布局的基础.在本篇文章中,我们介绍的是网页代码编辑器Blocs for mac如何进行行的控制? ] 网页代码编辑 ...
- springmvc手动获取bean
@Service @Lazy(false) public class SpringContextHolder implements ApplicationContextAware, Disposabl ...
- 案例实战之如何写一个webpack loader
通过以下几个实例掌握webpack loader的写法 1.写一个多语言替换的loader 在index.js在页面上插入了一个{{title}}文本,我们需要在打包的时候将其替换成对应的多语言 fu ...
- Oracle锁表与解锁 对象锁与解锁
阅读目录 锁表与解锁 查看锁表进程SQL语句 解锁 对象锁与解锁 回到顶部 锁表与解锁 查看锁表进程SQL语句 select * from v$session t1, v$locked_object ...