首页 文章 精选 留言 我的

精选列表

搜索[脑洞落地],共10000篇文章
优秀的个人博客,低调大师

promise时效架构升级方案的实施及落地 | 京东物流技术团队

一、项目背景 为什么需要架构升级 promise时效包含两个子系统:内核时效计算系统(系统核心是时效计算)和组件化时效系统(系统核心是复杂业务处理以及多种时效业务聚合,承接结算下单黄金流程流量),后者依赖前者,分别由两组技术团队支持;因为有些业务的渗透造成两个系统的边界越来越不清晰;有些需求从PRD评审到项目上线,需要两组研发全程参与,耗费大量人力; promise时效计算业务逻辑经过多年的沉淀越来越复杂,时效计算系统中有很多业务逻辑,导致计算内核也需要跟随需求频繁更新; 时效计算分为预约和非预约,下单前和下单后,结算页时效和商详页时效。有共性也存在差异,导致共用一部分内核计算的同时存在大量冗余重复代码,需要同时维护和存储两份时效计算的缓存数据。 多种业务从内核系统中提供专用接口,导致系统严重腐化。 存在部分未采用RPC方式的依赖,导致jar包依赖和时效计算的切量开关需要配置在组件化时效系统中,影响开发和联调效率。 综上,决定这次技术驱动的重构,需要架构升级解决系统中存在的问题。 重构目标 业务边界更清晰 重构之后的需求边界从产品侧就能够确定,如果新增仓配时效计算规则需要修改或新增内核计算,其他业务的需求基本组件化时效中修改即可; 业务逻辑更聚合 组件化中整合业务逻辑; 内核计算逻辑更纯净 一套时效计算缓存,节省一半硬件资源费用; 增加系统复用性,一套计算模式同时支持预约和非预约两种模式,支持结算和商详,下单前和下单后的场景;维护一套内核计算逻辑代码,与具体业务分离,节省更多人力资源; 二、方案设计 内核计算业务梳理 现有业务接口: 标准达日历:考虑控单,产能,大宗禁止 标准达日历 京准达日历:考虑控单,产能,大宗禁止 京准达日历 无人车日历:无人车日历 仓自提/无人车日历 仓自提日历:仓自提日历,不走干支线 仓自提/无人车日历 自提日历:获取自提点四级地址,考虑控单,产能,大宗禁止 标准达日历 Vxp日历:考虑控单,节假日,大宗禁止,不考虑产能,固定最大天数和可选天数 标准日历 7Fresh日历:标准达日历计算完成后根据门店波次替换日历波次 标准达日历 全球购报税日历:加上全球购报税备货buffer后走标准达日历计算 标准达日历 B2B日历:B2B日历计算 夺宝岛日历:夺宝岛日历计算 根据业务特点,将原来的8种业务时效计算接口聚合为3个核心通用计算接口,消除了5种业务的特殊处理接口。重新定义设计新的内核计算接口:京准达时效、标准时效、仓自提时效。减少了大量重复代码,避免改一个需求就要改好多相同的地方,便于统一管理。 新core系统三个核心接口方法可以为多个业务系统提供服务  系统重构相关业务如下图所示, 主要变更点: core接口聚合,组件化系统适配,补充处理前置信息; 重构之前控单接口的调用和产能逻辑分散在组件化时效和base系统中,重构后产能提供新接口,控单和产能逻辑从core系统剥离,集中到组件化时效系统中; 大宗商品、二级仓、全球购清关、VXP节假日等业务逻辑上浮到组件化系统,减少了系统间报文大小和接口复杂度; 系统重构业务 三、项目实施 组件化业务梳理 考虑产能 考虑控单 考虑走干支线 判断是否大宗 新增全球购清关时长加buffer 新增产能白名单 新增产能白名单打标 新增自提波次格式转换 新增二级仓出参信息整合 core新接口转单据类型 节能补贴增加默认buffer 增7鲜门店波次转换 新增全球购多仓屏蔽逻辑 组件化时效中对新接口进行适配,可用切量开关进行控制  四、稳定性保障 怎样保证系统重构的安全性和准确性,重构前后一致性验证上线前主要有两种方式:单测覆盖和流量回放验证;上线后通过多维度切量开关进行控制,保障系统的稳定性。 上线前 单测场景覆盖 1700+个测试用例,覆盖大部分单一业务场景和部分组合业务场景。 流量回放验证 通过实时引流线上流量,回放到重构后的系统中。流量回放过程中发现差异,分析具体原因,发现多个重构测试用例未覆盖到的复杂场景问题。 eg.全球购商品满足城配转普通时效走大宗时效的场景:正常逻辑是①全球购商品命中了城配逻辑;②全球购不支持城配时效,需要转普通时效;③转成普通时效后又命中大宗业务场景。重构时从①走到了③,城配时效和大宗时效是互斥的,所以无法转换成大宗时效,调整转换逻辑后导致和重构前时效不一致,这种场景负责涉及业务配置很多,很难通过测试用例覆盖,流量回放验证是很好的验证方案。 流量回放自定义对比差异 由于系统架构调整以及新接口的设计和老架构存在差异,导致采购、全球购、控单等业务场景下返回的起始日历日期不一致,实际可用日历和波次是一致的,所以这种是预期内的差异,导致流量回放时diff率较高,页面配置的忽略字段无法满足我们的需求; 首次采用自定义脚本进行差异对比,自定义实现排序和忽略项设置,将不影响时效的差异对象忽略掉,减少diff干扰。 业务方案确认 对未通过测试用、流量回放差异,研发测试分别列出清单,研发、测试、产品组会进行沟通,对系统现状和业务影响范围进行评审,确定最终处理方案。 测试中发现的问题验证修复后,确认达到业务要求和上线标准,才可以灰度上线。 上线后 灰度发布时,只接入一小部分流量,并及时跟踪和分析线上的 log 与监控告警,并关注用户反馈一有问题及时解决。当新系统趋于稳定时,逐渐加大灰度发布的范围和接入的流量,同时继续跟踪线上 log 与监控告警。 白名单验证 上线后用白名单用户进行验证。 流量切换控制 系统上线后,支持用户PIN的百分比进行切量,灰度验证实现平稳过渡。 组件切换开关 新老逻辑组件可以一键切换,如发现问题可快速切回原逻辑,快速止损,保证线上系统安全; 五、项目价值 系统优化 按项目预期实现了全新纯净的时效内核计算接口,内核系统具有更高的复用性; 组件化系统中重新组织部分逻辑,增加上浮的业务逻辑。系统逻辑更聚合,提升易读性、减小了系统维护成本; 降低上线风险,重塑业务边界后,交互系统逻辑更集中,减少了相互依赖配置,更利于把控风险; 重构修复测试用例和引流验证时,发现并修复多个线上BUG,保障并提高了系统的稳定性; ◦ 测试用例发现5个BUG,修复遗漏边缘业务逻辑和处理逻辑错误等问题; ◦ 流量回放中发现7个BUG,修复530标位、京准达时效类型等线上bug; 修正40+个测试用例; 遇到的困难 系统重构总能留下比较深刻的印象,不仅会碰到技术的挑战,需要思考用什么方案更合理;也会碰到难以理清的业务逻辑,需要将产品、研发、测试摇到一起追思忆往;还会发现历史的“bug”,让人纠结要不要“更正”;都很耗费发量。 1、流量回放阶段,由于出参数据填充方式变化,导致无法比较,通过自定义脚本的方式解决。 2、自提时效多仓场景新架构无法支持,协同产品、业务优化原有多仓场景的处理方式,既解决问题又优化了线上处理逻辑。 项目总结 重构有利于项目的健壮和精简,平时要养成重构的好习惯,“小步快走”,尽量避免留着统一重构的思想,积累很多技术债后重构精力、时间成本很大,风险也会大很多。如果重构任务艰巨,需要提前做好迭代计划,重构方案设计之初就要考虑如何分阶段实施,小步快走层层分离的策略就相当于搭建施工现场的脚手架,是一种把风险控制在可接受范围的有效手段。更多关注“明天价值”,当发现好的数据结构、好的思想的时候,甚至一个变量名或方法名,把以前写的代码重写一下; 何时进行重构最好遵循“三次法则”,如果一件事需要做一两次,可以不着急重构;但是如果需要重复三次甚至以上的话,就该考虑着手去重构了,保持系统的健康状态。 公司业务在快速发展中,系统重构期间,需继续保持业务需求的迭代速度,可以适当增加人员。 系统重构前需要对业务足够熟悉(包括边缘业务),重构时可能会遇到看着重构代码一样,实际代码的执行顺序影响业务的前后依赖或优先级,最后影响结果的输出,在复杂的业务处理流程中很难发现问题。 上线后跟踪系统运行实际性能变动、资源消耗、稳定性。重构中发现了系统中存在相似的业务处理逻辑、城配相关的逻辑过于复杂等问题,下一步与产品业务沟通是否可以进行精简,重构不是终点,更像是起点。 作者:京东物流 崔海君 来源:京东云开发者社区 自猿其说 Tech 转载请注明来源

