本菇凉最近发现一个很奇特的问题,基于SpringCloud的微服务项目下与DDD领域设计模型的架构下,难免会存在服务间大量相互Feign调用的场景,但是当一些模块开发人员进行个体服务开发时,走进异常流程会直接抛出基于RuntimeException的封装好的异常信息给到前端,这原本是非常常见的做法,但是基于DDD领域模型的设计思想下,经常性的需要对后端各服务进行接口聚合封装,提供统一的API入口,分离领域与api,那么原先已开发好的子服务的流程Exception,经过这一层Feign的封装聚合调用,FeignClient无法感知到下层服务抛出的指定http状态码code和msg。遇到异常则直接响应如下
{
"timestamp": "2017-12-27 15:01:53",
"status": 500,
"error": "Internal Server Error",
"exception": xxxxxxxx,
"message": "Request processing failed; nested exception is {\"code\":1000, \"message\":\"test Exception\"}",
"path": xxxxx
}
异常链无法向上层逐一递交,除了微服务无状态的特性外,还有更重要的原因:Hystrix熔断器。
首先来看一下最最简单的Hystrix断路机制的傻瓜逻辑

当服务A发出Feign请求时,首先会通过gateway路由到目标调用服务B上,若B服务在调用接口时发生抛出异常,则httpstatus状态码会返回一个非200的值,Hystrix熔断器针对这样的Feign响应,会统一处理为500,INTER_ERROR,响应msg中也会提示由服务A调服务B时,发生了异常。
Hystrix提供

探讨了在基于SpringCloud的微服务项目中,结合DDD领域设计模型,如何有效处理Feign调用产生的异常,特别是在Hystrix熔断机制下的异常响应与降级策略。
最低0.47元/天 解锁文章
733

被折叠的 条评论
为什么被折叠?



