美团开放平台SDK自动生成技术与实践

美团开放平台将美团各类业务提供的扩展服务封装成一系列应用程序编程接口(API)对外开放,供第三方开发者使用。开发者可通过调用开放平台提供的OpenAPI获取数据和能力,以实现自身系统与美团系统协同工作的业务逻辑。以外卖业务场景为例,开发者可以在自己为外卖商户开发的应用中通过调用美团开放平台提供的API,提供外卖订单查询、接单、订单管理等一系列功能。如下图所示:

开放平台为开发者提供的OpenAPI以HTTP接口的形式提供。以平台提供的订单查询接口为例,对应的HTTP请求如下所示:

从使用SDK的开发者角度来看,基于SDK封装的基础功能来编写调用开放平台接口的代码,大致逻辑如下所示:

MeituanClientclient=DefaultMeituanClient.builder(developerId,signKey).build();//设置请求参数MeituanRequestrequest=newMeituanRequest("/api/order/queryById");request.setParam("orderId","10046789912119");MeituanResponseresponse=client.invokeApi(req);if(response.isSuccess()){longprice=(long)response.getField("price");Stringphone=response.getField("customerPhone");intorderStatus=(int)response.getField("status");//完成业务逻辑}else{log.warn("queryorderfailedwithresponse={}",response);//处理接口调用失败的逻辑}从上述代码可以看出,提供基础功能的SDK已经能够为使用者提供较大的便利。相比从零开始编码对接OpenAPI,使用SDK可以帮助开发者省去处理通信协议、公共参数放置、安全签名计算和返回状态码解析的工作量。但开发者在编写代码设置API的业务参数字段的环节,仍需对照API文档逐个手工填充字段名并按字段类型赋值,并且在获取API返回的业务字段时也需自主填充字段名并解析数据类型,存在较大的不便且易出错。

为解决此问题,我们需要在SDK的能力上更进一步提供对参数富模型的支持,即为每个API提供模型化封装的请求参数和返回参数结构,让使用SDK的开发者可以更加专注于业务逻辑的开发。

在SDK加入参数富模型的支持后,从使用者的角度来看,需要编写的代码如下所示:

MeituanClientclient=DefaultMeituanClient.builder(developerId,signKey).build();//设置请求参数QueryOrderRequestrequest=newQueryOrderRequest();request.setOrderId("10046789912119");//调用接口MeituanResponseresponse=client.invokeApi(req);//处理接口返回if(response.isSuccess()){QueryOrderResponseorderResponse=response.getData();longprice=orderResponse.getPrice();Stringphone=orderResponse.getCustomerPhone();intorderStatus=orderResponse.getStatus();log.info("queryorderfinish,price={},orderStatus={}",price,phone,orderStatus);}else{log.warn("queryorderfailedwithresponse={}",response);//处理接口调用失败的逻辑}可以看出,参数富模型功能可以进一步减少开发者使用SDK的复杂度。以Java语言版本为例,QueryOrderRequest和QueryOrderResponse两个富模型类中封装了API的请求参数和返回参数的所有字段名、字段类型和字段校验规则等信息,开发者可简单使用字段的getter和setter方法完成对字段的赋值和取值操作,大幅降低了理解成本和出错可能。

从上述公式可以看出,当SDK所需支持的API数量和编程语言数量达到一定数量时,通过纯人工编码去开发和维护SDK的成本会非常高。需要通过技术手段自动生成和测试SDK中的绝大部分代码,以达到在成本可控的前提下,为开发者提供支持多种编程语言版本的富模型SDK的目标。

要为开发者提供一个支持参数富模型功能的OpenAPISDK,我们需要实现以下主要功能:

其中,通信协议封装和接口基础契约封装是一次性工作,并且其逻辑是相对稳定的。对于SDK所需支持的每一种编程语言,只需投入有限的成本开发一次对应代码逻辑,即可支撑SDK的整个生命周期。而要为平台开放的1000余个API提供支持多种编程语言的参数富模型功能,靠人工编写和维护代码是极其低效的,我们考虑通过代码自动生成技术,对SDK中的参数富模型代码进行自动化生成。

更进一步,在实现了参数富模型代码自动生成后,我们可以通过持续集成(ContiniousIntegration)和持续发布(ContinuousDelivery)技术,将SDK的生成、测试和发布流程也尽可能地做到自动化。整体的SDK自动生成流程设计如下图所示:

实现了以上流程后,即可做到在开放平台的任意API的参数模型发生变化时,由系统自动生成和发布最新版本的SDK供开发者使用。我们将在下文详述如何通过代码自动生成、持续集成和持续发布等技术手段实现上述流程。

