您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

马蜂窝API 资源隔离系统设计与实现

时间:2019-09-02 16:32:40  来源:  作者:

Part 1 背景

大交通业务需要对接机票、火车票、租车、接送机等业务的外部供应链,供应商的数据接口大部分通过 HTTP、HTTPS 等协议进行通信。

为了保证开发进度并支持集成测试时进行多场景支持,我们往往需要对供应商接口进行 MOCK。之前我们在开发环境和测试环境对外部接口的调用没有统一管控,无法实现调用开关,也无法对调用量进行统计和限制。

为了解决这些问题,我们设计了接入 API 资源隔离系统 JARVIS(Join Api Resource Virtual Isolation System),希望它可以像钢铁侠中的 Jarvis 一样帮我们解决资源的管控问题。

Part 2 设计原则

  1. 图形化操作,提供管理后台,对开发和测试同学的交互要友好。
  2. 对业务无侵入,无需修改业务系统代码,保证测试的代码和发布的是一致的。
  3. 业务关联,这个系统是为业务服务的,需要提供必要的业务关联性。
  4. 支持丰富的匹配规则,可以用于绝大部分使用场景。
  5. 所配即所得,管理规则可以即时生效。
  6. 请求响应可追溯,提供详细的日志记录和查询功能。

Part 3 设计与实现

整体思路

供应商资源管控系统位于内部接入网关和外部供应商接口之间,在开发和测试环境对外部供应商资源提供了全局的代理,在系统中的位置如下:

马蜂窝API 资源隔离系统设计与实现

 

资源管控系统系统分两大部分:

  1. Config Center:主要实现业务线、环境、供应商、供应商 API 和 API 对应的 MOCK 规则的配置管理。
  2. API Server:主要负责请求的接受、MOCK 规则匹配、MOCK 规则的响应和日志记录。

关键功能

  • 采用配置中心和 API 服务器分离的结构,支持集群部署
  • 同时支持模拟响应和代理访问两种响应方式
  • 支持 Mock 规则修改后即时生效
  • 自动适应上游服务的环境隔离
  • 同一 API 在同一环境下支持多种场景,并且有优先级区分
  • Mock 规则会关联业务系统,如业务线、环境、供应商、供应商的 API 等
  • 会进行 Mock 请求调用次数的计数,并且支持超量熔断和超量报警
  • 支持 Mock 调用的日志记录和可视化查询。

规则配置与管理

主要包含业务线信息配置、环境配置、供应商配置、供应商所属 API 配置、Mock 规则配置。业务信息之间的关系如下 :

马蜂窝API 资源隔离系统设计与实现

 

1. 「业务线」指的是如国内机票、国际机票、火车票、租车、接送机等业务类型

2. 「环境」包含两层含义:

  • 一为部署环境,分为 dev 开发环境、qa 测试环境、sim 预发环境、prod 生产环境四种,可以理解为以下四个互相隔离的集群。
  • 二为在 qa 环境下为了区分多个项目进行了环境隔离,如开放平台代号为 kfpt,乘机人代号为 cjr。

3. 「供应商」是指业务接入的各种商家,商家可以归属到某条业务线

4. 「供应商」 API 是指供应商提供的一系列基于 HTTP 或 HTTPS 的接口

5.「 MOCK 规则」是指为了对供应商接口进行仿真或代理而配置的规则,用于后续的规则匹配和返回响应信息。MOCK 规则会归属某个供应商 API,同时归属于某个环境。

6.「 场景」是用来区分同一供应商 API 且在同一环境下面不同场景的区分,分为通用场景和具象场景两大类,在规则匹配时优先匹配具象场景,如果具象场景未匹配成功则进行通用场景匹配。

响应规则的匹配和响应过程

规则匹配和内容响应的流程如下:

马蜂窝API 资源隔离系统设计与实现

 

1. 规则加载和刷新,接收到内部系统的调用后,会判断当前的规则缓存是否为空,如果为空则会加载全部可用的 MOCK 规则加载到缓存中。

2. 环境隔离标识自适应, 内部的服务通常是采用环境隔离方式部署,环境隔离标识(envTag)会影响到规则的匹配。

3. 规则匹配 ,根据请求的 URL 对规则进行匹配,最终可能匹配多条规则。将匹配到的规则分为具象场景规则和通用场景规则两组。对具象场景的 MOCK 规则根据请求参数进行匹配,如果命中则返回。对通用场景的 MOCK 规则根据请求参数进行匹配,如果命中则返回。

4. 结果响应,如果没有匹配到 Mock 规则,直接返回默认的错误信息。如果匹配到 Mock 规则,先判断是 Mock 类型还是 Proxy 类型,对于 Mock 类型会按照规则的配置返回状态码和响应内容,如果是 Proxy 类型则先调用供应商的真实接口再将获取到的内容返回给调用方。对接口当日的调用次数进行显示,如果超过阈值则会触发报警并进行服务熔断。

主要 Feature

1. 多种匹配条件

支持根据 header、param、JsonPath、body 等多种方式进行参数提取和匹配。

2. Mock 规则热生效

Mock 规则新增或修改后会热生效,实现所配即所得。在消息新增和修改后会触发规则变更的切面,进而通过 RocketMQ 发送规则变更消息,消息以广播的形式进行发送,API Server 会监听该消息,收到后会触发规则的刷新。

3. 环境隔离支持

内部的网关服务通常是采用环境隔离方式部署,我们采用在 HttpHeader 中增加 envTag 属性来传递环境标识。会判断 envTag 是否为空,如果为空则不进行 URL 的重新组装,如果为空则会将上述 URL 中的 {env} 部分替换为实际对应的 envTag。

