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("=======================>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;
     }

}

测试

启动注册中心,服务提供者,服务消费者。
访问服务消费者的接口,能够得到服务提供者抛出的异常信息。
如下所示:

原文地址:https://www.cnblogs.com/expiator/p/10859372.html

时间: 2024-10-09 07:35:25

SpringCloud Feign通过FallbackFactory显示异常信息的相关文章

异常处理:显示异常信息,程序继续运行

此语句的作用是显示异常信息,便于调试和改进程序. except Exception as err: print(err) #异常处理'''异常处理格式try: 程序except Exception as 异常名称: 异常处理部分'''try: for i in range(0,10): print(i) if(i==4): print(jkj) print("hello")except Exception as err: print(err) #让异常后的程序继续for i in ra

ASP.NET MVC显示异常信息

开发ASP.NET多了,它的异常信息显示也习惯了.但在ASP.NET MVC中,却是另外一番情形. 以前只习惯使用IE浏览器,现在开发ASP.NET MVC程序,为了捕获到异常信息,Firefox的firebug插件也用了起来,它却实是能帮到我们的大忙,可以参考<Internal Server Error>http://www.cnblogs.com/insus/p/3418942.html . 下面这个例子,是一个小小超简单的计算器,实现加减乘除功能.如果用户有输入异常数据时,我们就能捕获到

android开发异常信息收集程序代码

首先创建全局的Application ,此Application全局通用. package com.demo.utils; import com.demo.exception.CrashHandler; import android.app.Application; /** * 全局的context,任意位置调用 * @author Administrator * */ public class GlobalApplication extends Application { private st

ASP.NET弹出显示ex.Message异常信息 存在换行符和回车符处理办法。

1.把ex.Message换成任意字符串,检验在catch语句块中可以用Response.Write方法显示对话框.结果显示成功,说明问题就出在ex.Message上. 2.在程序中下断点,可以看到ex.Message的内容如下图: 重点是红色圈起来的部分,这里边有个回车+换行符号,估计也就是他搞的鬼,二话不说,直接把它去掉,代码如下: try {//…. }  catch (Exception ex) { Response.Write("<script language='javascr

startActivity跳转失败而且没有异常信息

startActivity跳转不能显示目标activity的布局(显示空白页),而且没有异常信息 onCreate()方法重写错误 应该重写的是onCreate(Bundle savedInstanceState) 而不是onCreate(Bundle savedInstanceState, PersistableBundle persistentState) 其他导致跳转失败的原因有: 1. AndroidManifest中没有注册或注册时书写错误(没有添加".")

Spring MVC异常统一处理(异常信息的国际化,日志记录)

JAVA EE项目中,不管是对底层的数据操作,还是业务层的处理过程,还是控制层的处理,都不可避免的会遇到各种可预知的(业务异常主动抛出).不可预知的异常需要处理.一般dao层.service层的异常都会直接抛出,最后由controller统一进行处理,每个过程都单独处理异常,且要考虑到异常信息和前端的反馈,代码的耦合度高,不统一,后期维护的工作也多. 同时还必须考虑异常模块和日志模块.国际化的支持. 因此需要一种异常处理机制将异常处理解耦出来,这样保证相关处理过程的功能单一,和系统其它模块解耦,

JSP 500页面的异常信息打印

web开发中异常信息是很重的信息,对开发人员是其相当重要的,对这些异常信息进行转换为用户能理解的信息就更重要了~ 在单纯的JSP开发中,处理异常信息一般使用web.xml来定义. 01 <error-page> 02          <error-code>400</error-code> 03          <location>/400.html</location> 04      </error-page> 05 06  

Oracle之异常信息的加工处理

引言     很多时候,我们调用oracle存储过程都会发生各种各样的异常信息,例如ORA-12899值过大,ORA-01400不能插入空值等.虽然说这类异常是前端没控制到位的缘故,但是现实很难100%完全控制住,所以一旦发生了这类异常,并返回的前端显示时就会造成很差的用户体验了.或许,我们可以将这类异常加工一下,包装得好看些,让用户看得懂发生了什么事情,能够自行处理.下面是我的一点尝试.     我们通常会在oracle存储过程的异常处理得到异常信息,如: Exception When Oth

springCloud feign使用/优化总结

基于springCloud Dalston.SR3版本 1.当接口参数是多个的时候 需要指定@RequestParam 中的value来明确一下. /** * 用户互扫 * @param uid 被扫人ID * @param userId 当前用户ID * @return */ @PostMapping(REQ_URL_PRE + "/qrCodeReturnUser") UserQrCode qrCodeReturnUser(@RequestParam("uid"