对内 DDD 对外 API 之—对外 API 的设计理念,为什么spring能最好地改变Java

规范术语后,我们开始制定与术语相对应的注解和注释,一期我们先规范了对应的注解:

领域(@QDomainDoc)

应用(@QAppcodeDoc) 服务(@QServiceDoc) 接口(@QInterfaceDoc) 这里面存在参数注解和返回值是否可以删除 参数(@QParamDocs)

参数(@QParamDoc) Model参数(@QParamModel) Model属性的注解 (@QParamModelProperty)类型(@QTypeDoc)等同于 @RequestParam。目前未实现,后续支持 返回值状态码的描述(@QResponses) 返回值状态码的描述(@QResponse) 返回值数据描述说明 返回值数据(@QResponseDocs) 返回值数据(@QResponseDoc) 异常(@QExceptionDoc) 扩展(@QExtensionDoc)

相应的每一个注解我们也都会给出对应 annotation 参数使用说明:

服务(@QServiceDoc)描述 service 的用途:

对内 DDD 对外 API 之—对外 API 的设计理念

大家可以看到,QDoc 给出的规范术语和 annotation 充分考虑到了去哪儿同学通常使用的工程上下文语境,例如 Domain、AppCode,都是去哪儿网工程语境中的常用词汇,一看到这些词就能想到是做什么用的,这些贴近工程师常用词汇的术语使得工程师对于 QDoc 规范的理解很顺畅,不需要看大段的说明就可以理解个大概,学习成本低,上手使用很快。这点是去哪儿网制定的规范与 swagger2.0,swagger3.0,smart-doc 等第三方 API 工具的很主要的区别,也是我们在支持 OpenAPI3.0 规范的前提下,采用自定义 API 术语的一个很重要的原因。

当完成了基于 annotation 的 API 规范化组件定义后,下一步就是对应工具、插件的开发以及工具的接入工作。

4.2 组件易接入

=========

QDoc 为了方便业务线工程师的接入,最大限度的不让业务线开发工程师再接入 QDoc 的过程中有额外的开发量,采用了 jar 包加 maven 插件的方式,接入步骤十分简单:

服务接入步骤

  1. 接入 qdoc 服务需要在 pom 中引入对应的 maven 插件,来完成 qdoc 的发布;

  2. 如需采用 Annotation 方式撰写 API 文档,则,需要 qdoc-annotation 包以便完成编写;

  3. 具体依赖引入:(Maven Plugin)

com.qunar.fd

qdoc-maven-plugin

${qdoc.maven.version}

QDoc Annotation

com.qunar.fd

qdoc-annotation

${qdoc.annotation.version}

provided

复制代码

4.3 语法易使用

=========

QDoc 的语法分为两部分:一部分是 git 工程侧语法,一部分是代码 API 侧语法,两部分共同构成了去哪儿网标准化的 API。

Git 工程侧语法如下,QDomainDoc 和 QAppcodeDoc 都采用这种方式进行应用。

对内 DDD 对外 API 之—对外 API 的设计理念

除 QDomainDoc 和 QAppcodeDoc 外的其他注解与 API 代码结合但非入侵式应用:

@QInterfaceDoc(

type = “dubbo”,

define = “给用户发送短信验证码,dubbo接口”,

desc = “校验手机号是否为用户所有,给用户发送短信验证码”,

scene = “给用户发送短信验证码”,

notice = “内网使用”,

since = “发送短信验证码,产品需求引入”,

authors = “fanrong.zhao”,

url = “dubbo_send”

)

@QParamDocs({

@QParamDoc(name = “paramV1”, value = “第一个参数”, paramType = “form”, dataType = “String”, notice = “必须是string类型的”, paramExample = “username”),

@QParamDoc(name = “paramV2”, value = “第二个参数”, required = false, paramType = “form”, dataType = “Boolean”, notice = “必须是boolean类型的”, paramExample = “true”)

})

@QResponses({

@QResponse(code = -1, message = “系统异常”),

@QResponse(code = 200, message = “成功”)

})

@QResponseDocs({

@QResponseDoc(bindValueName = “data”, description = “第一个参数”, bindValueType = “object”, propertys = {

@QProperty(type = “String”, name = “name”, desc = “描述1”),

@QProperty(type = “int”, name = “age”, desc = “描述2”),

@QProperty(type = “com.qunar.fd.qdoc.qdocexample.vo.ExampleResultVO”,name = “food”,desc = “描述3”)

}),

})

public ApiResponseV2 example0(@RequestParam String paramV1,@RequestParam boolean paramV2) {

return null;

}

复制代码

通过目前已经在使用的去哪儿网工程师同学们反馈,一个中等复杂度的 API,通过注解方式书写 API 只需要5分钟的时间。

4.4 执行易管理

=========