马蜂窝API 资源隔离系统设计与实现

 

环境隔离主要是分为两步来实现:

  • 在我们接入网关层面,通过 join-common 自动提取并传递来自上游的环境隔离标识 envTag,并将其写入到 HTTP Header 中。
  • 在 API Server 我们接收到请求后会判断请求是否携带 envTag 标识,如果携带会将 URL 中的 {env} 部分替换为实际对应的 envTag,最终匹配到环境对应的规则上面。如果没有携带 envTag 则会去匹配默认的环境规则。

4. 多场景支持

  • 每个规则对应一个环境和一个供应商接口,但是会分为请求成功、请求失败等场景
  • 多个人在同一个项目中进行开发和测试的时候会产生冲突

为应对这种问题,我们提出了「场景」的概念,分为通用场景和具象场景:

  • 通用场景故名思义就是用来应对正常的请求,一般会放开 Proxy 开关,直接请求到供应商的接口
  • 具象场景用于对应某个具体的 Case,比如北京飞上海 1 成人 1 儿童的查询,我们通过更加详细的参数进行匹配

在匹配层级上面优先匹配具象场景的规则,如果匹配失败才会继续匹配通用场景的规则。

5. 超限熔断与报警

根据在供应商 API 层面设置的请求上限进行校验,如果当日的请求超限,会进行规则的降级,并通过企业微信发送报警信息。

6. 报文自动加密与解密

有些供应商的报文传输是密文的形式,我们在 JARVIS 系统中根据对应的供应商在编辑时是明文,在保存的时候会根据协议加密为密文。

7. 请求日志记录与查询

对所有的请求都会记录请求报文、响应报文、命中规则等信息,由于报文体积较大且调用量较大,我们使用 ElasticSearch 进行存储。

Part 4 项目实战

目前已经在开发和测试环境代理了全部的供应商接口:

1. 国内开放平台开发支持

近期我们在国内机票开放平台,前期由我方提供标准接,口由供应商接口并没有完全实现,我们根据文档生成了全部的 Mock 数据并针对每个接口的各种场景定制了 Mock 规则,保障了项目的开发进度并且实现了多场景的覆盖。

2. 暑期压力测试支持

近期进行了暑运压力测试,测试时通过 Mock 功能隔离了对外部供应商的访问,并通过设置响应延迟时间模拟了供应商接口不同状况下的响应时间。

Part 5 后续路线图

后续主要计划在以下方向进行改进和优化:

  1. 供应商接口管理,实现接口 Schema 的定义与管理,并实现对请求参数和响应内容校验。
  2. 增加模版化响应,减少人工配置,提高使用效率。
  3. 完善统计系统,实现资源使用情况的可视化。
  4. 易用性优化,收集大家在使用过程中遇到的问题进行持续改进,做到可用、易用、好用。

转自:https://www.cnblogs.com/mfwtech/p/11445467.html



Tags:API   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Tags: API  点击:(6)  评论:(0)  加入收藏
最近一连串的 API 安全事件(Peloton、Experian、Clubhouse 等)无疑迫使许多安全和开发团队仔细检查他们的 API 安全状况,以确保它们不会成为下一个被攻击对象。创建面向外部受...【详细内容】
2021-09-01  Tags: API  点击:(59)  评论:(0)  加入收藏
一直在写东西,有时候会遇到这种需求,就是把图片上的文字拷贝到自己的文章中,所以写了这个小工具。 配合Snipaste使用天衣无缝,所有的东西都在剪切板里交换,即Snipaste截取的图片...【详细内容】
2021-08-30  Tags: API  点击:(67)  评论:(0)  加入收藏
过去几个月里,我一直在对付一个流行健身品牌的 API,最后发现自己陷入了一种卡夫卡式的噩梦。程序员都喜欢挑战,优秀的程序员一定要征服种种挑战。我一直觉得自己是一个非常优秀...【详细内容】
2021-07-22  Tags: API  点击:(100)  评论:(0)  加入收藏
作者 | edmz译者 | 王强策划 | 万佳多年来,我已经为很多 API 实现了客户端。为此,我整理了一份清单,列出了一些可以改善开发体验的小技巧。这些想法大都与 API 设计或架构无关...【详细内容】
2021-06-29  Tags: API  点击:(133)  评论:(0)  加入收藏
创建一个 API(应用程序接口),我们所要做的远远不止是让它能“正常工作”。如果你正在构建基于 C/S 模型的应用程序,那么你需要一个应用程序接口(API)。API 就是一种非常清晰而又明...【详细内容】
2021-06-16  Tags: API  点击:(148)  评论:(0)  加入收藏
FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。关键特性: 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 Star...【详细内容】
2021-05-10  Tags: API  点击:(383)  评论:(0)  加入收藏
今天又要给大家介绍一个 Spring Boot 中的组件 --HandlerMethodReturnValueHandler。在前面的文章中(如何优雅的实现 Spring Boot 接口参数加密解密?),松哥已经和大家介绍过如何...【详细内容】
2021-03-24  Tags: API  点击:(297)  评论:(0)  加入收藏
当一个 API 请求没能成功的时候,客户端最好能收到一个正确的 HTTP 错误状态,例如 409 或 500,这会是一个好的开始。不幸的是,尽管 400 Bad Request 可能就足够让我们知道错误出...【详细内容】
2021-02-03  Tags: API  点击:(212)  评论:(0)  加入收藏
前言什么是 API?什么是 SDK?两者之间有何关系?欢迎来到本次的每周一问系列。既然点进来了,相信你或多或少都听说过这两个名词了,因此,在为你解答之前,让我们先从一个例子出发。 假...【详细内容】
2020-12-22  Tags: API  点击:(136)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条