8分钟丨教你玩转 API
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

背景
当下,业界越来越多公司在项目架构设计时,会采用微服务架构。微服务架构,可以让我们的产品有更好的扩展性,更好的伸缩性;但同时也会带来微服务的一系列问题,比如微服务接口怎样规范管理?怎样在多团队协作中开放与复用?等等。
同时,业界也在逐渐的引入DevOps理念,来实现开发,测试,运维,运营更紧密的高效配合,提升产品迭代的效率,质量。
这里,织云API平台将从“部门内微服务API开放复用”,“产品线API DevOps实践”来分享腾讯社交网络运营部踩过的坑和API平台在“开放”,“DevOps”的理解及实践。
1API开放与复用
部门长期运营,积累了很多优秀的系统/平台,各个系统/平台也很早的开放了自己的Open API 给其它团队做二次开发和使用。
作为开放接口使用方:要集成A平台的B服务时,你可能会遇到:
- 找不到平台开放接口文档;
- 从平台官网下载的接口文档好像未更新;
- 接口文档定义太简单。看不懂;
- 使用前,不清楚接口的质量现状(成功率,耗时等);
- 出异常时,没法快速界定问题的边界。
作为开放接口提供方:你在运营上可能会遇到:
- 接入方很多,长久下来,自己都不清楚调用方是哪些?
- 最近我的接口调用量大增,不清楚这些调用是否合理?
- 旧接口要下线,但仍有请求。不方便快速找到调用者。
2产品线API那些事儿
织云,是腾讯SNG海量业务运维能力经验沉淀出的产品,它采用微服务架构。在微服务的开发,测试,交付,运营中,我们遇到这样子的问题:
- web工程师:版本迭代很紧,但是后台同学的接口迟迟出不来,我的工作delay很久了

- 后台工程师:版本迭代很紧,写代码的时间都没有。哪来时间写用例。但每次修改代码,人工自测耗费很多时间。

- 两位工程师:上次不是好说接口长xx样子吗?怎样现在变成这样子了?

- 质量工程师:这个迭代,织云性能是否达标呢?看不见,摸不着,快慢主要凭感觉。

- 运维工程师:客户反馈操作有异常。一个问题都转几手开发。我怎样快速定位问题根源

- 客户:你们的XX能力很好。我们想基于它们接口做二次开发。有开放接口吗

织云API平台,就是这种大背景下应运而生。
API平台简介
- 定义
织云API平台,是一个以API服务管理和代理以基础,赋能接口开发,测试,上线运营,下线管理于一体的API管理与开放平台。
- 应用场景

- 功能介绍

1、织云API平台,实现了API统一规范管理与开放。 2、以服务代理为基础,实现了安全认证,过载保护。 3、对于服务调用支持日志查询,数据画像,异常告警,链路分析等功能。 4、可以基于API平台实现基于织云所有能力的定制开发的能力。
接口规范和接入成本
- 接口规范

屏蔽接口URI层级差异:
API平台,统一采用三级结构,通过/平台/服务/接口的层次来管理所有接入API,屏蔽实际接口URI的层级差异;
屏蔽接口响应结构差异:
API平台,自动转换接口响应结构,屏蔽实际接口的结构差异化。大大简化了集成开发,特别是Web前端同学适配后台接口的复杂度。
全局业务错误码:
确保服务间的每个错误码都是唯一能溯源的。
- 接入成本--零改造
API平台在设计之前就考虑到用户接入的成本。以上规范,API平台都能自动屏蔽差异,自动转换,自动生成。用户接入零改造。
注册API服务 — 示例
- 现成的API接口
现在我有一个容量的分析接口:查询模块容量持续高低负载数据接口。
url: http://capacity/load/sustained-load method: get 入参:type=1&m1id=468095&m2id=468095&m3id=468095&m4id=468095 出参: [ { "m1id": 1256, "m2id": 1256010, "day_cnt": 14, "m4id": 468095, "avg_load": 0.25, "type": 1, "model_cnt": 1, "m3id": 11120 } ]
- 创建接口对应的平台,服务
操作相似。如创建服务:
其中的英文缩写,将是最终API url中对应的服务名。