优秀的个人博客,低调大师

【架构与设计】常见微服务分层架构的区别和落地实践

作者:京东科技康志兴 前言 从强调内外隔离的六边形架构,逐渐发展衍生出的层层递进、注重领域模型的洋葱架构,再到和DDD完美契合的整洁架构。架构风格的不断演进,其实就是为了适应软件需求越来越复杂的特点。 可以看到,越现代的架构风格越倾向于清晰的职责定位,且让领域模型成为架构的核心。 基于这些架构风格,在软件架构设计过程中又有非常多的架构分层模型。 传统三层架构 传统服务通常使用三层架构: • 门面层:作为服务暴露的入口,处理所有的外部请求。部分情况下,门面层甚至不需要单独定义对象而是直接使用服务层的实体定义。 • 服务层:作为核心业务层,包含所有业务逻辑。并对基础层能力进行简单组合提供一定的能力复用。通常服务层会进行实体定义来防止下层对象体直接暴露给外部服务,导致底层任何变化都有可能直接传递到外部,非常不稳定。 • 基础层:用来存放dao和外部rpc服务的封装,二者可以拆分为不同的module,也可合二为一,以不同package进行隔离。 三层架构特点就是简单,适用于一些无复杂业务场景的小型应用,或者“数据不可变”作为基础原则的DOP(面向数据编程)服务。 但是当业务场景稍微复杂一些、调用层级较多时,可复用性、可维护性就都非常差了,很多代码都耦合在一起,牵一发动全身。   DDD架构 DDD架构可以看做是整洁架构的一种实现,分层职责如下: • 适配层:用来做外部不同端请求的适配器,隔离不同端的协议差异,包装不同端不同样式的响应体。 • 应用层:用例、任务入口、消息队列监听均在这一层,可以理解为业务流程的入口,通过聚合根的构造执行相应的命令操作。 • 领域服务层:包含核心的领域服务定义,并定义了gateway来做一层依赖倒置,使基础设施层仅做实现。 • 基础设施层包含一切基础能力:数据库、ES、远程调用封装等等。   优点 • 核心稳定:领域模型在依赖链上是顶层角色,不依赖任何其他模块,所以极其稳定。其他任何业务域、存储、边缘能力的变化都不会对领域模型造成影响。 • 敏捷:适合不同团队一起开发和维护而不会产生冲突。 • 可拆分:当有届上下文随着演进逐渐膨胀时,很容易拆分成微服务。 • 可扩展:添加新的功能非常简单,从而使得开发人员能够更快的部署和调整。 • 可演进:良好的可测试性带来非常低的重构成本,不会随着不断迭代导致项目成为难以修改的“大泥球”。 如此多的优点自然带来明确的缺点 • 专业性要求较高:需要对业务、架构原则理解深刻的人员进行设计和维护,不恰当的领域模型将使后续迭代极为痛苦。 • 开发成本高:复杂的架构设计,更多的架构分层,自然带来代码行数的指数级增长。尤其是项目前期的开发任务变得异常繁重。 • 不再适合简单的业务场景:实现一个简单的CRUD显得过于复杂。 • 改变决策困难:尝试使用整洁架构需要和团队的管理层和其他成员达成一致,这往往需要非常强大的说服力。如果在架构演进过程中想切换回其他架构模式也十分困难,几乎是整个项目级别的重构工作。 简单的微服务分层架构 基于六边形架构规范的接口适配原则和防腐理念,同时借鉴了CQRS模式的优点,我们定义了一个简单的微服务分层架构。   分层定义如下: • 门面层:作为程序的入口,通过包隔离来存放JSF服务、Rest服务、定时任务和MQ消费,其中对外提供服务的接口定义存放在单独的api包中。该层的请求定义命名以Request结尾,响应体命名以Response结尾。 • 领域服务层:每一个领域服务存放在单独的module中,并通过单独的api包对外暴露能力。该层的命令请求定义命名以Command结尾,查询请求定义命名以Query结尾,响应体命名以Dto结尾。 • 基础设施层:存放数据库、ES、远程调用服务的封装。该层的持久化数据定义命名以Po结尾。远程命令服务入参命名以RpcCommand结尾,远程查询服务入参命名以RpcQuery结尾,响应体命名以RpcDto结尾。 最佳实践 1. 命令服务必须访问领域服务层,允许简单查询直接调用基础设施层。 2. 参数校验、请求出入参日志、审计日志记录、TraceID预埋、异常处理等非核心业务能力均由公共组件完成,减少项目内部的边缘能力代码。 3. 由于在门面层进行统一的异常处理,非必要时无需在项目中进行大面积的try-catch,让代码更清爽。 4. 实际开发过程中,门面层、领域服务层和基础设施层均有各自的实体定义,跨层调用的对象体转换使用MapStruct组件来减少手写映射代码的工作量。 5. 数据层使用Fluent-Mybatis,最大好处是减少后期迭代中,数据对象增减字段时修改Mapper的成本。 优点 1. 开发效率 简单的业务开发过程中,相比较书写核心业务逻辑,更多的工作量几乎都是来自处理跨层调用时对象转换和Mapper定义,通过MapStruct和Fluent-Mybatis等组件的使用(也许再加上GitHub Copilot😁),编写一个实体的增删改查接口基本在5分钟内搞定,省下来的时间可以多走读两遍代码或者多写几个分支的测试用例,也算是降本增效了。 2. 服务隔离 通过module隔离不同的领域服务,降低不同领域服务之间的耦合程度。 3. 外部服务防腐 远程调用统一封装在基础设施层中,降低外部变化对系统内部的影响。 缺点 1. 基础设施层的实体作为顶层依赖 由于对基础设施层的依赖没有通过api包进行隔离,所以基础设施层的对象会直接暴露在领域服务层和门面层。对此可以通过使用ArchUnit组件进行架构防腐。 如果需要定义完善的领域实体充血模型,建议参考DDD架构定义gateway层来进行基础设施层的依赖倒置。 最后 软件工程的方方面面都遵循一个最基本的道理:没有银弹,架构分层模型更是如此,每一种都有各自优缺点,所以请根据不同的业务场景,并遵循简单、可演进这两个重要的架构原则选择合适的架构分层模型即可。 架构不只是工作,更是一门艺术。

