原来阿里华为等大厂都是这么设计微服务接口的!(上)

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
云原生网关 MSE Higress,422元/月
简介: 第一,针对响应体的设计混乱、响应结果的不明确问题,服务端需要明确响应体每一个字段的意义,以一致的方式进行处理,并确保不透传下游服务的错误。第二,针对接口版本控制问题,主要就是在开发接口之前明确版本控制策略,以及尽量使用统一的版本控制策略两方面。第三,针对接口的处理方式,我认为需要明确要么是同步要么是异步。如果API列表中既有同步接口也有异步接口,那么最好直接在接口名中明确。

接口设计需考虑到:

  • 命名
  • 参数列表
  • 包装结构体
  • 接口粒度
  • 版本策略
  • 幂等性实
  • 同步/异步处理

微服务架构下,如果接口设计思路和调用方理解不一致,就会导致很多问题。

接口的响应要明确接口的处理结果

某下单接口响应体包含

  • success
  • code
  • info
  • message
  • 二级嵌套对象data结构体

有时下单操作的响应结果是:

success=true、message=OK,貌似代表下单成功

但info却提示订单存在风险,code是个1001错误码,data中能看到订单状态是Cancelled,订单ID是-1,好像又表示下单失败。

image.png

有时下单接口又返回:

success=false,message=非法用户ID,似乎表示下单失败

但data里的orderStatus是Created、info是空、code是0。

下单到底是成功还是失败呢?

image.png

于是,我们开始好奇了

  • 结构体的code和HTTP响应状态码,是什么关系
  • success到底代表下单成功还是失败
  • info和message的区别是什么
  • data中永远都有数据吗?什么时候应该去查询data?

混乱原因是该下单服务本身并非真正执行下单,只是做一些预校验和预处理,真正的下单操作,需要下单服务内部调用另一个订单服务来处理;订单服务处理完成后,会返回订单状态和ID。


一切正常时,下单后的订单状态就是Created,订单ID是一个大于0数字。而结构体中的message和success,其实是下单服务的处理异常信息和处理成功与否的结果,code、info是调用订单服务的结果。

  • 刚才的第一个调用,下单服务自己没问题,success是true,message是OK,但调用订单服务时却因为订单风险问题被拒绝,所以code是5001,info是Risk order detected,data中的信息是订单服务返回的,所以最终订单状态是Cancelled
  • 第二个调用,因为用户ID非法,所以下单服务在校验了参数后直接就返回了success是false,message是Illegal userId。因为请求未到订单服务,所以info、code、data都是默认值,而订单状态的默认值又是Created。因此,第二次下单肯定失败了,但订单状态却是Created。


可见混乱的接口定义和实现方式,无法让调用者分清到底该怎么处理。为将接口设计更合理,需考虑:

  • 对外隐藏内部实现
    虽然下单服务调用订单服务进行真正的下单操作,但是直接接口其实是下单服务提供的,下单服务不该“直接”暴露其背后订单服务的状态码、错误描述
  • 设计接口结构时,明确每个字段的含义,以及客户端的处理方式。


遵循以上规则,现在调整返回结构体,去掉外层的info,即不再把订单服务的调用结果告知客户端:

@Data
public class APIResponse<T> {
    private boolean success;
    private T data;
    private int code;
    private String message;
}

明确接口设计:

  • 若出现非200状态码,即代表请求没有到下单服务,可能网络超时。这时,肯定无法拿到服务端的响应体,客户端可以给予友好提示,比如让用户重试,不需要继续解析响应结构体
  • 若响应码是200,解析响应体查看success,为false代表下单请求处理失败,可能是因为收单服务参数验证错误,也可能因为订单服务下单操作失败。再根据下单服务定义的错误码表和code,做相应处理。比如友好提示,或是让用户重新填写相关信息,其中友好提示的文字内容可从message获取
  • success为true时,才需继续解析响应体中的data结构体,其代表业务数据,通常有如下情况:
  • 通常情况下,success为true时订单状态是Created,获取orderId属性可以拿到订单号。特殊情况下,比如收单服务内部处理不当,或是订单服务出现了额外的状态,虽然success为true,但订单实际状态不是Created,这时可以给予友好的错误提示。
  • image.png