- 注册接口 - 基础信息

- 注册接口 - 定义请求示例
自动生成入出参:
在入参,出参示例部分,只须贴入:
入参:type=1&m1id=468095&m2id=468095&m3id=468095&m4id=468095, 出参: [ { "m1id": 1256, "m2id": 1256010, "day_cnt": 14, "m4id": 468095, "avg_load": 0.25, "type": 1, "model_cnt": 1, "m3id": 11120 } ]
API平台会自动帮我们解析结构(当前支持key/value, json结构等解析)
用户,只须录入字段是否必填,以及中文说明即可。


- 注册接口 - 定义接口返回码

接口开放
- 查看开放API接口
列表页:
在API平台注册接口后,可以在API平台列表中查询每个开放接口:

明细面:
在明细面,可以查看接口详情。以及自动生成的调用示例。



自动生成接口文档

- 访问权限申请
API平台的接口开放模式暂时有两种:全开放,须审核。
全开放:
用户须在API平台应用组进行登记注册,API平台会分配一个唯一的apikey给到用户。对于全开放的接口,用户访问时,只须header带上apikey即可。


须审核:
对于一些敏感数据接口,用户访问前,须进行权限申请,将请求所在的业务模块与当前接口进行绑定。API平台只允许目标业务模块下的IP访问目标接口。
场景一:接口开发-无中生有
应用前-出现的问题:
1.开发耦合:项目迭代刚启动,经常会出现后台开发间,前后端开发间接口相互依赖,导致工作相互delay。
2.相互“扯皮”:开发间当面对齐接口,经常出现今天说“一套”,实际输出“一套”。没有接口落地及佐证的地方。
应用后-规范的工作流程,实现了并行开发:
有了API平台,大家的工作流程规范是这样:
\1. 接口提供方,注册新接口到API平台;
\2. 提供方与接口使用方通过API平台对齐接口,达成两方最终接口;
\3. 使用方使用API平台提供的伪接口进行功能开发及联调;(不再阻塞)
\4. 接口提供方严格按最终接口参数实现真实接口。
\5. 接口提供方将测试接口录入API平台,模式从“伪接口”切换成“测试”,接口使用方可以“无感知”的切换成真实接口服务中去。不需要额外联调。

场景二:接口测试-可视化用例+自动测试
“ 写代码的时间都没有。哪来时间写用例。但每次修改代码,人工自测耗费很多时间。” 这种现象其实在开发中很普遍。
有没有一种模式,可以让开发不用写代码就能快速实现接口单元测试用例?甚至让不写代码的测试同学来帮开发实现测试用例?
API平台,提供了可视化用例在线编辑:用户只须录入预设值,即可生成用例。一键执行用例,查看测试结果。
API平台也实现了依赖第三方环境API的接口本地化测试。
关于API平台测试能力这一部分,后面我们再专门单独做介绍。
场景三:质量运营
- 安全认证
分配apikey: 所有API访问,须在API平台注册,由平台分配唯一的apikey。用户每次请求须带上apikey方可访问;
限制开放源:对于敏感API接口,接口使用方须在API平台登记请求来源业务模块,经审核后,方可访问。
- 过载保护
每个接口可以自定义访问频率。API平台可以对接口进行限频保护。
- 接口巡检
API平台可对线上服务接口进行自定义的主动探测与巡检。在用户察觉问题前发现问题与修复问题。
- 异常告警
若API服务出现异常,API平台会主动通知接口使用方与提供方。

- 异常告警案例
CMDB下发配置(16:30,17:30灰度),未切走流量,导致接口请求小部分异常。
告警短信:

查看API日志:
发现:后台spp服务异常

跟进原因:

- 调用链路分析
- 应用场景
应用前-问题场景:
A业务页面提示xx保存失败-->A业务开发卷入排查(重现问题+分析)-->发现是公共B服务异常--> B开发卷入相似分析--> 发现是平台服务C异常--> 卷入C开发相似分析--> 确认是redis服务异常。
这种问题,如果发生在客户环境,会有ABC三个开发同学要:申请登录客户环境(有时很繁琐很费时)--> 排查--> 内部反馈,流转问题单。有时排查分析时间还没有前后协调时间耗费得多。
应用后-链路分析场景:
API平台调用链路分析能力,方便不懂业务的运维同学,一键在线查看整个调用链,直达问题根节点:
1.获取异常请求ID:
前端页面或后台服务出现异常时,定位者可以从页面或日志中获取调用请求的ID,
2.还原问题现场:
根据请求ID,在API平台获取调用链,快速全方位的还原现场数据:链路中每个请求的入参,出参,耗时,返回码,异常日志等。
告别登机子查日志-重试重现问题-大量开发介入-问题修复效率低慢的问题。

- API调用链路分析
API平台根据起始请求,将接口间调用关系生成一棵调用树.我们可以一目了然的看到:
1.请求的调用链路;
2.每一层调用现场:服务调用方,服务提供方,接口返回码,耗时, 入参,出参, 异常日志(若有异常)
利用API平台的调用树能力,我们可以:
1、快速了解服务的调用关系,发现不合理调用;
2、帮助售后快速定位问题;减少开发介入频率;
3、现场复原:不须再重现;避免重现不了问题的定位
4、web可视化分析:减少上机子查日志的次数。提升定位效率。
- 案例一:发现不合理调用
(1)问题现场
devtest环境,执行工具市场工具异常.

(2)获取requestId
获取id, 输入查询


(3)重现调用树+问题现场



(4)发现原因/问题
结论一(问题原因):命令通道接口-判断设备连通性:发现设备不可通。


结论二:通过调用链,发现工具市场存在重复调用cmdb接口问题。工具市场下个迭代修复。

- 案例二:CMDB异常
(1)问题现场:执行工具市场时,只提示CMDB异常。但不知道原因。

(2)查看API平台调用树:不需求上机子查日志啦。可见原因是DB连接异常。


场景四:数据画像
API平台有实时日志查询、实时数据画像、性能分析等数据画像能力。这里,针对成功率,耗时做下介绍:
对于运营者来说,我们很关心线上接口的成功率,耗时,这样将直接影响服务质量,用户体验。
- 横向分析
查看接口成功率分布及趋势 & 查看接口耗时分布及趋势。
平均成功率,平均耗时,会在“平均数据”下掩盖了一些细微的问题。API平台画像,会采用分段模式,下钻一层看问题。


- 纵向分析
以“天+接口”纬度查看明细数据:


- 性能优化案例
刚接入API平台时,织云自动化服务,共有39个接口有调用记录。其中29个接口(66.7%)不达标(接口耗时超过500ms)。经开发性能后,慢接口大幅减少。


小结
织云API平台,是结合我们部门“接口开放”,“接口生产”需求、痛点和DevOps理念的一次新探索,新实践。在传统API网关的能力基础上,拓展到更多API周期阶段,实现API的DevOps赋能与管理。
以上是API平台简单的介绍和分享,抛砖引玉,希望大家都能打造好自己的微服务管理与开放平台。共勉!
· 分 · 割 · 线 · 啦 ·
织云企业版预约体验


