如何快速开发一个可分发的应用系统?
“开发一个可分发的应用系统”是个涉及面相当广的题目,首先,它涉及到业务层面的商业目标、需求和推广路径等等,其次涉及到技术层面的技术选型目标、战略、规划以及开发项目的管理和执行,讨论的篇幅将会十分庞大。
因而,本文不做宏观全面的讨论,本文将会从技术开发层面出发,讨论采用主流的企业应用开发语言 Java 语言及其相关生态和工具,要“快速开发一个可分发的应用系统”会需要哪些基础和通用的技术功能点与难点。
更进一步地,本文会给出一个示例——基于 “星河低代码平台” 如何 在几分钟之内 快速地建立具备这些基础和通用的功能点的应用系统(查看参考《保姆级视频教程》)。
这种快速开发模式,对于开发者而言有重大意义。
一方面,这些基础和通用的技术点,涉及的技术实现比较生僻,研发掌握其中的技术经验需要较大的时间、精力和成本投入。
另一方面,这种投入通常都是一次性的,即在应用系统研发的初期就需要实现这些基础技术点,但是之后的很长的应用系统生命周期中,却通常很少产生变化。
总结一下,便是这些基础技术点的研发难度高,并对系统架构有重大影响,但是比较通用,通常相当于只需要一次性投入,因此,采用成熟、可靠和标准产品来实现,是一种“效费比”极高的投入,这能帮助开发者将主要精力放在业务需求上,极大加快应用项目的进展,并降低项目的技术风险。
核心需求
在展开具体讨论之前,需要先定义一下什么是 “可分发的应用系统”。
“可分发的应用系统” 可以被定义为一种具备以下特点的应用系统:
部署简便性 | 具有独立的安装包,可以方便地在目标环境中进行安装和配置,无论是物理服务器、虚拟机还是云平台。 |
独立性与完整性 | 安装包包含了自身运行所需的所有组件和配置,能够独立运行。 |
跨平台兼容性 | 能够在多种操作系统和硬件架构上正常运行,不受特定平台的限制。基于 Java 构建的系统天然地就满足这一点。 |
良好的封装性与可集成性 | 内部的实现细节对用户和部署者是隐藏的,只通过清晰定义的接口与外部进行交互,并且可以通过接口与其它系统集成。 |
配置灵活性 | 有独立的、易于管理的配置文件,允许用户根据不同的需求和环境对系统的参数进行灵活配置。 |
可维护性 | 具备良好的程序结构和运行记录与故障记录,以及可以运行时进行动态调整配置的机制,便于在正式的部署运行中可以跟踪监控系统的状态,调整程序参数,及时发现和排除故障。 |
安全机制 | 能够保护系统被正确地不受破坏地使用,以及只能由经过认证的用户在授权的功能操作范围之内访问, |
许可管理 | 能够保护付费的商业软件只能安装到得到许可的目标环境中,并且只能够在许可的用户数或其它资源限制之内使用。 |
以上的几点是大多数的场景里都必须的通用要求,不同场景下或许还会有更多延伸的要求。接下来,我们将以这些通用要求视作需求来分解对应到一组技术功能点,以便讨论实现这些要求所需要的通用技术框架。
如何实现
在企业级应用实现技术栈中,基于 Java 的技术栈是最成熟、最强大、开发者群体最大和技术生态最丰富完善的,我们选择以 Java 技术栈实现作为背景来逐项拆解上一节提出的 8 点通用要求,形成一组基本的技术功能清单,以此来窥探从零开始开发一个可分发的应用系统的复杂程度。
部署简便性
实现使 Java 项目“易于部署”的常见技术方案是为应用 创建独立的安装包,这不是唯一方案,但这是技术最简单和维护管理成本最低的方案。
然而,Java 应用项目利用 IDE 开发和编译并不能直接到一个可独立部署的安装包,只能得到本项目单一的 JAR 文件,不包含依赖的其它代码或资源、配置等,也没有启动入口程序,无法直接进行分发部署的。开发者还需要自己去设计和实现如何创建独立安装包,以下是涉及的一些常规的技术点:
创建独立的安装包
设计安装包的目录结构
这属于系统的基础架构层面,会影响到系统的启动引导、配置加载等其它基础功能,需要严谨和有经验的设计。
开发系统启动引导程序
开发具有跨平台兼容性的系统启动引导程序,需要根据目录结构加载安装包的代码和其它资源配置。
建立自动化的构建系统
自动化的构建系统能够将项目中的代码打包组织起来,并根据管理的项目中的依赖关系,自动将直接和间接依赖的内部代码、资源、配置以及第三方的代码库都组织起来,按照设计的目录结构创建出独立的安装包。
独立性与完整性
要实现 “独立性与完整性”,最基础的要求是对应用项目中的代码库的依赖关系建立 “完善的依赖管理机制” , 这是一项基础性的技术功能要求,因为只有根据建立代码库的依赖关系,才能确保在创建独立安装包时,包含进来所有需要的代码库。
Java 应用开发中,如果采用 Maven 来管理应用代码项目的话,就已经具备基本的依赖管理能力了,能够满足开发一般复杂度应用的需要。
如果要开发更复杂的企业级大型应用,出于大型团队协作、架构约束或其它特定场景的要求等目的,还会需要建立特定的依赖规则、代码自动生成、自动测试、条件编译和打包等,这时就需要额外的插件或者第三方工具开发来自定义实现这些需求。
总结起来,包含以下几项技术点:
- 完善的依赖管理机制
- 开发阶段自动依赖导入
- 开发阶段自动代码生成
- 构建安装包时依赖按条件规则导出
跨平台兼容性
由于 JVM 具有跨平台兼容性,所以基于 Java 构建的系统天然地就满足这一点,这是选型 Java 技术栈来开发企业应用系统的一大优点。
对于基于 Java 的企业应用开发而言,对于实现“跨平台兼容性”的挑战在于以下几个方面:
- 独立安装包的安装、运行
- 接口协议和数据格式的跨平台兼容性
- 配置管理的跨平台兼容性
良好的封装性与可集成性
“封装”的概念,在面向对象编程的范畴里是指一种将接口的实现细节包装隐藏起来的编程方法;而在系统架构层面,是指将系统功能的实现被包装隐藏在系统内部的代码模块中,对外仅暴露接口供调用或其它系统集成。
具体到技术实现上,涉及到接口协议、接口通讯服务、接口规格描述等方面的技术点,以目前主流的企业级技术实现路径,除非有特殊要求,一般都采用基于 HTTP 协议的接口,如最常见的 HTTP Restful 接口,这一技术方案具有最广泛的跨平台兼容性。这属于架构的范畴,核心是 “如何进行接口实现与接口描述”,进一步可以分解成以下几个技术点:
- 接口实现与接口描述
集成Web容器
在 Java 技术栈常见的 Web 容器实现是 Tomcat ,对于应用而言,要兼顾实现独立的安装包时,需要考虑的是如何将 Tomcat 集成到安装包中实现整体部署、配置、维护与日志管理。
Web服务开发框架
这是面向开发者的,用于在开发中更好地开发 HTTP 服务的实现组件,并将其托管到 Web 服务容器中。对于 Java 技术栈而言,最主流的便是 Spring 框架,可以满足从简单到最复杂的企业应用需要。但是,这并不意味着开发中没有额外的技术投入,对于一些复杂的场景,比如实现接口管理、安全机制、许可管理等,仍然需要深入地了解 Spring 框架的机制,以及进行定制化的扩展。
自动生成HTTP接口描述
接口描述是对接口规格参数的详细表述,需要真实准确的反映系统运行中实际开放的接口规格参数,因此能够自动化地根据代码来生成接口描述,对于复杂的系统而言,是确保系统具备可靠、高效地可集成性的关键。
配置灵活性
“配置灵活性”是指系统在安装和运行的时候,可以根据实际环境或需求的不同,只需要修改配置的部分参数选项,而不必更改代码重新发布版本,便能够满足新的要求,这是系统灵活性的体现。
实现“配置灵活性”的常规方式是采用“配置文件”,更进阶的方式是以特定端口运行“配置服务”实现动态实时的监控与配置。
对于一个具备独立安装包的系统而言,涉及的基本技术点包括:
- 配置文件的管理与启动加载;
- 运行时配置动态调整更新;
可维护性
实现 “可维护性” 的关键是能够做到对系统的运行状态进行记录,涉及的技术功能点是日志管理系统,它包括日志的记录和检索。
在 Java 应用开发中常见的实现是引入 Log4J 等类似的开源日志框架,它可以提供给开发者简单的调用接口将运行中的状态信息记录到日志文件。这对于简单的非正式的应用时足够的,但对于复杂严谨的企业应用而言,还远不能满足全部的需要,仍有许多额外的问题需要考虑和处理。
对于一个严谨的企业应用系统架构而言,由于日志信息有可能会保护系统关键和敏感的信息,因此,需要仔细区分和管理不同类型的日志信息,采用不同的记录和管理方式,这需要从安装配置运行、从安全机制、从开发过程、从业务运营管理等多个层面来综合设计日志记录的机制。具体而言包括:
系统运行日志
- 记录系统的启动和运行,由 IT 管理人员维护和查看。
- 区分记录不同的调用栈,如 Tomcat 的 HTTP 访问记录,应用的服务功能调用等;
业务操作日志
- 记录业务运营的操作参数和涉及的人员以及影响结果等,由于包含业务敏感信息,出于安全考虑,通常由单独的“业务管理员”维护和查看,不允许“IT 管理人员”接触查看。
- 业务日志的数据管理需要满足特定的隔离机制、授权机制等安全控制要求。
自动化日志框架
- 自动记录关键服务或接口的调用运行的真实状态,避免开发人员人为调用可能出现了遗漏、错误或伪造等问题。
- 按规则自动批量地对系统供进行日志记录,可以减轻开发人员的编码工作量,简化代码,提升代码可维护性。
安全机制
“安全”的概念对于一个系统而言,不仅涉及广泛而且深入,既涉及软件、硬件,也涉及管理和维护,不同场景下也会有不同的扩展要求,因此我们仅讨论其中的一些基础部分,仅限于应用开发过程主要涉及的软件层面,从最基础的两方面 “代码运行安全” 和 “应用功能安全” 展开讨论,以下是一些常见且必要的技术功能点:
代码运行安全
代码签名/加密
能够保护独立安装包发布的代码,防止代码被篡改,或防止来源不明的代码注入到系统安装、加载和运行过程。
绑定证书、端口映射、安全用户运行等
能够采用安全证书、匹配网络端口安全管理、操作系统用户安全等策略,来加强系统通讯层面和运行的安全。
Web跨域访问安全控制 建立规则,允许或拒绝某些跨域访问的 HTTP 请求
人机交互请求真实性验证 验证系统接收到的请求是否是真人操作,这是防止系统遭受程序自动攻击的重要手段,常见的方式是通过在请求中携带只能人工识别的图片验证信息。
应用功能安全
用户登录认证机制 确保只有被认可的用户才能访问系统
功能授权访问机制 确保访问系统的用户只能访问到授权范围内的功能;
IT、业务权限隔离 将负责IT维护人员与业务运营人员的权限隔离,避免业务敏感信息的接触范围被不受控的扩散。
关键敏感数据安全 常见的关键敏感数据保护用户账号的密码、密钥和客户资料等,应该采取有足够的安全强度的密码算法对关键敏感数据进行保护,防止数据被意外接触或泄露带来的风险。
业务记录变更审计
业务记录的生成和变更的过程中,自动生成并记录相应的审计信息,使得可追踪业务操作的来源和发生的时间点等信息,能够实现事后安全管理。
许可管理
开发一个“可分发的应用系统”通常都对应着以安装包交付的销售模式,例如企业管理系统、生产调度系统等。实际上,除非是开发者自用或者在线服务模式,否则都属于这种情形,实现“许可管理”功能都是必须的要求,因为这涉及到销售模式的核心。
在技术上,实现“许可管理”功能会涉及的技术点包括:
许可证申请和颁发机制
- 设计实现一种基于电子签名、哈希摘要等密码算法的许可证书格式
- 设计实现一种许可证书的安全颁发机制和开发相应的工具或服务
许可验证和控制机制
- 设计实现一种安全可信的验证许可证书合法性的机制
- 设计实现一种可靠的能够验证和控制软件安装运行的环境范围以及功能访问范围的机制和工具
技术清单
需求 | 技术点 |
---|---|
部署简便性 |
|
独立性与完整性 |
|
跨平台兼容性 |
|
良好的封装性与可集成性 |
|
配置灵活性 |
|
可维护性 | - 系统运行日志 - 应用系统的运行日志 - 集成组件(如 Web容器)的日志
|
安全机制 |
|
许可管理 |
|
“星河低代码”快速开发
星河低代码具有丰富的开箱即用的功能组件,成熟的企业级系统架构,开放灵活的扩展能力,只需 3 步,便可以快速创建可分发的应用系统。
在开始之前,首选需要安装配置好 GDK 开发环境,具体参考《安装 GDK》
创建应用项目
创建应用项目的基本步骤:
启动 GDK 控制台
在 GDK 控制台中执行创建应用命令 create-app
设置应用的数据库连接
完成创建应用项目,退出 GDK 控制台
详细操作请参考:《快速开始》
查看项目结构
星河低代码应用的项目结构是标准的 Maven 工程,并集成了前端 Vue 工程,如果采用“VSCode”作为 IDE ,一名开发者自己可以在同一个 IDE 中轻松地完成前后端全栈开发。
详细的项目结构请参考教程:《快速开始#源代码结构》
在 IDE 导入应用项目
星河低代码具有开放的技术体系,完全兼用主流的开源工具和开发框架,在开发阶段,支持 VS Code
、Eclipse
、IDEA
这三种主流的 IDE 导入应用项目(Project),进行开发调试运行。
参考
- 注:目前尚未测试过除以上 3 款之外的其它 IDE 。 不过,由于星河低代码的应用项目结构是标准的
Maven
结构,以及前端代码是标准的npm
项目结构,理论上支持Maven
和npm
的 IDE 都可用来开发 星河低代码应用(gapp) 。
编译应用项目
编译星河低代码应用项目十分简单,只需执行 mvn clean package
命令,便可以一次性地完成包括“后端代码” 和 “前端代码”一起的整体编译。
IDE 开发/调试/运行
应用的启动类(main
方法)是自动生成的,位于 auto-src 目录下,以 调试(Debug)/运行(Run) 方式执行 main
方法。
如图:
以 调试(Debug) 方式启动运行。
系统初始设置
设置根账号
应用首次启动前,先配置配置根账号的用户名和密码。
应用首次启动时,会根据配置文件的设置,自动创建“根账号”
。
系统管理员随后以根账号登录系统,建立“机构”
和“机构成员”
,完成系统初始设置。
创建机构
打开浏览器,按照启动端口访问首页地址(默认 http://localhost:8080),跳转至登录页面,呈现应用设置的 LOGO、标题、副标题。
开始登录根账号。
进入系统后,依次先 创建“机构管理员”账号,然后 创建“机构”,最后 给“机构”授权。
初始化机构
建立机构之后,由“机构管理员”执行对该机构进行初始设置,包括:创建“机构成员”、授权“机构成员”、启用“机构”。
星河低代码企业级安全管理模型
- 系统严格隔离“IT权限”与“业务权限”
- “根账号”不是超级账号,而是权限范围严格受限的运维账号,只能创建机构、授权机构,不能登录“机构”进行任何操作。
- “机构”被授予的权限集合是该机构中所有成员的最大权限边界,任何“机构成员”都无法实际获得超出“机构”授权的权限。
前端开发调试
这部分将演示对默认生成的首页面 home.vue 进行编辑,并实时观察和调试前端页面的变化。其中,以开源框架 bootstrap 为例,演示在开发中如何集成和使用第三方开源框架或组件进行开发。
设置调试登录账号
前端页面的开发调试,需要指定一个有效账号作为“调试账号”,使前后端的交互以指定账号的身份执行。
设置“调试账号”的过程涉及 2 步:
在开发调试配置文件中开启 HTTP-BASIC 认证模式
设置开发调试配置文件
@conf/server.conf
在前端项目配置文件中设置调试账号
设置前端项目配置文件
web/vite.config.js
,在此设置了由前面步骤中创建的机构成员账号作为调试账号。
编辑页面内容
编辑的“首页”视图组件 home.vue 是一个标准的 Vue 单文件组件(参考 Vue 官方文档)。
引用 Bootstrap 图标
星河低代码的前端图标库 flexue-icons 默认集成了 bootsrap 的图标库,在开发中引用 bootstrap 图标的操作十分简单。
打开 bootsrap 官方的图标库页面,筛选合适的图标,复制图标名,以 bs-svg-
开头设置到 <x-icon>
标签属性。
- bootstrap 官方图标库
- 使用
<x-icon>
标签展示图标
以调试方式运行前端应用
通过执行命名 npm run serve
运行前端应用,通过浏览器查看前端页面结果
设置登录页面 LOGO 和标题
编辑前端应用元数据配置 web/public/application.json
登录页面效果
参考
发布独立安装包
目前,星河低代码应用的安装包以 .zip
格式生成,支持在 Windows、Linux、MaxOS 下以后台服务方式运行。
设置正式发布的配置文件
通常,正式发布的配置与开发阶段的配置不同,并且在配置上采用更安全、严谨的默认值,并且应避免包含内部开发环境的敏感信息。
出于这一目的,在项目结构上,将正式配置和开发配置分开在独立的目录,更有助于隔离管理不同场景的配置。
星河低代码应用(gapp) 正式发布的配置文件位于 @install/conf
目录下,这些配置只会发布到安装包中,在开发调试阶段不会被加载执行。
执行编译发布命令
在命令行终端中,位于应用项目的根目录下执行命令 mvn clean package publish
,对项目先后执行前后端编译、打包代码库、签署应用代码证书、生成安装包。
- 执行编译发布命令
- 编译发布成功
名称执行成功后,安装包位于项目根目录下的 target
目录中,命名格式为:artifactId + '@' + version + '.zip'
。
安装运行应用
安装过程很简单,直接将安装包文件解压缩到安装目录下即可。
- 应用安装目录结构
ROOT # 应用安装根目录
|
|—— bin # 脚本目录;
| |—— gre.sh # 星河低代码运行时引擎(Galaxy Runtime Engine)的脚本 - Linux、MacOS 版本;
| |—— gre.bat # 星河低代码运行时引擎(Galaxy Runtime Engine)的脚本 - Windows 版本;
| |—— start.sh # 应用启动脚本 - Linux、MacOS 版本;
| |—— start.bat # 应用启动脚本 - Windows 版本;
| |—— stop.sh # 应用停止脚本 - Linux、MacOS 版本;
| |__ stop.bat # 应用停止脚本 - Windows 版本;
|
|—— conf # 配置目录;
| |—— server.conf # 应用的主配置文件;
| | # 当与其它配置文件出现相同项时,此配置的优先级最高;
| |
| |—— mongo.db.conf # 应用的 MongoDB 数据库配置文件;
| |__ log4j2.xml # 应用的日志配置文件;
|
|—— modules # 应用功能模块的代码库目录;
|
|__ web # 应用的前端页面目录
- 启动应用服务
执行脚本 bin/start.sh
(Windows 下执行 start.bat
),以后台方式运行应用。
在 Linux / MacOS 下,需要先赋予脚本可执行权限 —— 在
bin
目录下执行chmod +x *.sh
- 在正式安装的应用端口上打开登录页面
- 停止应用服务
执行脚本 bin/stop.sh
(Windows 下执行 stop.bat
)。
许可与代码安全
最终发布的安装包中,包含了应用证书文件和应用代码特征文件。
ROOT # 应用安装根目录
|
|
|__ modules # 应用功能模块的代码库目录;
|—— .modules.cert # 应用的证书文件,定义了应用的许可的安装实例、运行时间、设备、代码特征、以及及其它定义的必要条件;
| # 本地构建发布时,自动颁发试用版的证书,为应用指定了一个确定的试用期。
| # 正式版本的证书,需要向星河低代码平台提出申请,然后平台审核后颁发。
|
|—— .modules.code # 应用代码特征文件;基于密码算法生成对应用的代码进行计算得到,并由开发者的密钥进行签署。
|
|__ <groupId>#<artifactId>@<version>.gapp # 星河低代码应用的代码包;
星河低代码的代码安全机制
- 通过应用证书文件
modules/.modules.cert
,实现对应用的安装和运行进行许可证管理。- 通过应用代码特征文件
modules/.modules.code
,实现防止在分发部署中应用代码被篡改。
完整视频教程
参考