SaaS架构:开放平台架构设计
大家好,我是汤师爷~
今天聊聊开放平台架构设计。
为什么需要搭建开放平台
增强产品能力
开放平台能够让三方开发者和合作伙伴开发新的应用或服务,增加原有SaaS产品能力。这样就可以满足更多用户需求,从而提高用户的满意度和黏性。
促进创新
三方开发者能够在SaaS标准产品的基础上,创造新的解决方案,为平台带来创新的业务模式,这些可能为SaaS企业带来更多的盈利机会。
构建生态系统
开放平台能够建立一个以SaaS标准产品为中心的生态系统,吸引开发者、合作伙伴和其他相关方参加,共同构建一个互惠互利的生态圈。
降低开发和运营成本
通过邀请三方开发者来创造和扩展产品能力,他们可以有效分担SaaS企业的开发、运营成本,更聚焦于核心产品的优化和创新。
开放平台的服务对象是谁?
SaaS企业的开放平台通常包括以下关键用户角色:
第三方开发者
他们期望能快速入驻开放平台,并构建应用,通过用户订购应用获取收益。因此,他们需要API文档、SDK工具和开发者后台,帮助开发者构建、测试和部署应用,并且利用平台资源推广自己的应用。
定制客户
定制客户一般为拥有自研能力的企业客户,有定制化功能需求,例如与内部系统(如ERP、CRM)进行打通,实现企业自身的业务流程。
平台运营人员
平台运营人员需要为三方开放者和企业客户服务,帮助他们解决问题,因此,需要客户管理,应用申请流程管理、服务配置、参数配置、角色分配、财务对账管理等产品能力。
开放平台的运营流程
SaaS开放平台的运营流程涉及平台的管理和维护,为企业客户、三方开发者提供服务,包括吸引与管理三方开发者,提供必要的开发工具和支持,对开发者创建的应用进行审核和上线管理,通过数据监控和分析评估平台的健康度和用户活跃度,确保提供有效的服务支持,和维护平台的安全和合规性。
下图展示了开放平台的整体运营流程,实际的开放平台项目可以基于该流程做变更。
开放平台整体架构设计
管理后台
层针对不同角色,提供不同的管理后台:
- 开发者后台:为三方开发者提供的工作台,包括应用管理、API接入、开发工具、数据分析和测试工具等。
- 平台运营后台:用于平台运营团队管理整个系统的工作台,包括客户管理、权限控制、计费管理、系统监控等功能。
- 商家后台:SaaS企业客户的后台系统,主要用于订购应用市场的三方应用,授权应用,并使用其提供的服务能力。
服务层
服务层为上层的管理后台提供核心服务能力:
- 开发者接入:提供API文档、SDK工具、开发指南,应用的注册、管理等。
- 运营管理:包括平台用户信息管理、权限设置、用户资料管理。对开发者提交的应用进行审核,确保应用的质量和安全性。管理平台计费、结算,收集和分析平台的运营数据。
- 监控中心:包括服务器、应用、网络、数据库、安全、中间件和存储监控。这些功能确保开放平台的稳定性、性能和安全,通过实时监控、告警支持技术团队进行有效管理和维护。
API网关
API网关是整个开放平台的流量入口,它提供的能力确保了平台操作的安全、稳定和高效管理。
业务开放能力
业务开放能力由各个业务域系统提供,这些开放能力提供了核心业务数据/功能的交互能力。
开放能力设计
开放能力可以分为以下几种类型:
- 前端扩展:开发者可创建个性化的前端H5/小程序页面,满足企业客户不同场景不同行业的需求。
- API 接口/消息推送:API接口允许开发者通过定义的接口与平台系统交互,实现数据和功能的集成,例如商品创建接口。消息推送是指平台系统主动通知三方系统,如订单状态变更通知。
- 后端扩展:开发者可以通过扩展点,自由嵌入自定义流程节点,构建个性化的业务逻辑。
- 数据模型扩展:允许将三方系统的数据模型整合到平台系统中,在平台系统中可以查看或处理三方数据。
以商品系统为例,列出不同类型开放能力的使用场景:
- 前端扩展:页面串联、定制商详组件、定制商品详情、定制B端管理页面。
- API 接口/消息推送:商品发布接口、同步分店接口、查询商品详情接口、商品价格修改接口、商品修改接口、商品属性接口、商品上下架接口、商品类目接口、商品创建消息、商品变更消息。
- 后端扩展:商品校验类扩展点(例如,商品创建时,校验商品编码是否符合定制需求的规范)、商品的定制信息计算扩展点(例如,通过外部接口计算出商品重量信息)。
- 数据模型扩展:商品模型扩展并存储个性化的字段信息。
开放API设计原则
RESTful风格API
RESTful API 是一种遵循 REST 原则的 API 设计方式。REST 是一组约束条件和原则,由 Roy Fielding 在 2000 年的博士论文中提出。
RESTful API 的设计依赖于网络协议,主要是 HTTP,并且它使用 HTTP 的原生功能(比如 HTTP 的动词和状态码)来执行操作。以下是 RESTful API 的一些主要特点:
- 面向资源:在REST架构中,所有内容都被视为"资源",每个"资源"都有一个独特的URI(统一资源标识符)。
- 无状态:RESTful API不保存状态,这意味着每个请求都应包含执行请求所需的信息。服务器不会保存客户端的任何信息。
- 统一接口:RESTful API应该有一个统一的接口,客户端和服务器基于接口交互,实现解耦。交互通常通过HTTP动词实现,如GET(获取资源)、POST(创建资源)、PUT(更新资源)、DELETE(删除资源)。
RESTful API的三个显著优势如下:
- 它建立在HTTP协议上,协议简洁易用,得到了广泛的应用。
- 接口设计以资源为中心,让接口易于理解和使用,比较直观。
- 数据交换采用XML或JSON格式,大大简化了数据的处理和传输过程。
但严格遵循 RESTful API风格,也有一些缺陷:
HTTP协议的动词受限
当业务需求变得复杂时,仅依赖于HTTP的动词方法来对资源操作,可能不足以满足需求,这时往往需要通过接口名称来进一步区分。此外,一些特定的HTTP请求,如PUT和DELETE,可能会在网络传输过程中被某些防火墙设备拦截。
URL包含参数,可读性差
在URL中嵌入参数占位符(例如:GET /Api/Orders/{id}/OrderItems/{id})会降低其可读性。如果需要基于URL统计接口的调用次数,需要对具有相同URL的不同参数进行额外的处理。
HTTP状态码的表达性差
使用如20X、30X、4XX、5XX等标准的HTTP状态码,不足以描述复杂的业务场景的状态。
建议接口设计遵循以下准则:
- 限制HTTP方法的使用,仅采用GET和POST。
- 避免在URL中包含参数占位符,尽量使用URL的参数传参。
- 使用自定义的业务状态码来提供更丰富的响应信息。
API分组原则
根据业务领域,对开放API进行分组。例如店铺API、商品API、库存API、订单API、物流API、客户API、营销API。
SaaS标准产品一般都基于DDD进行架构设计,根据业务领域组织开放API,是普遍采用的最佳实践。当需要改进或变更某个特定业务领域的功能时,开发人员可以直接找到相关的API组进行修改,不会影响到其他领域的API。
对于三方开发人员,可以更容易地找到与某个业务功能相关的API,因为它们通过业务域的划分逻辑组织在一起。
版本管理
为了统一和清晰地标识不同版本的相同接口,建议将版本号放置在接口路径的末尾,示例如下:
返回数据
每个接口的响应数据,应遵循统一的JSON或XML格式规范,并且至少应包含以下关键字段:
- 状态码 (code):表示请求的总体结果,通常用于标识操作的成功或异常状态。
- 消息 (msg):提供关于状态码的详细描述,以帮助理解请求的具体结果。
- 数据 (data):包含与请求相关的具体业务信息和数据。
{
"code":200,
"msg":"OK",
"data":{
"item_id":"123456",
"product_name":"奶油蛋糕"
}
}
安全措施
接口签名
为开发者分配AccessKey(开发者标识,确保唯一)和SecretKey(用于接口加密,确保不易被穷举,生成算法不易被猜测)。
按照请求参数名的字母升序排列非空请求参数(包含AccessKey),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串A。
在字符串A最后拼接上Secretkey得到字符串B。
对字符串B进行MD5运算,得到Sign值。请求时,携带参数AccessKey和Sign,只有拥有合法的身份AccessKey和正确的签名Sign才能放行。这样就解决了身份验证和参数篡改问题,即使请求参数被劫持,由于获取不到SecretKey(仅作本地加密使用,不参与网络传输),也无法伪造合法的请求。
数据加密
敏感数据,如用户信息,应使用加密算法进行保护,常用的加密方法包括RSA和AES。
访问控制
在接口访问的API网关,应设置访问控制,仅允许来自被商家授权的白名单的请求。商家可以通过商家后台系统自主管理其白名单。
消息推送
消息推送是平台主动通知三方系统,提供数据更新的一种机制,满足三方系统对信息实时性的需求。例如,当商家成功创建订单后,三方系统可以通过订单查询接口来获取订单的当前状态。
三方系统若想实时获取订单状态,可以选择定时查询接口,但这样效率低并消耗大量资源。通过系统主动推送订单状态信息,可以有效地解决这一问题。但消息推送也带来了一些挑战:
- 顺序性问题:订单可能经历多个状态,且这些状态在业务上有特定顺序。网络延迟可能导致状态送达三方系统时,顺序错乱,这时三方系统需要通过校验订单状态,判断变更是否符合业务逻辑,来确保订单状态的准确性。
- 消息丢失风险:目前系统通常采用消息队列异步发送消息推送,尽管有消息中间件的机制确保消息的可靠性,但三方系统出现网络问题,仍有可能导致推送失败。解决方案:三方系统可以定期全量查询订单状态,对双边的订单状态进行对账处理,确保数据的完整性。
本文已收录于,我的技术网站:tangshiye.cn 里面有,算法Leetcode详解,面试八股文、BAT面试真题、简历模版、架构设计,等经验分享。
SaaS架构:开放平台架构设计的更多相关文章
- OpenApi开放平台架构实践
背景 随着业务的发展,越来越多不同系统之间需要数据往来,我们和外部系统之间产生了数据接口的对接.当然,有我们提供给外部系统(工具)的,也有我们调用第三方的.而这里重点讲一下我们对外的接口. 目前,我们 ...
- API开放平台接口设计-------令牌方式
1.需求:现在A公司与B公司进行合作,B公司需要调用A公司开放的外网接口获取数据,如何保证外网开放接口的安全性? 2,使用令牌方式 比如支付宝对外提供支付的接口,爱乐生公司需要调用支付宝的接口.在爱乐 ...
- API开放平台接口设计-------基于OAuth2.0协议方式
1,简介OAuth http://www.ruanyifeng.com/blog/2019/04/oauth_design.html OAuth 是什么? http://www.ruanyifeng. ...
- 朱晔的互联网架构实践心得S2E7:漫谈平台架构的工作(基础架构、基础服务、基础平台、基础中间件等等)
前言 程序开发毕竟还不是搬砖这种无脑体力劳动,需要事先有标准,有架构,有设计,绝对不是新公司今天创立,明天就可以开始编码的.其实很多公司在起步的时候没有财力和资源建设独立的基础架构或平台架构部门,甚至 ...
- Spring Cloud 微服务开放平台接口
github源码地址:https://github.com/spring-cloud/spring-cloud-security 前言: 什么是开放平台接口 场景 : 总公司与子公司 对接接口 还有 ...
- 【原创】基于Docker的CaaS容器云平台架构设计及市场分析
基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...
- 乐视开放平台技术架构-servlet和spring mvc篇
在乐视风口浪尖的时候,敢于站出来说我是乐视的而不怕被打脸的,也就是我了.就算我以后不在乐视了,提起来在乐视工作过,我也还是挺骄傲的.因为这是一个有理想,敢拼敢干的公司.想起复仇者联盟里Fury指挥官的 ...
- Java开源生鲜电商平台-优惠券设计与架构(源码可下载)
Java开源生鲜电商平台-优惠券设计与架构(源码可下载) 说明:现在电商白热化的程度,无论是生鲜电商还是其他的电商等等,都会有促销的这个体系,目的就是增加订单量与知名度等等 那么对于Java开源生鲜电 ...
- 三:基于Storm的实时处理大数据的平台架构设计
一:元数据管理器==>元数据管理器是系统平台的“大脑”,在任务调度中有着重要的作用[1]什么是元数据?--->中介数据,用于描述数据属性的数据.--->具体类型:描述数据结构,数据的 ...
- 人工智能-智能创意平台架构成长之路(四)-丰富多彩的banner图生成解密第一部分(对标阿里鹿班的设计)
我们之前讲了很多都是平台架构的主体设计,应用架构设计以及技术架构的设计,那么现在我们就来分享一下丰富多彩的banner图是怎么生成出来的. banner图的生成我们也是不断的进行迭代和优化,这块是最核 ...
随机推荐
- 【Docker】03 基础操作
[Docker 本体操作相关] 检查Docker版本: docker -v 检查Docker当前状态: systemctl status docker 停止Docker与开启Docker system ...
- 在进行神经网络训练时需要使用的显存空间大小的预估——300MB的神经网络在训练时最少需要占用多大的显存空间
以Tensorflow为例. ======================================= 神经网络(TensorFlow举例)在GPU中训练时需要占用的内存大概有下面几部分组成: ...
- nvme硬盘的断电保护是否有用,是噱头、智商税还是真的有需要?购买DOCKCASE智能M2固态硬盘盒10秒保护
最近在某东上买了一个10秒断电保护的nvme硬盘,其实对于这个断电保护有用没有用我是不懂的,也是不care的,买这个硬盘盒主要就是为了这个屏幕去的,不过东西到手后我就开始思考这个断电保护到底有用没有用 ...
- 【安装部署】Apache SeaTunnel 和 Web快速安装详解
版本说明 由于作者目前接触当前最新版本为2.3.4 但是官方提供的web版本未1.0.0,不兼容2.3.4,因此这里仍然使用2.3.3版本. 可以自定义兼容处理,官方提供了文档:https://mp. ...
- 处理一直显示npm WARN using –force Recommended protections disabled.的问题
使用 npm config set force false 可以消除.
- Java 读取命令行输入
在 Java 中,您可以使用 Scanner 类从命令行读取输入.这个类属于 java.util 包,因此在使用之前您需要导入该包. 下面是一个如何从命令行读取输入的 Java 程序示例: impor ...
- SpringBoot 引入 WebSocket
maven 添加websocket ,按照一篇博文引入 websocket https://www.cnblogs.com/likun10579/p/5450209.html 在浏览器控制台测试是否连 ...
- (八)Redis 主从复制、切片集群
一.主从复制 1.主从关系 都说的 Redis 具有高可靠性,这里有两层含义:一是数据尽量少丢失,二是服务尽量少中断.AOF 和 RDB 保证了前者,而对于后者,Redis 的做法就是将一份数据同时保 ...
- C++: 如何高效地往unordered_map中插入key-value
C++: unordered_map 花式插入key-value的5种方式 前言 无意中发现std::unordered_map.std::map等插入key-value对在C++17后竟有了 ins ...
- ASP.NET Core Library – Excel 读写
前言 以前写过 EPPlus 的笔记, 但后来 EPPlus 开始收费了.... (这好像是 .NET 生态的宿命) 在找替代方案中看中了微软的 Open XML SDK. 但经过一番折腾, 它确实太 ...