问答
无法从API获取数据?
相关阅读
模型剖析 | 如何解决业务运维的四大难题?
混合云管理问题,你解决了么?
Pick一下,工具上线前运维必备原则
【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识
此文已由作者授权腾讯云+社区发布,更多原文请点击
搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!
海量技术实践经验,尽在云加社区!
8分钟丨教你玩转 API的更多相关文章
- 我这么玩Web Api(二):数据验证,全局数据验证与单元测试
目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试 一.模型状态 - ModelState 我理解 ...
- 30分钟手把手教你学webpack实战
30分钟手把手教你学webpack实战 阅读目录 一:什么是webpack? 他有什么优点? 二:如何安装和配置 三:理解webpack加载器 四:理解less-loader加载器的使用 五:理解ba ...
- 手把手教你玩转SOCKET模型之重叠I/O篇(下)
四. 实现重叠模型的步骤 作 了这么多的准备工作,费了这么多的笔墨,我们终于可以开始着手编码了.其实慢慢的你就会明白,要想透析重叠结构的内部原理也许是要费点功夫,但是只是学会 如何来使用它,却 ...
- 腾讯工程师教你玩转 RocksDB
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯云数据库内核团队 原文标题:[腾讯云CDB]教你玩转MyRocks/RocksDB-STATISTICS与后台线程篇 0. Intro ...
- 转:变手把手教你玩转SOCKET模型之重叠I/O篇
手把手教你玩转SOCKET模型之重叠I/O篇 “身为一个初学者,时常能体味到初学者入门的艰辛,所以总是想抽空作点什么来尽我所能的帮助那些需要帮助的人.我也希望大家能把自己的所学和他人一起分享,不要去鄙 ...
- 不止是联网!教你玩转PC自带Wi-Fi网卡
前言:Wi-Fi对于现在的智能手机来说已经是再熟悉不过的配置了,而主板自带Wi-Fi网卡的设计也越来越普及,但有些玩家可能思维还停留在“Wi-Fi网卡 = 连无线网络用的网卡,我用有线就不需要”的层次 ...
- 手把手教你玩转 CSS3 3D 技术
css3的3d起步 要玩转css3的3d,就必须了解几个词汇,便是透视(perspective).旋转(rotate)和移动(translate).透视即是以现实的视角来看屏幕上的2D事物,从而展现3 ...
- 手把手教你玩转CSS3 3D技术
手把手教你玩转 CSS3 3D 技术 要玩转css3的3d,就必须了解几个词汇,便是透视(perspective).旋转(rotate)和移动(translate).透视即是以现实的视角来看屏幕上 ...
- 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发
每天记录一点:NetCore获得配置文件 appsettings.json 用NetCore做项目如果用EF ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...
随机推荐
- 使用VSTS进行单元测试练习
本次作业要求:练习教科书第22~25页单元测试练习,要求自行安装Visual Studio开发平台,版本至少在2010以上,要求把程序安装过程和练习过程写到博客上,越详细越好,要图文并茂,没有书的同学 ...
- 自适应XAML布局经验总结 (四)区域布局设计模式
本系列对实际项目中的XAML布局场景进行总结,给出了较优化的自适应布局解决方案,希望对大家有所帮助. 下面介绍区域布局设计模式. 7. 头尾模式 页面有时分为顶部栏,中间内容和底部栏三部分.这时可以使 ...
- 解决微服务网关Ocelot使用AddStoreOcelotConfigurationInConsul后请求404问题
一个小插曲,最近研究 netcore 微服务网关,在使用AddStoreOcelotConfigurationInConsul将配置存到consul后,任何经过网关的请求都出现404,并且没有任何有用 ...
- 【mysql】使用Navicat连接数据库
1 连接数据库 点击左下角测试一下 提示 输入 select host,user,plugin,authentication_string from mysql.user; 查看用户信息 注意这里我们 ...
- “全栈2019”Java多线程第二十章:同步方法产生死锁的例子
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Django 定时任务实现(django-crontab+command)
一.编写自定义django-admin命令 注:利用django-admin自定义命令我们可以ORM框架对model进行操作,如:定时更新数据库,检测数据库状态..... Django为项目中每一个应 ...
- Plugin 'FEDERATED' is disabled. /usr/sbin/mysqld: Table 'mysql.plugin' doesn't exist
问题:在linux上安装mysql的时候出现Plugin ‘FEDERATED’ is disabled. /usr/sbin/mysqld: Table ‘mysql.plugin’ doesn’t ...
- 小型Http服务器
HTTP又叫做超文本传输协议,现如今用的最多的版本是1.1版本.HTTP有如下的特点: 支持客户/服务器模式(C/S或B/S) 简单快速:基于请求和响应,请求只需传送请求方法和请求路径 灵活:HTTP ...
- Flask从入门到精通之Flask表单
Flask请求对象包含客户端发出的所有请求信息.其中,request.form 能获取POST 请求中提交的表单数据.尽管Flask 的请求对象提供的信息足够用于处理Web 表单,但有些任务很单调,而 ...
- 配置阿里云ESC服务器部署项目
第一次SSH登录 ECS 服务器: 打开命令行终端(git),键入: > ssh root@39.108.54.110 输入实例密码,进入服务器环境. 配置 root 及应用账号权限 新增管理员 ...