微服务之间调用的异常应该如何处理

前言

在分布式服务的场景下,业务服务都将进行拆分,不同服务之前都会相互调用,如何做好异常处理是比较关键的,可以让业务人员在页面使用系统报错后,很清楚的看到服务报错的原因,而不是返回代码级别的异常报错,比如NullException、IllegalArgumentException、FeignExecption等异常报错,这样就会让非技术人员看到了一头雾水,从而很降低用户的体验感。

服务调用异常场景

这是一个很常规的服务链路调用异常,前端用户请求A服务,A服务再去请求B服务,B服务出现了异常,A服务返回的Fallback降级的报错异常,但是显然这个异常并不是很能让人理解。

这是feign服务之前调用异常的报错,通过FeignException内部的异常处理类进行处理。

重写Feign异常处理

首先我们可以通过实现feign的ErrorDecoder接口重写它的的decode方法,进行自定义异常处理,针对每个feign接口的异常报错,抛出自定义的exception将错误信息和错误码返回。

FeignExceptionConfiguration 自定义异常处理类

typescript复制代码@Slf4j
@Configuration
public class FeignExceptionConfiguration {
    @Bean
    public ErrorDecoder errorDecoder() {
        return new UserErrorDecoder();
    }
    /**
     * 重新实现feign的异常处理,捕捉restful接口返回的json格式的异常信息
     *
     */
    public class UserErrorDecoder implements ErrorDecoder {

        @Override
        public Exception decode(String methodKey, Response response) {
            Exception exception = new MyException();
            ObjectMapper mapper = new ObjectMapper();
            //空属性处理
            mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY);
            //设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性
            mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            //禁止使用int代表enum的order来反序列化enum
            mapper.configure(DeserializationConfig.Feature.FAIL_ON_NUMBERS_FOR_ENUMS, true);
            try {
                String json = Util.toString(response.body().asReader());
                log.info("异常返回结果:"+ JSON.toJSONString(json));
                exception = new RuntimeException(json);
                if (StringUtils.isEmpty(json)) {
                    return null;
                }
                FeignFaildResult result = mapper.readValue(j
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计微服务交付的关键是要考虑以下几个方面: 1. 拆分服务:将系统按照功能模块进行拆分,每个模块作为一个独立的微服务。拆分原则可以基于业务领域、功能边界或数据模型等因素。 2. 定义接口和契约:明确定义每个微服务接口和契约,包括输入输出参数、数据格式、通信协议等,以保证微服务之间的良好交互和协作。 3. 确定服务边界和依赖关系:确定每个微服务的边界和职责,避免服务之间的混淆和耦合。同时,明确微服务之间的依赖关系,确保服务能够正确地调用和响应。 4. 部署和运维策略:考虑微服务的部署和运维策略,包括容器化部署、自动化运维、监控和日志管理等,以提高交付的效率和稳定性。 5. 版本管理和发布策略:制定合理的版本管理和发布策略,包括灰度发布、蓝绿部署、回滚机制等,以确保交付的稳定性和可控性。 6. 测试和质量保证:建立全面的测试策略,包括单元测试、集成测试、端到端测试等,以保证微服务的质量和功能的正确性。 7. 监控和故障处理:建立有效的监控机制,包括性能监控、日志监控、异常处理等,及时发现和解决问题,确保服务的可用性和可靠性。 8. 持续集成和交付:采用持续集成和交付的方法,自动化构建、测试和部署流程,实现快速迭代和交付。 以上是设计微服务交付的一些基本原则和注意事项,具体的设计还需要根据项目的实际情况和需求进行进一步的细化和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值