去哪儿网 QDoc 工具在 API 同步方面主要支持两种方式,maven 命令同步与发布系统同步。maven 命令同步一方面可以满足 Design2doc 的诉求,另一方面也更为灵活,也继承了去哪儿网在 swagger-YAPI 方面的积累,通过发布系统同步是本次 QDoc 的主要工作。这方面的工作解决了接口与 Master 版本不同步的所有问题,包括接口创建、更新、回滚等。

我们可以看到:

服务开通步骤

  1. 发布系统开通展示 在去哪儿网应用树中,对应 appcode 下有服务列表,服务列表中【QDoc】,点击开通,即可完成应用树的集成开通。

  2. CM 发布集成 在去哪儿网发布系统中,对应 appcode 下通过服务集市进行开通。

开通后,Portal 发布线上后,会自动触发文档的更新操作,这时,就可以在应用树中看到我们的文档了。

对内 DDD 对外 API 之—对外 API 的设计理念

通过简单的3步,我们就完成了 QDoc 与发布系统的集成。

4.5 平台易应用

=========

前面的工作完成得再好,如果没有交互良好的展示平台进行支撑,那么对于使用者来说也是十分痛苦的,应用费力度高的系统也是很难进行普及的。我们最终的选择是,YAPI 嵌入到 App 管理平台,与 Appcode 管理相绑定,给与团队管理者一站式的管理体验。

YAPI 可以参考开源版本

hellosean1025.github.io/yapi/

但是,只有 appcode 维度的 API 管理只能方便工程师团队进行 API 的一站式管理,不能对 DDD 业务重塑中十分重要的 Domain 维度的 API 管理产生正向的帮助。目前我们正在对 Domain 维度的 API 管理平台做着不断的优化:

对内 DDD 对外 API 之—对外 API 的设计理念

当然,我们建立了 Domain 维度的 API 管理体系后,顺带可以做的就是通过去哪儿网成熟的网关体系来外放我们的 API:

对内 DDD 对外 API 之—对外 API 的设计理念

介绍到这里,去哪儿网通过 QDoc 工具,从代码中的 API 注解到开放平台的领域 API 的全流程就介绍完毕了。

那么在项目中我们遇到了哪些难点呢?

5 API 标准化的实施难点

==============

1、开发资源从哪里来

这个项目是去哪儿网机票目的地事业群业务研发 TC 发起的项目,没有直接的团队进行资源支持,所需要的资源跨 CM、YAPI 平台、工具开发、业务试点项目接入开发几大块,几乎涉及到了公司所有团队的工程师,项目采用了公司内开源项目管理的方式,成立项目组,单独立项,跨团队联合各个团队的资源完成项目,项目的完成对于项目管理人员也是不小的挑战。

2、Design First or Code First

作为项目的初始阶段,同时支持 Design First 和 Code First 两种方式是不可能的,我们通过调研发现,Design First 更加适合非 Domain 维度接口的制定,例如一个前后端联调接口,这类支撑类接口不具有通用性,会随着页面的变化而重新进行开发,通常不复用。Code First 更适合帮助 Domain 维度的长期维护支持的接口保持高质量。而我们这次做 API 标准化工作的初衷就是要帮助 DDD 业务重塑做好 Domain 维度接口的规范化维护工作。所以我们选择首先支持 Code First 的接口提供方式。

3、Annotation or Comments

在我们做 QDoc之前,在公司内有一定使用度的 API 标准化工具包括 swagger2.0,swagger3.0,smart-doc , 在这点上我们通过调研发现,使用注解方式的 swagger 相关工具的工程师要明显多于使用 smart-doc 类注释方式的工程师,尽管 annotation 的方式存在 API 代码上方 annotation 堆积过多,会产生代码不美观的问题,但是既然使用 annotation 注解方式的用户明显更多,我们决定 QDoc 优先支持注解方式。这并不代表之后 QDoc 不会支持注释方式。

4、支持完整的 OpenAPI3.0规范 or 支持 OpenAPI3.0规范的子集

这个问题来自于我们已经有了2018年开源的已经相当成熟的 YAPI 平台,那么我们是否满足 YAPI 的接口要求就已足够?是否不必完全满足 OpenAPI3.0规范的要求,我们的回答是否定的。平台是在不断发展的,YAPI 也会有老去的一天,当 YAPI 老去的时候我们也会在支持 OpenAPI3.0规范的其他平台中作出选择,目前看 knife4j 就是一个在我们视线之内的 API 平台。

6 项目的成果

=======

DDD 与 API 最终会师。核心域、支撑域、通用域 API 均已接入。

  1. 核心域 API 标准化有效保护了领域不被入侵

  2. 通用域 API 化有利于实现通用域的平台化

  3. 支撑域 API 化降低了开发量

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

面经、学习笔记、源码讲义、实战项目、讲解视频**

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-HJ8Rq6ER-1711032880152)]

最后

现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

[外链图片转存中…(img-TuxJrbnw-1711032880152)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值