后台技术架构
更新时间:2024-02-28 16:18:46后台逻辑结构
iVX后台应用的逻辑结构如下图:
其中,线上版本使用goLang,私有部署源码版本,使用java spring boot框架。具体说明如下:
1、GoLang服务请求处理层
服务逻辑的最前端,负责接收服务请求,请求路由,证书生成等。在iVX中,这一层是由GO语言实现的程序(caddy,可以理解为一个轻量级的nginx)。
2、GoLang服务逻辑层
核心服务逻辑处理,进一步包含默认服务与自定义微服务。默认服务,即我们在编辑器“服务组件”中定义的业务逻辑,这一部分逻辑,目前是由JS定义,然后进一步编译为web assembly程序由GO语言运行。每一个服务,对应一个GO的协程(goroutine),在后台会自动完成服务并发处理,应用开发者只需要负责服务逻辑的定义,无需关心底层并发业务的处理。
3、自定义微服务
自定义微服务,支持用户使用其他后台语言(目前支持java、node js和python)定义一部分后台逻辑,然后在服务中通过RPC的方法调用。自定义微服务,需要先定义后台自定义组件,组件编译后,会以docker镜像的方式来运行。无论是默认服务或自定义微服务,都是“无状态”的服务,即本身不在服务器本地存储任何数据,所以“状态”数据,都是存储在后台资源层中(包括redis缓存,消息队列,mysql,es数据库,文件等)。这样的好处是服务逻辑层的部署可以做到完全“无服务器”(serverless),实现高性能的弹性扩展。
4、GoLang后台资源接口层
iVX提供了连接、操作各种常用后台资源的接口,并将这些接口封装为资源组件,包括各种数据库、缓存、消息队列组件等。在【2】服务逻辑层中,我们只需要直接调用组件的方法,就可以实现各种后台资源的操作。比如,我们在服务中调用了数据库的输出服务,此时,其实是调用了后台资源接口层提供的数据库输出接口,在这个接口中,iVX实现了数据库连接,SQL生成,返回结果处理步骤,所有这些逻辑,都是由后台资源接口层实现。后台资源接口层,是由GO语言实现的微服务集群,基于go micro微服务框架。
和服务逻辑层一样,后台资源接口层也是“无状态”服务,可实现“无服务器”部署。
5、后台资源层(通用)
后台资源层,是各种现有的后台资源,主要是各种类型的数据存储服务,包括数据库,缓存,消息队列,文件对象存储等等,【4】GoLang后台资源接口层和【8】java ivx系统类提供了这些资源的操作方法。
注意,在上图中,后台资源层使用了虚线表示,因为iVX本身并不提供这些资源,比如,iVX并不提供mysql数据库,mysql数据库,是一个现有的资源,iVX仅负责操作它。在公有云平台上,各种后台资源使用了aws亚马逊云的相关服务,所有资源都是配置好的,开发者无需管理;在私有部署时,这些资源需要开发者自行准备,可以在本地服务器上安装软件,也可以使用各种云平台提供的资源。iVX并不限制这些资源部署方法,只需要在私有部署的config文件中,指定相关资源的方法方法即可。
6、spring boot服务框架
iVX新版事件面板,支持java源码导出,导出之后的工程基于spring boot框架,包含完整的服务路由,API处理等基础逻辑,内部嵌套【7】用户自定义服务逻辑类与【8】iVX系统类。
7、服务逻辑类
用户在iVX中定义的服务逻辑,主要为事件面板中定义的服务逻辑,每个应用是一个类,每个服务对应应用类下的一个方法。一个项目可以包含多个应用类。
8、iVX系统类
主要包含各种系统组件的基础实现,比如变量,db,缓存,消息队列,加密等等,在【7】服务逻辑类中,会调用各种系统类方法。
公有云部署架构
iVX支持应用直接在公有云上发布并部署,使用公有云部署,用户无需关心后台资源的准备,可一键发布应用。同时,由于平台承担了大部分的固定资源费用,用户仅需按实际使用量付费,在相当一部分场景下,使用公有云部署,可以显著节省部署费用。
iVX的公有云使用了全套aws亚马逊云的服务,其应用服务的架构如下:
1、负载均衡
使用aws的elb(elastic load balancing), 是所有网络请求的入口,负载均衡负责把请求平均分配给第二层caddy集群中的节点。由于iVX需要提供自动证书生成服务,因此使用的是网络层的NLB类型负载均衡,更多的请求处理与路由逻辑,在第二层caddy集群中实现。elb本身是一个无服务器的服务,由aws负责资源的弹性伸缩。
2、caddy集群
Go语言程序(caddy),使用aws的弹性容器(fargate)部署,负责请求转发、证书生成、并发限制等基础网络请求功能。集群支持自动弹性伸缩。
3、应用打开集群
Go语言程序,使用aws弹性容器(fargate)部署,负责所有web应用打开时的逻辑,包括返回index文件,执行微信、钉钉等第三方jssdk的嵌入,以及初始化时oAuth第三方登录的逻辑。
4、服务处理集群
负责所有应用的后台服务逻辑处理,包含了用户定义的应用服务逻辑,以及iVX提供的后台资源操作接口。目前,用户定义的服务逻辑由JS编译成的web assembly程序,在Go环境中运行,iVX提供的后台资源接口是Go语言程序。两者都部署在服务处理集群中,目前为docker集群(fargate)+无服务器函数计算(lambda),正在逐步转为纯函数计算部署,以进一步提升并发性能。
5、日志服务
在服务处理集群中,根据应用配置记录日志,包括系统日志与自定义日志。在公有云上,日志是记录在aws的dynamoDB上,在编辑器的服务面板中,可以实时查看到。
共享资源
共享资源,是平台用户共享的资源,所有共享资源,都是纯无服务器,可快速弹性伸缩的资源,以保证足够的服务性能,用户和用户之前不相互影响。共享资源包含以下11 - 16号资源:
11、mysql数据库
使用aws可弹性伸缩mysql数据库aurora,aurora本身上并不是mysql,而是aws开发的兼容mysql接口的关系型数据库服务。其采用了数据与存储分离的架构,因此,支持计算实例的弹性伸缩。
12、缓存共享版
使用aws dynamoDB实现的缓存接口,iVX内部实现了后台使用dynamoDB的redis接口,用户在使用缓存组件时和使用redis无差别,但dynamoDB保证了大数据高并发的性能。如果对缓存需求量很大,考虑到费用优化,用户也可以选择购买专属资源,此时,缓存组件后台会使用原生的redis服务。
13、文件存储
系统文件以及用户上传的文件的存储,使用aws的s3对象存储服务。
14、cdn
文件访问自动配置了aws的cloudfront cdn服务,cdn服务会按实际流量进行计费。
15、快表
使用aws dynamoDB,与缓存组件不同,提供了原始的dynamoDB操作接口,主要用于高并发、大数据的快速访问。
16、socket连接
iVX实现的web socket通信服务,内部使用容器服务(fargate)与redis实现。
用户专属资源(暂时未上线)
用户专属资源,是每个用户在自己账号下专门购买的资源,这些资源只有自己账号下的应用可以使用。同一类资源可以购买多个,可以根据业务需要在每个应用中进行配置。专属资源,主要包括一些不可弹性伸缩,或弹性伸缩成本比较高的资源,以及需要针对每个场景单独配置的资源。包含编号21-25的资源。(用户专属资源的操作界面正在开发中,暂时还未上线)
21、自定义sdk
用户可自行上传后台代码或sdk,支持nodeJS、java、python等常用后台语言,与主服务通过RPC协议通信。每一种运行时,需要对应一个docker镜像,iVX会自动将docker镜像部署在aws的函数计算服务中,函数计算,会根据实际服务调用来计费。
22、ES数据库
elastic search数据库,用于全文搜索,由于每个ES数据库实例,需要支持独立的自定义词典,索引重建等服务,无法资源共享,因此iVX会为每个用户创建一个es实例,考虑到实例成本,将使用独立ARM云服务器(ec2)来搭建。
23、mongo数据库
mongoDB,经典的no sql数据库,4.4版本之后,基本功能与mysql类数据类似,但支持在运行时动态添加字段。私有部署时,可部署于mongo集群上。
24、大数据分析
click house数据分析组件,是专门用于大数据分析统计的数据库,支持动态设置统计规则,将自动从流水表中计算出统计数据表。
公有云部署资源列表
由于部分客户需要提供后台部署资源说明,因此我们在这里针对大多数应用的情况,给出一个列表。
注意,iVX公有云上,大多数资源使用无服务器(serverless)部署,以最大程度提高服务伸缩性能,而非单机部署,因此并不存在“操作系统”,“杀毒软件”等概念。
产品类型 | 作用 | 型号 |
---|---|---|
aws elb负载均衡 | 应用前端负载均衡 | ivx使用NLB类型的复杂均衡,以在caddy集群中自动生成https证书 |
aws fargate 容器集群 | aws自研的无服务器容器集群,类似阿里云/腾讯云的serverless k8s集群,支持pod为单位的弹性伸缩。进一步包括以下集群: — caddy,轻量级高性能的web server,功能类似nginx,apache; —应用打开集群:负责生成应用index,完成初始化授权(比如微信授权)等服务; —后台服务集群:服务运算主入口,负责处理服务逻辑,数据库连接等; —socket集群:提供web socket长连服务; —cron集群:定时服务管理和发起 |
单容器型号为2核4G(普通),与4核8G(服务运行);容器数量根据负载自动伸缩。 |
aws lambda 函数计算 | 针对一些重量型计算,可能在fargate中调用纯serverless的函数计算lambda,其并发性支持更好,几乎无需考虑运算瓶颈。 | 单次运算内存最大10G |
aws aurora 数据库 | aws自研的关系型数据库,aurora serveless是一种存储与计算分离的关系型数据,目前ivx使用的版本是mysql 5.7.2兼容版本。 | 4 - 64 ACU,根据访问量自动伸缩; 开发环境(预览)与生产环境(发布)使用两套独立的实例 |
aws elastiCache缓存服务 | aws整合的redis数据库 | large版本的多实例部署 |
aws dynamo数据库 | aws自研的无服务器可伸缩no sql数据库,用于大数据收集和运算,为快表组件的后台数据库。 | 按需使用,无实例概念 |
time stream 数据库 | 时间序列数据库,用于日志收集 | 单位实例4核8G,可伸缩 |
接入外部系统与开发资源
更新时间:2021-12-22 19:33:58ivx的开发系统,无论是前端还是后台,都支持接入外部系统与代码,以利用第三方资源对ivx的项目开发进行拓展。
后台拓展
后台的拓展主要包含引入外部代码与接入外部资源,主要接入方法如上图所示:
1、自定义函数
后台支持使用自定义函数,可以直接执行js代码。首先,在对象树中添加自定义函数组件,定义函数:
然后,在服务中调用函数即可:
2、自定义sdk
针对更复杂的js代码,或其他类型的后台代码,可以使用自定义sdk的方法,目前ivx支持node js和java的sdk。
要使用自定义sdk,首先需要创建docker镜像,然后上传代码。以下是java和js的示例代码:
然后,在对象树中,即可引用到相应的sdk包:
使用方法和自定义函数类似,可以直接在服务中调用sdk中的相关方法。
3、api与公开服务
通过http接口,ivx的后台可以和第三方服务相互调用。
首先,通过后台api组件,可以在服务中调用第三方的api:
然后,每一个服务,也可以设置为公开服务:
设为公开服务之后,就可以直接在使用http请求调用该服务了。
4、DBO自定义数据库
除了第三方服务,ivx中还可以直接调用第三方的数据库,通过DBO组件,可以直接连接到一个第三方的数据库,目前支持mysql、postresql,sql server和oracle这些常见的关系型数据库。
然后通过sql query来操作:
详见 DBO组件文档,注意,由于DBO组件的连接请求是通过ivx的后台服务器发起的,因此,要在ivx编辑器中调试DBO组件,目标数据库需要可以通过互联网访问,并开通ivx服务器的ip白名单。