我们最终的目标是为开放平台的每个OpenAPI,自动生成供SDK使用的请求参数模型代码(Request类)、返回参数模型代码(Response类)和调用示例代码(Example),并且代码自动生成机制要支持SDK适配的多种编程语言。以Java和C#编程语言为例,我们要生成的目标代码如下图所示:

要达成上述目标,首先需要考虑的是代码自动生成技术的选型,目前业界主流的代码生成技术分为以下几类:

考虑到开放平台SDK中,需要自动生成的OpenAPI参数富模型代码和调用示例代码均具备相对较强的规则性和模式性,我们选择基于代码语料自动生成代码的技术路线。

基于代码语料自动生成代码需要“语料”+“规则”两个核心元素,我们可以通过解析API元数据并结合领域专用语言(DSL)作为语料模板,生成代码语料,再基于语料特性为不同的编程语言定制代码生成规则,最终将“语料”+“规则”输入代码生成器以完成目标代码的生成。整体流程如下图所示:

以生成JavaSDK中的参数富模型代码为例,需要用到的代码语料包含两部分。第一部分为类的基本信息,由元数据解析器在解析API的元数据时生成,其包含的内容和具体生成方式如下表所示:

第二部分为语料模板,我们以DSL(DomainSpecificLanguage)作为中间语言加以描述,如下所示:

Request和Response类中其余的getter方法、setter方法、类注解等元素的生成原理和步骤均和以上相同,此处不再赘述。在DSL语料模板中所有的元素处理完成后,我们即可得到供Java编程语言使用的请求参数类和返回参数类的完整代码。

对于其他的编程语言(例如Python),我们使用的API元数据和元数据解析逻辑和Java是一致的,不同点在于DSL语料模板和语言转换引擎。当需要对SDK新增一种编程语言的支持时,我们只需要对目标语言建立DSL语料模板并提供相应的转换逻辑,即可支持该语言的请求参数类和返回参数类的代码自动生成。

通过同样的技术手段,我们还可以自动生成每个OpenAPI的调用示例代码,并将示例代码展示接口文档中供开发者参考。

调用示例代码的生成的逻辑相对参数模型代码更加简单。我们使用API元数据中的类名和字段信息(元数据中也包含了每个字段的examle值,可用于在代码示例中生成字段赋值的逻辑)填入代码语料中,再执行语言转换引擎生成目标代码即可。以Java编程语言为例,用于生成API调用示例代码的DSL语料模板如下所示:

<#settingnumber_format="computer">MeituanClientmeituanClient=DefaultMeituanClient.builder(10000L,"xxxxx").build();<#assignreqVarName=classNameuncap_first/>${className}${reqVarName}=new${className}();<#ifprivateFields&&(privateFieldssize>0)><#listprivateFieldsasfield>${reqVarName}.set${field.fieldNamecap_first}(${field.exampleValue!""});<#ifjavaApiMeta.needAuth>StringappAuthToken="xxxx";MeituanResponse<${javaApiMeta.responseClass}>response=meituanClient.invokeApi(request,appAuthToken);<#else>MeituanResponse<${javaApiMeta.responseClass}>response=meituanClient.invokeApi(request);if(response.isSuccess()){<#ifjavaApiMeta.responseClass=="Void">System.out.println("调用成功");<#else>${javaApiMeta.responseClass}resp=response.getData();System.out.println(resp);}else{System.out.println("调用失败");}在使用API元数据和代码语料模板执行基于DSL的语言转换引擎后,生成的API调用示例代码如下所示:

MeituanClientclient=DefaultMeituanClient.builder(developerId,signKey).build();//设置请求参数OrderQueryByIdRequestrequest=newOrderQueryByIdRequest();request.setOrderId(1000224201796844308L);//调用接口MeituanResponseresponse=client.invokeApi(req);//处理接口返回if(response.isSuccess()){OrderQueryByIdResponseorderResponse=response.getData();System.out.println(orderResponse);}else{System.out.println("调用失败");}可以看出,我们生成的API调用示例代码可以为开发者呈现出每个请求参数赋值的示例逻辑,可有效降低开发者在对接API时的理解成本。后续我们可以进一步优化DSL语料模板,在示例代码中增加对返回数据结构中各个字段的取值逻辑示范,以进一步降低开发者在处理API返回数据时的理解和开发成本。

搞定参数富模型代码和调用示例代码的自动生成后,下一步是通过持续集成和持续发布技术,确保开发者在任何时刻均能获取到最新版本的SDK。传统由人工编译、测试和上传发布SDK的模式,开发者得到SDK版本更新的周期短则数周,长则数月。我们的目标是将这个周期缩短到分钟级别:当SDK的基础逻辑和API参数模型有任何变更发生时,通过持续集成和持续发布的能力,在数分钟内将包含此变更的新版本SDK发布给开发者使用。

