YAZONG 我的开源

基于"API文档化让服务治理走向有迹可循"的分享总结

  , ,
0 评论0 浏览

概要

此文章基于去哪儿网-李征在”API文档化让服务治理走向有迹可循”的演讲后做的个人总结。

一、目录结构

DDD启示录

为什么需要API

用DDD来设计API

API标准化在Qunar的落地

总结

二、演讲逻辑

首先说业务,然后说现阶段模式,接着说出现的问题/痛点与改进方式,达到一种什么效果,再接着说出现的问题/痛点(前面的流程线:循环渐进的说),最后做总结。

细致入微,把某个点说透,让别人知道架构怎么演进,而不是只是让别人觉得自己公司的架构很牛,而不能实现落地。

API文档痛点

image.png

几乎每个版本的变更几乎都需要各方之间的联调,联调的基础就是接口。

接口安全案例:

领域内的接口其实并不希望暴露给领域外,联调的时候把作用域暴露出去了,提前不清楚,联调方说此接口的QPS要到达3000以上,但这个接口承受不了,幸亏落地之前发现了。

接口的开发能力,是否对外可见还是不可见,是接口定义的一个不可或缺的一个点。

实际上,代码只能表现出逻辑本身,但翻代码的人还是程序员本身。

真正让领域模型的能力开发出来,让大家能够知晓,做业务的时候对能力有一定的感知,这个文档是不可少的。

起初,一个项目的文档散落在十几处,比如Wiki、Word、代码里、群里直接扔了JSON的上下文,但这个不超过一周就不知道是啥了

文档化、标准在DDD的过程中是非常重要的一环,对每个人都是一个痛点。

DDD启示录

DDD混淆的概念:能力和功能,真正用DDD设计出来的API是领域模型对外提供的能力,而不是功能。

image.png

image.png

image.png

整合模型和分层架构。

接口都是对外端口的一种表现。

领域模型边界表达与可延续性

API是领域模型边界表达与可延续性表达

image.png

被重构的周期越来越短。

以前的系统可能跑七八年,现在的系统可能跑三四年,项目结构可能就不适合了,这也是由于业务的发展变化造成的。

现在的整体的代码复杂度,以及相关的破窗效应会使上升效应特别快。

API标准化

image.png

做API的期初受到他的影响。

DDD模型在被优化和提炼的,怎么后面变为可持续性和发展呢?API标准化来做这件事情。

image.png

再看DDD思想的时候,界限的描述和API的描述是有明确的方式方法和方向的。

image.png

API对外开放的能力而不是功能。

能力是模型自身的体现,而功能可能是描述某一次需求或业务,能力有一定的延续性。

规约:一定的约束性、延续性和不变性的。一定程度中,保持一定的稳定。

领域内的分层定义,也是一种API的体现,比如接口安全,是否暴露给外部。

具象化:文档化。能力抽象化,相应的案例、参数、场景,理解会有一定的门槛,通过能力/API,完全可以反过来理解领域本身是什么。

image.png

上图表示,经历了什么,导致软件复杂度的变化。

image.png

标准化场景,是将来需要探讨的一个方向。

用API的稳定性和可延续性来表达模型的稳定性和可延续性。

没有不变的模型,一定要有核心稳定的模型。

用DDD设计API

image.png

API-first。现有API再有能力。

拿什么来驱动API?考虑的方式。

image.png

大部分人采用的API设计方式为restfulAPI。

核心思想:一切皆资源。

在做API标准 的过程中,认为的API一定是能力,而不是资源。

在一切皆资源的方式,在做API标准 的过程中,可能不太推崇。

image.png

对外接口都是能力的体现,而不是资源实现。

经典案例

image.png

虽然跟restful差不多,但核心是能力作为核心的输出。

动作/动词都是一个能力。

API在Qunar的落地:QDoc

image.png

重点是一定要有项目开发流程的织入。

从软件过程中融入进去,变成会自然的事情,就会更加简单。

模型是在变化的,体系变化了一定版本。

文档和代码不一致,那么文档就没啥用。

image.png

同一个文档的变化要能体现出来。

image.png

规范是不可或缺的。

规范是整体落地十分重要的一方面。

完整主动的规范是一个可描述自身的、完备的规范。总的来说,是很放心的一个事情。

要有工具支撑,否则过程很复杂。

软件开发过程中织入,简化开发过程。

文档给大家带来帮助,而不是给大家带来更多的困扰。

image.png

各种协议的公共抽象出来,但是还有一些差异。

业界有一个相对完整的描述,openapi。

Openapi本身是swagger前身的那些东西,正好赶上openapi3.0的发布,对整个评估来看,是整个标准的规范化、最全、可落地的方式。

通过openapi的方式来落地,openapi是这里对文档最终的一个文档描述,接入形式并不一定是openapi本身,也可以用javadoc、其他的方式来做文档的描述,但最终生成的文档一定是符合openapi规范的。

image.png

Openapi是最终落地到存储到核心的可描述的文档。那么用什么工具来描述文档,是跟效率挂钩的。

image.png

自己做的工具。

跟大量内部流程的对接。选择自研的方案。

如果以后逐渐提炼可拆解,那么也会考虑开源的事情。

真正做到API标准化后,可以发现调用、代码生成变得非常简单。

大家在调接口的时候,大部分在沟通接口怎么来使用,如果有标准文档的话,那么可以变成自动化的方式。

image.png

如何保证代码和文档的一致性。

做了一套annotation,标准是一定的,但是需要一定的扩展,有扩展性,得提供一系列工具来描述这些扩展性。原始的OS定义可能留了很多扩展性出来,并没有在内部有定义。这套描述话,只是把这套定义描述下来。这样的话,写代码的时候,文档就保存下来了。

做了几件事,从对象里抽取该有的对象有哪些。

把QDOC工具抽取到OS中去,尽量简化在二次写文档,历史代码怎么接入的问题。

image.png

文档应该有发布的过程的,

比如草稿-上线-发布,应该跟代码的发布流程是一个一致的流程。

虽然说文档是不需要测试的,但是在文档的迭代过程中,应该有不同的版本,不同版本之间是由功能上线导致文档的变化,是有一个使用的过程的。

文档变成一个可发布的流程,CICD的发布流程。

image.png

工具化的落地,包括很多流程的集成。

在批次发布的过程中,会把当前需求变更的文档都放出来,会把当次变更的、可用的文档是什么展示出来,测试也简单,这些变更的肯定是变动范围,测试就不会再问开发了,接口都变了哪些,回归过程也都知道了。

image.png

文档自动化后,可发现衔接对接的过程是非常容易的事情了。

通过什么方式,可以让在调用的过程中不用太去关心底层是怎么做的。

对使用极大的提升。新入职的怎么根据公司的规范来做衔接。

image.png

对于API文档来讲,将来也要有一个成熟度模型的。

PMP、CMI。

当软件方法到一个阶段之后,怎么评估它的影响力,是否做到了,是应该有迹可循的,而不是每个人一套标准,而应该是有一个模型来描述它,给大家一定的指引,做一个能力的迭代。

image.png

亚马逊等云厂商是一家”API公司”,他们都有一套对外提供API的能力。

实际上对API的治理也应该是这么一个方向。

image.png

上述两个模型是否适合当下的模型,还在考虑当中。


标题:基于"API文档化让服务治理走向有迹可循"的分享总结
作者:yazong
地址:https://blog.llyweb.com/articles/2021/07/14/1626255598332.html