优秀的个人博客,低调大师

云原生落地实践:山西数智时代基于 Rainbond 实现智慧景区

大家好,我是山西数智时代科技有限公司的赵佳鹏,我们公司成立于2018年,专注于智慧旅游、景区信息化建设。公司目前的主要产品有小悠出行管理系统、景区数字化运行管理系统、鼎云校园摆渡车运营管理系统、行车信息管理及流转系统、觅四方商城系统等,是集智慧旅游规划、设计、建设、运营为一体的旅游全产业链服务商。 智慧景区的整体架构 最早我们的业务是单体服务,单体服务最大的问题就是业务无法解耦,抗并发能力不高。业务升级为微服务架构之后解决了业务之间的解耦,提升了业务的抗并发能力,升级微服务架构之后也增加了很多新功能,比如实时分账、套票的支持,多种渠道的购票融合,支付安全性、抢购、活动等都带来了一定的复杂度,在检票的时候要保证多个渠道的库存、票状态要实时同步等对技术上有一定的要求。 单体服务到微服务也是一次巨大的挑战,服务器成本、人员成本、单体业务解耦、服务划分、运维等方面都存在很多问题。 存在的技术问题: 资源利用率,以前服务器都是每台上边部署几个项目,比如有台服务器 CPU、内存、磁盘等资源很多,但另一台服务器资源又很少,资源多的服务器没法完全利用起来,资源少的服务器满了之后就没办法再部署业务,这会导致大量资源无法有效的完全利用。 运维方式不统一,以前部署项目的时候多个项目组都是各自部署各自项目,各自部署方式不一样一会用主机方式,一会用镜像方式,每次需要找日志的时候都要查找半天,服务器上边的文件夹也是创建的乱七八糟的,没有统一的部署方式导致出问题后需要巨大的成本。 项目环境重复部署,之前服务器上会部署多个项目,每个项目环境都是各自项目组成员负责,导致环境不统一,有的中间件需要部署好几遍,Nginx 也是部署了很多不同的版本,浪费了大量的时间去做了相同的事情,加大了运维成本。 部署成本高,之前用 GitLab CI/CD 部署项目时需要写大量的 YAML 配置,同时还要解决 HTTP、HTTPS 访问,证书每次都需要去手动生成,然后再拷贝到服务器上,出现问题再一遍一遍的去改配置,YAML 语法也需要每个项目组的成员去学习,导致项目的成本提高。 云原生平台选型 采用微服务架构之后,我们决定全面转向容器化、云原生方向,所以我们需要一个对开发者友好、可视化部署、自动构建、易用的一个云原生 PaaS 平台。 在选择 Rainbond 之前也使用过其他开源 PaaS 平台,由于公司没有专业的运维人员,在使用的时候发现对程序员都不是很友好,还是脱离不了 YAML 的编写,学习成本太高,没有很好的扩展功能,后来了解到 Rainbond 后发现对程序员特别友好,不需要写大量的 YAML 文件,通过界面化配置就能部署项目,而且官方文档很完善,部署例子也很多,操作简单,功能也能满足公司的需求。 使用 Rainbond 承载所有业务场景 在云原生架构之前,多台服务器的单独运维和部署复杂度高、资源利用率低、重复操作率高,对于线上项目的成本很大,线上服务出问题后无法及时的判断问题出在哪个服务上,需要人工先找服务在哪台服务器,然后在通过一系列命令去查看等等。 在转向使用 Rainbond 云原生架构后,由 Rainbond 统一管理服务器、调度资源,而我们只需要管理业务,降低了运维成本。以及相关运维操作都可以通过界面化实现,比如通过拓扑图就可以看到所有服务运行情况,哪个服务出现异常清晰明了,业务相关日志可以通过日志界面轻松查看,并且有历史日志保存等等。 整体上对于我们来说降低了项目的成本,相应的为公司带来的利益就比之前多了很多。 使用 Rainbond 的最佳实践 项目团队管理,公司不同项目会有不同的小组负责,这个功能就可以完美的解决这个问题,可以单独设置权限、集群资源。 代码仓库对接和快速部署,公司用的华为云的代码仓库,在 Rainbond 上可以直接填仓库地址,然后通过源码直接构建部署,同时还支持 Maven多模块的批量构建,公司大部分项目都是多模块项目,用了这个功能之后比之前效率高了很多。 测试环境一键复制到其他环境,Rainbond 可以将测试环境的应用快速复制到其他环境中,省去了再次部署的问题,在之前不同环境都需要部署一次,用了这个功能后只需要部署一次,然后就可以快速复制到不同环境中。 可视化服务编排,项目部署成功以后可以通过可视化的方式进行服务编排,这个功能是我在其他 PaaS 平台没有看到的,之前服务编排需要写大量的 YAML 文件,现在可以直接使用鼠标一拉一拽就可以完成,而且还是根据组件依赖情况按顺序启动。 使用 Rainbond 总结 从2022年8月份使用 Rainbond 到现在半年多的时间里,明显感觉到在项目的开发效率上提升了很多,之前每次重复的工作现在只需要干一次,运维上也方便了很多,直接界面化配置,比起之前写大量 YAML 文件省去了很多时间成本,在运维上省去的时间现在都用来开发项目,修改BUG了。 架构转变为云原生架构的这段时间里,发现了它的很多优点: **快速迭代,**在 Rainbond 上进行开发,使开发团队可以使用自动化能力和编排来快速迭代,让开发人员有更多的精力聚焦于业务开发上。 **自动部署,**云原生方法远优于传统的面向虚拟化的业务流程,传统方法需要投入大量的精力来构建开发环境,以及软件交付过程中的其他不同环境。而云原生架构具备自动化和组合功能,并且依赖于可靠、经过验证和审核的已知良好流程的基础,交付十分敏捷,而不再需要人工干预重复执行。 **独立高效,**云原生带来了微服务化架构,一个微服务基本是一个能独立发布的应用服务,因此可以作为独立组件升级或复用等,对整个大应用的影响也较小,每个服务可以由专门的组织来单独完成,依赖方只要定好输入和输出口即可完全开发、甚至整个团队的组织架构也会更精简,因此沟通成本低、效率高。 **屏蔽底层差异,**Rainbond 虽然建立在 K8S 之上,但屏蔽了很多 K8S 的知识以及底层硬件的差异化,而我们的开发人员就不需要考虑应用对于底层硬件的差异,也不需要学习更多的容器知识,只需要专注于业务即可。同时对运维人员也非常友好,不需要再为环境问题而苦恼。 在未来我会更深入的了解云原生和不断地尝试 Rainbond 带来的新功能。 给 Rainbond 的建议 谈谈自己的感受吧,我在测试环境部署 Rainbond 也是部署了很多遍,每次都会遇到不同的问题,不过还好,Rainbond 社区支持比较给力,每次都能及时帮助解决,不过还是建议部署文档再继续完善下。到了生产环境部署Glusterfs 集群存储的时候也发现了问题走不下去,希望社区也能解决下 Glusterfs 的问题或者引入其他存储的解决方案。还有自动签发证书的功能,只支持 ACME 去签发,由于公司使用的是华为云的域名,Rainbond 社区 的 ACME 服务不支持华为云 DNS 导致无法使用这个功能,希望社区能支持范围更广的 ACME 去做 SSL 证书签发。 最后还是很感谢 Rainbond 这个产品以及社区的帮助,用了这个产品之后实实在在从根本上解决了很多问题。希望 Rainbond 在未来能再接再厉做的更好。