目录
相关文章
|
Java API 微服务
【Spring Boot系列】通过OpenAPI规范构建微服务服务接口
【4月更文挑战第5天】通过OpenAPI接口构建Spring Boot服务RestAPI接口
495 0
|
微服务
jeecg微服务项目调用接口报错Token验证失效的解决方法
jeecg微服务项目调用接口报错Token验证失效的解决方法
|
消息中间件 分布式计算 中间件
秀出天际!阿里甩出的988页分布式微服务架构进阶神仙手册我粉了
秀出天际!阿里甩出的988页分布式微服务架构进阶神仙手册我粉了
|
11月前
|
算法 NoSQL Java
微服务架构下的接口限流策略与实践#### 一、
本文旨在探讨微服务架构下,面对高并发请求时如何有效实施接口限流策略,以保障系统稳定性和服务质量。不同于传统的摘要概述,本文将从实际应用场景出发,深入剖析几种主流的限流算法(如令牌桶、漏桶及固定窗口计数器等),通过对比分析它们的优缺点,并结合具体案例,展示如何在Spring Cloud Gateway中集成自定义限流方案,实现动态限流规则调整,为读者提供一套可落地的实践指南。 #### 二、
332 3
|
缓存 负载均衡 监控
微服务架构下的接口性能优化策略####
在当今快速迭代的软件开发领域,微服务架构以其灵活性和可扩展性成为众多企业的首选。然而,随着系统复杂性的增加,接口性能问题日益凸显,成为制约用户体验与系统稳定性的关键因素。本文旨在探讨微服务架构下接口性能优化的有效策略,通过具体案例分析,揭示从代码层面到系统架构层面的全方位优化路径,为开发者提供实战指南。 ####
|
Java 数据库 索引
最强阿里及大厂350道面试大全:框架+数据库+并发+开源+微服务
无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上,而忽略了人事部分,实际上人事面试也会影响到最终的结果,把每一个环节做好,最终的结果自然不会差。
|
Java Docker 微服务
阿里P8携手腾讯T4谈微服务架构实战:深入浅出Cloud+boot+Docker
微服务”架构在这几年被广泛传播,变得非常火热,以至于关于微服务架构相关的开源框架和工具都变得越来越活跃,比如: Netflix OSS. Dubbo. Apache Thrift等。Spring Cloud也因为Spring社区在企业应用领域的广泛知名度和强大影响力,受到了广大架构师与开发者的高度关注。
|
Dubbo 应用服务中间件 Docker
阿里P8架构师谈微服务架构:Dubbo+Docker+SpringBoot+Cloud
什么是微服务架构呢?简单说就是将一个完整的应用(单体应用) 按照一定的拆分规则(后文讲述)拆分成多个不同的服务,每个服务都能独立地进行开发、部署、扩展。服务于服务之间通过注入RESTful api或其他方式调用。
|
消息中间件 前端开发 架构师
华为架构师复盘2024最全2340页面试题jvm+spring+redis+MQ+微服务
包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!
|
负载均衡 Dubbo 应用服务中间件
阿里微服务架构到底多牛逼:深入解析Apache Dubbo与实战
在Apache Dubbo (以下简称Dubbo)重新开源之前,Dubbo已经被很多公司广泛用于生产环境并获得了良好的反馈,很多公司内部也会建立私有分支自己维护,其中Dubbox 就是基于Dubbo分支进行扩展并二次维护的。重新开源后,社区维护的Dubbo版本进行了大量“bug fix" .和特性支持,收到了大量Dubbo用户的支持和参与。编写本书的想法是在开源后提出来的,因此本书取名《深入理解Apache Dubbo与实战》。

热门文章

最新文章