我们基于美团自研的流水线引擎来驱动SDK的持续集成和持续发布。流水线的执行可以看作是对生成SDK的“原材料”一步步加工,最终交付到线上的过程。先通过下图了解整体流程:

首先我们监听可能导致SDK需要发布的变更,包括通过Binlog机制监听API元数据的变更,以及通过GitHook机制监听SDK基础逻辑代码仓库Master分支的变更。一旦监听到有变更产生,通过触发器去触发SDK持续集成和发布流水线的运作。

流水线开始运作后,首先执行SDK构建组件,SDK构建组件会并发执行两个操作:

以上两个操作完成后,执行代码合并和代码编译,将结果提交到流水线执行下一个步骤。接下来由自动化测试组件完成对SDK的单元测试和端到端自动化测试,通过后提交到流水线执行下一个步骤。最后由自动发布组件完成SDK的打包、上传、下载链接生成和版本信息生成等一系列操作,并最终将最新版本SDK发布到官网供开发者下载。

通过上述能力的建设,我们打通了SDK自动生成的整个环节,以自动化的方式完成代码生成、构建、测试、集成、发布等一系列行为,最终实现了在低人力投入的前提下持续向开发者交付最新版本SDK的目标。

通过最近半年数据的对比,我们可以看出开发者使用SDK后在接口对接环节遇到的疑难问题明显减少。基本达到了我们最初提高开发者接入效率,降低平台研发和运营处理工单成本的目标。

后续,我们将会计划继续完善SDK的代码自动生成逻辑,并为SDK添加更多编程语言的支持,为接入美团开放平台的开发者提供更好的体验。

国家新一代人工智能开放创新平台被称为“人工智能国家队”,是聚焦人工智能重点细分领域,充分发挥行业领军企业的引领示范作用,有效整合技术资源、产业链资源和金融资源,持续输出人工智能核心研发能力和服务能力的重要创新载体。此前,已有百度、阿里、腾讯等15家公司先后获批建设。本次美团成功申报,标志着美团的科研创新能力获得了国家层面认可,达到“国家队水平”。

飞宏、照东、宇豪、王鸿等,均来自美团到店事业群/餐饮SaaS事业部。