优秀的个人博客,低调大师

平头哥加入 openKylin,完成社区版本与曳影 1520 SoC 适配落地!

近日,平头哥半导体有限公司(以下简称“平头哥”)签署openKylin社区CLA(Contributor License Agreement 贡献者许可协议),正式加入openKylin开源社区。 平头哥成立于2018年9月19日,是阿里巴巴集团的全资半导体芯片业务主体。作为高性能RISC-V处理器的先行者,平头哥不断拓展RISC-V性能、应用与生态的边界,打造出从低功耗、低成本到高性能、高能效的丰富RISC-V处理器产品家族,广泛应用于边缘计算、无线通讯、工业控制、通用MCU等30多个领域及应用场景。 在加入openKylin社区后,平头哥积极参与社区合作,推动openKylin与RISC-V架构融合发展。目前,平头哥已与openKylin社区合作,完成了平头哥曳影 1520 SoC与openKylin操作系统的适配工作,并基于社区软件源构建了镜像版本。 该版本包含近1600个软件包,集成了一系列稳定版本的基础库和图形开发库,能够顺畅运行UKUI桌面环境。此外,系统包含丰富的openKylin自研软件和第三方开源软件,如浏览器、视频、音频和文档编辑等,可以满足用户的基本使用需求。 社区会员持续招募中 目前,openKylin社区会员招募正在火热进行中,欢迎更多企业伙伴加入,携手共建,打造桌面操作系统顶级社区,推动国产操作系统产业生态健康发展。详情可查看:【https://mp.weixin.qq.com/s/yk82DEQSG0knaQNKyc-vsg 】 openKylin(开放麒麟)社区旨在以“共创”为核心,在开源、自愿、平等、协作的基础上,通过开源、开放的方式与企业构建合作伙伴生态体系,共同打造桌面操作系统顶级社区,推动Linux开源技术及其软硬件生态繁荣发展。 社区首批理事成员单位包括麒麟软件、普华基础软件、中科方德、麒麟信安、凝思软件、一铭软件、中兴新支点、元心科技、中国电科32所、技德系统、北京麟卓、先进操作系统创新中心等13家产业同仁和行业机构。 审核:openKylin

