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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 第一,针对响应体的设计混乱、响应结果的不明确问题,服务端需要明确响应体每一个字段的意义,以一致的方式进行处理,并确保不透传下游服务的错误。第二,针对接口版本控制问题,主要就是在开发接口之前明确版本控制策略,以及尽量使用统一的版本控制策略两方面。第三,针对接口的处理方式,我认为需要明确要么是同步要么是异步。如果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
目录
相关文章
|
3天前
|
Java API 微服务
【Spring Boot系列】通过OpenAPI规范构建微服务服务接口
【4月更文挑战第5天】通过OpenAPI接口构建Spring Boot服务RestAPI接口
|
3天前
|
微服务
jeecg微服务项目调用接口报错Token验证失效的解决方法
jeecg微服务项目调用接口报错Token验证失效的解决方法
49 0
|
1天前
|
消息中间件 分布式计算 中间件
秀出天际!阿里甩出的988页分布式微服务架构进阶神仙手册我粉了
秀出天际!阿里甩出的988页分布式微服务架构进阶神仙手册我粉了
|
3天前
|
Dubbo 应用服务中间件 Docker
阿里P8架构师谈微服务架构:Dubbo+Docker+SpringBoot+Cloud
什么是微服务架构呢?简单说就是将一个完整的应用(单体应用) 按照一定的拆分规则(后文讲述)拆分成多个不同的服务,每个服务都能独立地进行开发、部署、扩展。服务于服务之间通过注入RESTful api或其他方式调用。
|
3天前
|
Java 数据库 索引
最强阿里及大厂350道面试大全:框架+数据库+并发+开源+微服务
无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上,而忽略了人事部分,实际上人事面试也会影响到最终的结果,把每一个环节做好,最终的结果自然不会差。
|
3天前
|
Java Docker 微服务
阿里P8携手腾讯T4谈微服务架构实战:深入浅出Cloud+boot+Docker
微服务”架构在这几年被广泛传播,变得非常火热,以至于关于微服务架构相关的开源框架和工具都变得越来越活跃,比如: Netflix OSS. Dubbo. Apache Thrift等。Spring Cloud也因为Spring社区在企业应用领域的广泛知名度和强大影响力,受到了广大架构师与开发者的高度关注。
|
3天前
|
负载均衡 Dubbo 应用服务中间件
阿里微服务架构到底多牛逼:深入解析Apache Dubbo与实战
在Apache Dubbo (以下简称Dubbo)重新开源之前,Dubbo已经被很多公司广泛用于生产环境并获得了良好的反馈,很多公司内部也会建立私有分支自己维护,其中Dubbox 就是基于Dubbo分支进行扩展并二次维护的。重新开源后,社区维护的Dubbo版本进行了大量“bug fix" .和特性支持,收到了大量Dubbo用户的支持和参与。编写本书的想法是在开源后提出来的,因此本书取名《深入理解Apache Dubbo与实战》。
|
5月前
|
运维 应用服务中间件 nginx
绝!阿里专家总结643页Nginx实战文档,不只运维和微服务
在互联网与我们生活已密不可分的今天,大规模、高性能的网站架构技术已成为每个互联网技术人员的必备技能。Nginx作为款开源的Web服务器软件,因其具有性能稳定、高并发、低内存耗用、高性能的处理能力等特点,而被广泛应用到国内外各互联网厂商的实际生产架构中。
|
3天前
|
SpringCloudAlibaba Dubbo 应用服务中间件
【微服务】微服务初步认识 - 微服务技术如何学习 · 认识微服务架构
【微服务】微服务初步认识 - 微服务技术如何学习 · 认识微服务架构
12 0
|
23小时前
|
Kubernetes API 数据库
构建高效微服务架构:后端开发的新趋势
【5月更文挑战第17天】 随着云计算的普及和容器化技术的成熟,微服务架构已成为企业软件开发的首选模式。该架构通过将大型应用程序拆分为一系列小型、自治的服务来提供灵活性和可扩展性。本文将探讨微服务架构的关键概念,包括服务的细粒度划分、独立部署、以及如何通过容器编排实现高可用性。同时,我们将讨论微服务实施的最佳实践和面临的挑战,为后端开发者提供构建和维护微服务系统的实用指南。