> 文章列表 > API基本属性——暴露等级

API基本属性——暴露等级

API基本属性——暴露等级

一、接口暴露等级

对于服务而言,接口是整个系统的信息交互渠道,是各个模块相互沟通的桥梁。这里,根据系统模块的划分,以及接口的功能区分,我们一般会将接口分为两种类型:

  • 内部接口(InnerAPI)
  • 开放接口(OpenAPI)

顾名思义,内部接口就是系统模块内部进行数据、信息交互所使用的接口,它们一般功能比较直接、调用方法与形式也较为固定。

而开放接口,则是整个系统对外部用户所提供的、可以直接调用并利用系统功能达成某种目的的接口形式。一般而言,开放接口是整个系统与外部世界沟通的唯一桥梁,是要严格把握规范性、可用性等指标的,但同时由于是其他服务/用户所使用,因此使用方法与逻辑可能会超出预期,也可能出现接口非法调用、超量调用的情况,对于这类开放接口的分析评估以及质量看护就显得尤为重要。

在接口开放性的评估分析上,我们一般有以下三种方法:

  • API设计阶段定义
  • API网关注册
  • 基于调用链层面逆向分析

接下来,笔者会对着三种方法逐一介绍。

二、开放接口评估方法

1、API设计阶段定义

以API FIrst的理念出发,一个接口的具体功能与暴露等级,应该是在规划与定义阶段就已经确认好、并在API设计文档里承载的,这也是最正规、最理想的情况。

因此,基于这一点,我们在业务实践中,会主动去获取API设计平台中,服务所承载的API设计文档数据:一般以yaml的形式进行结构组织。
而对于API设计,通常我们会定义一个以 x为开头的拓展字段,来作为接口某些特殊属性的标记为:例如x-is-open就可以用来记录表示接口是否为开放接口。

这样,通过这种规划设计段定义、API设计平台数据承载、自动数据同步的方式,我们就完成的API开放性信息的获取与维护。

2、API网关注册

在API全生命周期流程中,包含环节:API注册

对于这一环节的详细内容,笔者后续会单独介绍。简单来说,当我们希望接口能够被其他用户或服务所调用时,云服务语境下的主流做法,是将API注册到API网关(API Gateway)上,并授权给对应的服务或用户。

这种集中式管理的模式有很多显而易见的好处:统一授权、调用透明、流量可控、自主熔断等等。当然缺点也是存在的,这里暂且不谈。

简而言之,当一个接口被注册到网关上时,必然就意味着接口在暴露等级上是OpenAPI等级。

3、基于调用链层面逆向分析

首先,很多时候服务的接口会在自身不知情的情况下被其他服务调用,这种情况其实比较常见。这是由于服务接口本身并没有注册到网关,同时也没有做非常详细的白名单限制,从而造成:
可能服务A本身给服务B提供了某个接口的使用,但是服务B发现服务A的另一个接口也比较有用,于是使用了同样的认证方法去直接调用了服务A的这个接口,但服务A此时是不知情的。

同一个服务下的微服务之间调用属于内部接口调用,彼此相互了解、调用行为也有预期,因此一般不会出问题。
但是这种跨服务的接口调用,如果在被调用服务未知情的情况下暴露、调用,这就造成了很多质量与安全隐患:

  1. 首先服务A可能会对该接口做不兼容修改、甚至可能会直接将该接口下线掉,但服务B在不知情的情况下依赖于该接口的业务就会受损。

  2. 更严重的,服务B并不清服务A对于该接口的性能承载极限,当调用量达到一定程度后,服务A可能直接会由于该接口的调用将整个系统拖垮(例如数据库连接数持续维持在极限而挤压其他正常业务)。

因此,在调用链层面,我们会解析接口的调用信息与调用方,判断接口的调用者与被调用者是否属于同一个服务下:

  • 如果是同一服务下、不同微服务之间相互调用,那么我们并不认为接口是属于开放的;
  • 而如果是不同服务间的接口调用,则我们认为该接口是开放接口。

三、小结

API暴露等级是API的一个重要基本属性,在各大云计算公司对外提供服务中,API文档里全部都是规范对外提供的OpenAPI。这些API需要有规范的划分与定义、测试与监控,是服务的门户与核心。