THE END
1.Java:主要特点应用领域架构工具未来Java是一种广泛使用的编程语言和计算平台,由Sun Microsystems(现为Oracle公司)于1995年首次发布。Java的设计理念是“编写一次,处处运行”(Write Once, Run Anywhere),使得Java程序可以在任何安装有Java虚拟机(JVM)的设备上运行,具有高度的跨平台性。以下是有关Java的深入介绍,包括其特点、应用领域、相关技术框架等。 https://blog.csdn.net/Kemo_/article/details/144429671
2.设计模式概述北风飕飕的技术博客设计模式是软件开发中一类被广泛使用的解决方案,用于应对常见的编程问题。在 Java 编程中,设计模式帮助开发者构建高效、可扩展、易于维护的系统。本文将介绍几种常见的设计模式,并通过示例代码帮助大家理解如何在实际项目中使用这些模式。 1. 设计模式概述 https://blog.51cto.com/u_12795311/12750575
3.《Java:持续闪耀的编程之星》腾讯云开发者社区在当今的编程世界中,Java无疑是一颗耀眼的明星。它作为一种广泛使用的编程语言,一直处于热点之中,吸引着众多开发者的关注。 Java 的强大之处在于其高度的可移植性。无论是在桌面应用、服务器端开发还是移动应用领域,Java 都能展现出其卓越的性能。这使得开发者能够轻松地在不同的平台上部署他们的应用程序。 https://cloud.tencent.com/developer/article/2475023
4.备战金九银十,腾讯T4梳理2020年最全999道Java岗必备面试题答案23、类型通配符? 24、类型擦除 Java异常面试题 1、Java中异常分为哪两种? 2、异常的处理机制有几种? 3、如何自定义一个异常 4、try catch fifinally, try里有return: finally还执行么? 5、Exepti on与Error包结构 6、Thow与thorws区别 7、Error与Excepti on区别? https://maimai.cn/article/detail?fid=1676715301&efid=le0vn010vvt6jXpw7rrt0A
5.Java必备基础知识点(超全)JSE: 是SUN公司针对桌面开发和低端商务计算方案开发的版本。为笔记本电脑、PC机设计的; JEE: 是一种利用JAVA 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。 为企业级的、服务器端的高端应用而设计的; 5、 描述Java技术的主要特性 http://www.360doc.com/content/17/0511/17/40605730_653044218.shtml
6.H5手机App开发入门:技术篇如果已经掌握了 Web 技术,这个技术栈就主要学习容器提供的 API Bridge,网页通过它们去调用底层硬件的 API。 (3)跨平台 App 技术栈(cross-platform technology stack) 跨平台技术栈指的是使用一种技术,同时支持多个手机平台。它与混合技术栈的区别是,不使用 Web 技术,即它的页面不是 HTML5 页面,而是使用自己的语http://www.ruanyifeng.com/blog/2019/12/mobile-app-technology-stack.html
7.基于大数据的智能医院建设项目二期附件(3)技术商务部分 ①标的说明一览表 ②技术和服务要求响应表 ③商务条件响应表 ④投标人提交的其他资料(若有) ⑤招标文件规定作为投标文件组成部分的其他内容(若有) 10.3投标文件的语言 (1)除招标文件另有规定外,投标文件应使用中文文本,若有不同文本,以中文文本为准。 (2)投标文件提供的全部资料中,若原件属于https://zfcg.czt.fujian.gov.cn/upload/document/20210909/8617c11d53c640fcb9bcfb1c5e66cf37.html
8.Java开发web的几种开发模式(4)Java计算,基于Java技术的企业Internet/Intranet信息系统以及其他应用系统。 四、结语 Java自问世以来,以其得天独厚的优势,在IT业界掀起了研究、开发它的浪潮,显示了“鹏程万里”的美好前景。作为一种与底层硬件无关的、“编写一次,到处运行”的高级语言和计算平台,Java天生就具有将网络上的各个平台连成一体的能力https://www.yjbys.com/edu/jisuanjidengji/300226.html
9.IT技术交流分享平台JAVA+Vue+SpringBoot+MySQL码农集市专业分享根据您提供的项目信息,这是一个基于Java、Vue.js和SpringBoot的IT技术交流分享平台。该平台分为管理后台和用户网页端,可以给管理员和普通用户提供服务。平台包含以下模块: 1. 笔记类型模块:用于创建和管理不同类型的笔记。 2. 笔记档案模块:用于存储和管理用户的笔记。 3. 笔记分享模块:用于分享和管理笔记的分享https://www.coder100.com/index/index/content/id/4310056
10.达内教育IT培训官网IT培训班选达内IT培训机构专注IT培训22年,开设Java、云计算、网络安全、人工智能、物联网、WEB前端、软件测试、AI大模型、鸿蒙、智能办公、商业视效、商业变现、UI、新媒体电商等IT培训课程及IT培训证书相关课程,关注官网了解课程详解及优惠(www.tedu.cn)https://www.tedu.cn/
11.搜狗搜索引擎搜狗搜索是全球第三代互动式搜索引擎,支持微信公众号和文章搜索、知乎搜索、英文搜索及翻译等,通过自主研发的人工智能算法为用户提供专业、精准、便捷的搜索服务。https://www.sogou.com/
12.MES可重构平台技术基于MAS技术框架,可以MES系统中建立多种Agent类型,如管理Agent、加工任务Agent、资源Agent、监控Agent等,每个Agent可以对应一个具有分布式自主决策能力的业务功能模块,它们在分布式环境下实现信息共享和互操作,协同实现MES车间生产过程的管控功能。 图3所示是基于MAS的可重构MES体系结构。基于多智能体技术的MES系统具有良好https://www.clii.com.cn/lhrh/hyxx/202203/t20220330_3953477.html
13.23Java图形化编程AWT(Abstract Window Toolkit)是抽象窗口工具包,AWT是Java 程序提供的建立图形用户界面最基础的工具集。AWT支持图形用户界面编程的功能包括:用户界面组件(控件)、事件处理模型、图形图像处理(形状和颜色)、字体、布局管理器和本地平台的剪贴板来进行剪切和粘贴等。AWT是Applet和Swing技术的基础。 https://www.jianshu.com/p/9c6e86672618
14.Java核心技术(第12版)开发基础+高级特性(套装共2册)原版PDF电子书书籍类型:国产软件 书籍授权:免费软件 书籍类别:java电子书 应用平台:PDF 更新时间:2023-12-26 购买链接:京东异步社区 网友评分: 360通过腾讯通过金山通过 41.6MB 详情介绍 Java核心技术(第12版)由获Jolt大奖并拥有20多年教学与研究经验的资深Java技术专家撰写,针对Java 17进行了全面更新。 https://www.jb51.net/books/919300.html