优秀的个人博客,低调大师

得物API一站式协作平台探索与落地

1. 现状 API文档作为公司研发重要的数据资产,承载了公司核心的业务逻辑,随着公司业务的复杂化,软件架构微服务化,公司数字化的发展,API的研发管理成为了公司研发的最重要的一个环节,而得物目前存在两个接口文档相关的平台: 文档管理平台-YApi 基于开源的YApi平台,提供基础的API管理能力。 数据Mock平台-Mooncake Mooncake 平台为前端和客户端提供零侵入、场景化的Mock服务。 2. 面临的问题 根据行业报告显示,开发团队大概有50%的工作时间是围绕着API开展的,目前在得物的研发流程中,围绕API文档的协同工作分散在不同的工具或者平台,导致现有的API在研发协同工作中低效流转。 API文档资源利用率低 YApi作为现有的文档管理平台,过度的管控、复杂的交互和混乱的分类导致现有的文档利用率非常低。根据数据统计,大部分的使用场景为上传文档、确认文档等。 API文档质量无法保障 由于YApi文档管理平台缺乏文档的最终测试环节,导致接口在后期改动环节,并不能及时同步到文档平台,最终无法保障文档的统一性和质量。 围绕API研发流程割裂 在接口的整个研发生命周期中(设计-开发/Mock-联调-验收),涉及到服务端、前端/客户端、测试多个角色,跨越YApi、Mooncake、测试平台等多个平台。 3. 业务思考 优质的API能够进一步的提升团队的研发效率,进而达到降本提效的效果。那么在这样的背景下,解决团队之间API的内部流转,解决前后端基于文档的工作对接,提升文档的研发利用率和文档质量成为了平台升级的核心问题。因此,文档和测试便成了核心环节,基于这样的思考,我们提出了文档驱动和测试驱动两个核心点,最终驱动整个研发流程的运转。 文档驱动: 服务端完成接口文档、测试用例,前端、客户端能够通过接口文档了解接口定义以及应该如何跟接口进行交互,各职能团队参照API文档独立完成需求研发。 测试驱动:每个迭代,交付的接口文档都通过测试保证文档质量,对于测试不通过的文档,则要持续的改进,最终保证文档交付。 基于文档驱动和测试驱动,我们提出了DTDD ( Document & Test Driven Development ) 研发模式,通过对DTDD模式的探索,打通了整个研发流程,实现了研发流程的闭环。 在DTDD模式下,平台要做的事情也就很清楚了: 沉淀API数据资产:沉淀具备业务价值分类的API接口文档资产,产生规模化业务价值。 测试驱动开发:同步自动化测试平台针对API的测试用例,提高API交付的质量。 实现数据Mock:基于API的数据Mock,提升前端、客户端的研发效率。 丰富文档能力:围绕API的使用场景,提供文档类型转换,接口调试能力。 降低沟通成本:基于消息通知机制,降低沟通噪音和信息复杂性,产品平台价值。 4. 解决方案 明确了DTDD研发模式的目标之后,接下来就是要如何去做了,通过对业界主流的API文档管理方案的调研,结合得物目前的现有平台YApi和Mooncake,我们最终决定打通两个平台,同时对功能进行了升级。平台的架构如下图所示: Mooncake平台的研发并不是一蹴而就的,下面我们从数据分类治理、提升文档利用率、提升接口交付质量、降低用户沟通成本、降低平台使用难度五个方面讲述一下Mooncake研发过程中的一些思考。 4.1 数据分类治理 分类/分组从本质上,寻找事物的共同点和不同点,是我们认识和理解世界的基础方法和能力,合理的分类/分组可以帮我们更好的理解事物的共同点,帮助我们判断、推理,最终才能形式概念做出决策。 YApi原有项目分组和文档分类比较混乱,API文档作为业务资产不能很好的帮助研发理解业务,无法做到很好的提效,为了更好的辅助推动业务研发迭代效率,我们废除了原来的项目分组和文档分类,如何进行合理的项目分组和文档分类成了面临的问题。 项目分组: 最初我们想到的是按照公司组织架构对现有的项目文档进行分组,但是由于组织架构存在频繁调整的问题,通过调研我们发现与项目紧密关联的RDC 业务域相对稳定,最终我们将项目文档和业务域关联,将现有的项目文档按照业务域进行划分。 我们获取项目最新上传的十个接口,获取接口的维护人员,查询维护人员的归属业务域,通过计算不同业务域的权重,将项目按照计最大的业务域权重划分业务域分组。 示例: 记人员为A, 下面所获取的业务线为{[a, 80],[b,60], [c,10], [d, 5]} 记人员为B,下面所获取的业务线为{[a, 60],[b,30], [e,10]} // 业务线a weight_a = (80+60)/2 = 70 // 业务线b weight_b = (60+30)/2 = 45 // 业务线c weight_c = (10+0)/2 = 5 // 业务线d weight_d = (5+0)/2 = 2.5 // 业务线e weight_e = (10+0)/2 = 5 weight_a > weight_b > weight_c = weight_e > weight_d 通过对项目数据的清洗,对YApi原有的项目进行了业务域的划分归属,也达到了以下目的: 通过对项目进行业务域的分组,可以更清晰的获取项目的相关业务属性。 默认选中用户归属业务域,降低用户获取信息成本。 接口分类: YApi 平台接口分类管理能力较弱,随着文档和分类的增多,文档的可维护性逐渐变差,文档和业务的关系也逐渐削弱。例如在大型项目中,上千的接口,数百的分类目录,文档的分类管理已经失去了原有的能力。 最初接口的分类治理方案: a. 手动创建分类,并维护一个类目映射关系,插件依然使用原来的上传逻辑。 缺点:需要频繁维护类目之间的关系,后期维护成本高。 b. 使用贝叶斯算法,根据服务、接口名称、接口路径等构建分类关系。 缺点:分类效果不明确,需要不定期筛选、维护不准确分类的接口。 通过对后端团队的调研,对现有的接口分类能力进行了以下的优化升级: 废弃原来的分类,提供多级分类的能力。 支持原有数据的批量分类能力。 通过为用户提供灵活的多级分类能力,使得接口分类具备更深层次的业务能力,对于项目文档资产的沉淀,起到了很好了帮助。例如在门店项目中,我们能很清晰的理解接口的业务能力,如图所示: 4.2 提升文档利用率 基于文档的数据Mock 围绕API文档前后端的对接,自然离不开数据Mock。根据文档字段,平台提供了一键Mock功能,依据文档字段,可以生成更精准的Mock数据,例如image、time、name、city等生成相关的数据。除此之外,我们提供更强大的Mock功能: Mock空间的数据隔离:通过提供更灵活的私有场景集,和更稳定的公有场景集,保证了Mock数据的安全性和数据隔离。 Mock接口的多场景: 同个接口提供不同的数据Mock场景,用户可以自己定义Mock场景数据,例如404场景,支付成功场景等,一键激活场景或者切换场景。 Mock插件的零侵入: 目前市面上常见的Mock服务,要么自己在业务代码中编写Mock数据,要么提供的插件侵入工程的业务代码,Mooncake平台基于Chrome插件提供零代码侵入Mock功能。 基于文档的调试能力 目前对于接口的调试,大家还是常用Postman进行调试,配置URL和参数的过程还是比较麻烦的,文档变更之后,还不能及时的进行改变。Mooncake基于现有的文档数据,提供了调试功能,免去了配置出入参的麻烦,主要特性如下: 支持多环境配置: 用户可以提前配置多套运行调试环境,例如开发,测试,生产等多种环境,一键切换调试环境。 免登陆配置: 通过账号的配置,可以自动获取token,解决调试获取token的问题。 公共参数配置: 配置公有header参数,减少接口配置次数,节约配置时间成本。 调试场景:支持远程调试和本地调试。 基于文档的转换能力 YApi提供的文档转换能力较弱,无法判断字段的是否必填,在对前端的调研中,发现大家现有的转换能力不满意,导致功能的使用率较低,然而文档的转换能力在前端的使用过程中是个高频功能,手动转换比较浪费时间,因此我们丰富了文档的转换能力。 多文档类型支持: 支持多种文档类型的数据转换,包括Schema 、JSON、Raw 类型等。 更精准的字段定义:根据字段的是否必填,在 TypeScript 中直接转换字段是否可选。 更多语言的支持: 目前支持类型声明转换为TypeScript 、Java 、Swift 、Go 、Kotlin 、Dart 等。 通过丰富基于文档的内容和功能,Mooncake平台提升了文档的利用率。 在Mooncake平台推进的最近三个迭代,同比原有的YApi,人均PV提升2倍,使用时长提升23倍。 4.3 提升接口交付质量 DTDD最重要的一个核心测试驱动,通过接口文档的测试,保证文档的交付质量。在Mooncake平台,将接口文档的数据同步到自动化测试平台,测试编写接口的测试用例,Mooncake平台将测试用例同步过来,开发在交付文档前,可以通过跑测试用例,确保接口的交付质量。 开发可以在Mooncake查看当前用例的参数设置,同时也可以运行用例查看用例执行结果,如下图所示: 4.4 降低用户沟通成本 整个研发流程围绕API文档的生命周期进行,因为牵涉到不同的职能角色(前端,后端,测试,客户端)等,所以接口的变更会影响到整个研发链路。围绕接口变更的频繁沟通,或者由于接口变更没有及时通知到其他角色,影响整个研发进展的事情时常发生,基于这样的考虑,我们增加了以下特性: 接口订阅: 通过订阅关心的接口,可以实时收到接口的变化通知,一键查看接口变更。 历史版本: 平台记录了接口变更的历史版本,可以很方便的查看当前版本与历史版本的区别。 群消息通知: 平台增加了基于webhook的群消息通知功能,项目接口文档的增删改变化都能收到机器人的通知。 4.5 降低平台使用难度 子曰:工欲善其事,必先利其器。工具的重要性不言而喻。为了使得平台使用起来更方便,提升工作效率,我们配套Mooncake平台,提供了如下的工具链: 前端工具: 抽离前端代理SDK,服务与不同项目配置的代理插件,包含Webpack插件 、Vite插件、Umi插件、Chrome插件等。如图所示: 后端工具: IDEA插件:提供交互式IDEA插件,降低代码侵入,增强对文档分类的约束。 Go命令行工具:基于社区的Go文档生成工具,将Yaml文件一键上传到指定项目。 本地调试工具:提供本地调试工具Chrome插件,解决本地调试跨域问题。 通过对DTDD模式的探索和思考,最终完成了得物一站式文档协作平台的自主研发,Mooncake一站式文档协作平台的上线只是起点,绝不是终点,对于文档平台的展望如下图所示,通过文档协作平台的建设,推动业务发展,进而实现产生经济价值的目的。 基本功能: 围绕API提供基本的功能,例如接口文档、接口测试、数据Mock等 解决方案: 围绕API的一些功能,为研发提供解决方案,如研发流程的管理、API的快速生成、接口编排、依赖信息变更等 降本提效: 基于API的扩展性方案,体验研发流程效率,降低生产成本,推动业务发展 ​​​​​​​ 5. 总结&思考 本文简要给大家介绍了Mooncake作为得物一站式研发协作平台的演进过程。平台的整合需要深度思考整合前的现状以及最终要解决的问题,对于最终想要的产品,首先要进行充足的调研,充分了解用户目前的痛点,做到调研先行,明确目的,本着提出问题、解决问题的核心,打磨好每个细节、每个功能。 目前Mooncake平台已经实现文档的管理功能,后续平台的方向我们也在规划:完善Dubbo协议的支持和调试;定时扫描代码,实现文档的自动化更新;丰富文档依赖的上游信息,做到变更通知;接口编排实现业务数据的组装等。 *文 /migor

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册