# 微应用
微应用一种介于单体和微服务之间的架构方案,按照业务职能拆分实现的完整单一业务逻辑单元,相对于其他应用独立开发、编译、发布,可独立或集中部署运行,每个应用的代码量小、相互独立,易于维护、编译、部署,开发迭代周期短。
# 技术选型
在学习微应用前,我们首先回顾一下常见的软件架构方案,这样更加有利于我们在技术选型时作出更合适的选择。
# 单体架构
单体架构属比较初级,典型的三级架构,前端(Web/手机端)+中间业务逻辑层+数据库层。
在项目的初期,单体应用可以很好地运行。然而,随着需求的不断增加, 越来越多的人加入开发团队,代码库也在飞速地膨胀。慢慢地,单体应用变得越来越臃肿,可维护性、灵活性逐渐降低,维护成本越来越高。
开发过程中模块的边界模糊、 依赖关系不清晰、 代码质量参差不齐、 混乱地堆砌在一起,每次修改代码都心惊胆战, 甚至添加一个简单的功能, 或者修改一个Bug都会带来隐含的缺陷。
主要特征如下:
- 以单一软件包开发、部署、运行,包含前后端全部功能实现
- 可对外提供数据交互服务接口
- 任何代码修改都需要全局重新构建、发布和停机部署
- 任意部分功能的运行异常可能会导致整个业务应用不可用
# 微应用架构
通过调用一个或者多个服务,实现一组同类型的或紧密耦合的单一业务目标或业务场景的功能逻辑组合软件,提供带操作界面的软件客户端,可通过电脑、移动设备、大屏等各类终端设备实现人机交互。
主要特性如下:
- 每个应用都是完整的单一业务逻辑单元
- 耦合度底,各个应用通过接口或远程服务调用
- 责任清晰,把项目拆分成若干个子项目,不同的团队负责不同的子项目
- 部署方便,可以灵活的进行分布式部署或集中部署
- 扩展方便,增加功能时只需要再增加一个子应用,调用其他应用的接口即可。
- 相对于其它微应用独立开发、编译、发布、部署、运行
# 微服务架构
微服务架构主要是对中间层分解,将系统拆分成很多小应用(微服务),以服务方式实现的不带界面的软件包,具有部署独立、通信轻量的特点,支撑单一业务逻辑的功能实现,通常用于跨专业的数据交互或并发量大的业务逻辑功能实现。
然而,微服务技术方案具有较高的技术门槛,并且运营成本高,处理故障难度大。
主要特征如下:
- 轻量级通讯协议(REST或RPC)
- 不包含任何界面的业务逻辑实现服务软件包
- 采用内嵌中间件运行
- 相对于其它微服务独立开发、编译、发布、部署、运行
# Serverless架构
当我们还在容器的浪潮中前行时,已经有一些革命先驱悄然布局另外一个云计算战场:Serverless架构。它与传统架构的不同之处在于,完全由第三方管理,由事件触发,存在于无状态(Stateless)、暂存(可能只存在于一次调用的过程中)计算容器内,对于传统的IT应用系统,可以对其进行微服务化和架构改造,但是却很难在短期做到完全的ServerLess化,这里就不详述了。
# 架构特征对比
对比项 | 单体应用 | 微应用 | 微服务 |
---|---|---|---|
前端页面 | 包含 | 包含 | 不包含 |
划分粒度 | 粗 | 细 | 细 |
局部修改是否需要全局重新构建部署 | 需要 | 不需要 | 不需要 |
局部运行异常是否导致整个系统不可用 | 会 | 不会 | 不会 |
中间件 | 外置 | 内置 | 内置 |
是否可对外提供服务接口 | 是 | 是 | 是 |
# 应用结构
每个应用是一个app目录的子目录(或者指定的composer库),每个应用具有独立的路由、配置,以及MVC相关文件,这些应用可以公用框架核心以及扩展,而且可以支持composer应用加载。 分布式部署时,应用之间可以通过http接口或RPC通讯,通讯令牌由基座统一下发。
www WEB部署目录
├─app 应用目录
│ ├─app1 应用名
│ | ├─controller 控制器目录
│ | ├─installer 安装脚本目录(可选,安装卸载时调用)
│ | ├─facade 应用门面目录(可选,供其他应用调用)
│ | ├─middleware 中间件目录(可选)
│ | ├─model 模型目录
│ | ├─route 路由目录(可选)
│ | ├─service 服务目录
│ | ├─src 前端工程目录(可分离)
│ | ├─subscribe 事件订阅目录(可选)
│ | ├─view 视图目录
│ | ├─apidoc.json apidoc配置文件(可选)
│ | ├─apidoc.md apidoc描述文件(可选)
│ | ├─apidoc.php apidoc变量声明(可选)
│ | ├─app.json 应用描述文件(必须)
│ | ├─common.php 应用公共函数文件(可选)
│ | ├─middleward.php 应用中间件定义文件(可选)
│ | └─event.php 应用事件定义文件(可选)
│ │
│ ├─app2... 更多应用
# 应用规范
应用与应用之间优先采用事件通讯,分布式应用采用RPC或TCP通讯。应用与应用之间严禁相互引用类库
- 模型、服务与控制器文件都遵循文件命名规范
- 服务文件名统一以Service结尾,前缀与模型名保持一致,如User模型与UserService服务
- 控制器名和模型名保持一致,如User控制器与User模型一致(仅调用服务层故无需添加Controller后缀)
关于应用内层级调用
- 模型 主要实现模型关联及数据读写:仅调用模型
- 服务 主要实现业务逻辑及模型操作:仅调用自身关联模型或其他服务,禁止直接调用其他模型,如需读写其他模型请通过调用相应服务方法操作
- 控制器 主要实现权限接口和数据校验:仅调用相关服务,禁止直接调用模型或DAO类以及其他控制器
# 应用开发
StartCMS的应用定义关键在于应用目录下的app.json,每个应用目录下都需要一个应用描述文件app.json,不然系统无法识别安装该应用。
如果是分布式部署或PHP以外语言开发的应用。在基座app目录下创建一个同名应用目录并在目录中添加app.json,在配置文件中声明分布应用访问入口即可。
一个最小有效的应用描述文件如下
{
"icon": "", // 应用图标
"name": "", // 应用标识(英文,与目录同名)
"entry": "", // 应用入口(输出html的url地址)
"title": "", // 应用名称(中文,2-4个中文字符)
"summary": "", // 应用简介(一句话介绍应用功能)
"description": "", // 应用描述(富文本应用描述,支持MarkDown)
"version": "v1.0.0",// 版本号
"category": [], // 分类
"licence": "", // 协议
"author": "", // 作者
"dependencies": [], // 应用依赖(其他应用标识)
"startcms": { // 框架版本
"min-version": "v1.0.0", // 框架最低版本
"max-version": "v1.0.2" // 框架最高版本
}
}
一个完整的应用描述文件如下
{
"icon": "", // 应用icon
"name": "", // 应用标识(英文,与目录同名)
"entry": "", // 应用入口(输出html的url地址)
"dev_entry": "", // 应用调试入口(应用开启调试后生效)
"ssr": false, // ssr模式(后端渲染模式)
"debug": false, // 调试模式(可以在应用管理中动态设置)
"sandbox": true, // js沙箱隔离(禁用沙箱可能会导致一些不可预料的问题,通常情况不建议这样做。)
"scopecss": true, // css样式隔离(禁用样式隔离可以提升页面渲染速度,在此之前,请确保各应用之间样式不会相互污染。)
"title": "", // 应用名称(中文,2-4个中文字符)
"summary": "", // 应用简介(一句话介绍应用功能)
"description": "", // 应用描述(富文本应用描述,支持MarkDown)
"version": "v1.0.0",// 版本号
"category": [], // 分类
"licence": "", // 协议
"author": "", // 作者
"documentation": { // 手册
"user": "", // 使用者手册
"admin": "", // 管理者手册
"developer": "" // 开发者手册
},
"dependencies": [], // 应用依赖(其他应用标识)
"startcms": {
"min-version": "v1.0.0", // 框架最低版本
"max-version": "v1.0.2" // 框架最高版本
},
"auth": [ // 自定义权限节点
{
"app": "", // 应用标识(可选,默认当前应用)
"icon": "", // 菜单图标(可选)
"name": "core_account", // 权限标识(英文,小写字母开头+下划线)
"title": "账户管理", // 权限名称(中文,菜单/功能名称)
"parent": "core", // 上级节点
"node": "core/account", // 权限节点(后端路由)
"path": "/core/account", // 权限路径(前端路由)
"view": "", // 视图模板
"params": "", // 路由参数
"redirect": "", // 跳转地址
"menu": 1, // 是否为菜单
"auth": 1, // 是否权限控制
"admin": 0, // 是否仅限管理员访问
"super": 0, // 是否仅限超管员访问
"route": 0, // 是否仅作前端路由(有无权限都返回)
"status": 1, // 启用状态
"cache": 0, // 启用缓存
"sort": 7, // 排序
}
],
"config": [ // 应用可配置项目(具体参数可参考form-create表单项)
{
"group": "站点配置", // 配置分组
"title": "站点名称", // 配置名称
"type": "input", // 配置类型
"field": "title", // 字段名称(确保同一应用内唯一)
"value": "StartCMS", // 字段值
"options": [], // 配置选项
"validate": [], // 验证规则
"props": {}, // 配置属性
"default": "", // 默认值
"remark": "", // 备注
"locking": 1, // 是否锁定(禁止编辑更新)
"protected": 0 // 是否保护(前端无法获取)
}
]
}
# GO应用
编写中..
# PHP应用
编写中..
# Java应用
编写中..