1.19.冰刀:部署
Last updated
Last updated
冰缩寒流,川凝冻霭,前回鹭渚冬晚。燕阁红炉,驼峰翠釜,曾忆花柔酒软。――刘天游《氐州第一》
本篇为实战总结帖,主要用于多个项目同时运行时的统一文档,目前Zero上已经运行了几个比较重量级的项目,本文主要针对几个平台从环境搭建、开发、运行、测试到部署进行基于实战的讲解,以Step-By-Step的方式让开发人员能更加流畅搭建Zero的企业实战开发环境。本文内容和原始教程中的内容略微有些出入,是因为引用了更多Zero Extension中的模块来辅助开发,所以此文算是Zero Core和Zero Extension的交叉参考教程。
最新的依赖库版本如下:
NodeJs
前端
16.14.0
Yarn
前端
1.22.17
Ant Design
前端
3.26.19
基础环境部分
JDK的版本推荐使用ZuLu的开源JDK:https://www.azul.com/downloads/
Maven推荐使用mvnd工具:https://github.com/apache/maven-mvnd/releases
Maven的仓库推荐使用中心仓库,以防止部分jar包无法从代理仓库下载。
可选扩展部分
如果使用了动态建模 (zero-atom)功能,则需要根据您的数据库下载相关依赖库:https://github.com/silentbalanceyh/vertx-zero/tree/master/vertx-pin/zero-vista ,若是其他类型数据库需参考内置源代码自己写一套基础插件。
集成部分的ElasticSearch、Neo4j、Camunda、Redis根据您自身项目情况而定。
动态建模/动态路由功能根据您自身项目情况而定。
Zero的基础版本是支持微服务和K8S(Istio)的,而此功能受限于目前项目,处于实验性版本阶段,需启用vertx-istio
项目。
本教程假设您的基本环境如下:
Maven仓库
x
依赖库目录
~/.m2/repository
本地开发
x
工作目录
~/runtime/develop
生产存储
注:可选部分根据您搭建环境过程中选择的zero extension模块进行相关定义,最新版的模块化会自动化部署相关模块已经环境内容,详细部分参考后续章节,从0.8.1
的版本开始,zero extension扩展模块引入了OOB——Out Of Box开箱即用的配置数据,若您启用了OOB功能,即使您的系统内没有任何内容,这些配置数据都会跟随本教程的发布流程进入到您的主库中。
默认账号:falcon(开发者)
默认密码:11111111
如果您不关注最新版的功能,直接使用0.8.1
版本,则可跳过该步骤,由于zero本身是一个跟着项目成长很迅速的项目,所以在1.0
版本发布之前,个人推荐紧跟最新版本走。虽然最新版本是X-SNAPSHOT
,基础功能已经经过了生产环境验证,所以该版本是可靠的;再者,最新版本会包含一部分重用性极高的新功能,如0.9.0-SNAPSHOT
中引入的:
文档管理平台(FTP、SSH)
模块化管理平台(License、Modulat)
工作流标准化平台(ITSM、ISO)
WebSocket功能(正在开发中,用于提醒)
短信邮件集成
zero框架导入的操作步骤如下:
进入目录~/runtime/develop/
中,下载vertx-zero
代码到环境中:
# 由于是只读类型,所以可不带access_token的模式拉取开源代码
~/runtime/develop >> git clone https://github.com/silentbalanceyh/vertx-zero.git
# 命令执行后的输出如下
Cloning into 'vertx-zero'...
remote: Enumerating objects: 62003, done.
remote: Counting objects: 100% (17224/17224), done.
remote: Compressing objects: 100% (6252/6252), done.
remote: Total 62003 (delta 8657), reused 16131 (delta 8157), pack-reused 44779
Receiving objects: 100% (62003/62003), 87.48 MiB | 15.39 MiB/s, done.
Resolving deltas: 100% (35166/35166), done.
Updating files: 100% (4850/4850), done.
下载完成后~/runtime/develop
中会有一个vertx-zero
目录,使用IDEA导入该目录中的项目:
2.1. 启动IDEA
2.2. 选中下载的vertx-zero
目录中的pom.xml
文件(自动导入成Maven类型的项目)
2.3. 在弹出的对话框中选择Open as Project
(以项目方式打开)
2.4. 如果弹出下边对话框,直接勾选Trust projects in ~/runtime/develop
,然后点击Trust Project
2.5. 等待右下角的项目初始化完成
2.6. 若您点开进度条会看到正在执行的后台任务,请等待后台任务全部完成后再执行下一步
2.7. 项目初始化过程中,系统会下载部分所需的Maven依赖包,您的Maven库中会开始有内容 (注:如果之前您的Maven目录中已存在相关库,则可忽略,Demo从空Maven库开始初始化以方便初学者理解。):
导入完成后,检查IDE中的JDK运行环境是否符合:File -> Project Structure...,推荐11。
此处注意Language level(语言级别),从
zero
的0.7.x
版本开始,框架引入了Camunda
工作流引擎,该引擎最新版本最低要求支持JDK11,基于这一点出发,zero
也将JDK从8升级到了11,所以从该版本开始所有的Java环境以11为准。
打开Terminal终端,使用内置脚本(mvnd环境)编译vertx-zero
:
zero-compile.sh内容如:
上述步骤的编译不会触发zero的测试流程,如果使用mvnd clean package install
方式处理,会触发zero的测试流程,使得整个框架编译的时间拉长,所以不推荐clean package install
方式,这种方式仅留给zero的研发人员 使用。编译成功后,您的开发环境Maven库中就安装了最新的zero版本,目前是0.9.0-SNAPSHOT
。
如果您在项目中使用了动态建模功能(启用zero-atom
),此步骤是必须的,动态建模为高级功能,只有在引入主框架的场景下可使用,直接从中心仓库下载的依赖库中并不包含动态建模部分,此功能目前依然处于研发阶段,只有最新版可支持。
操作步骤如:
执行Oracle依赖库的安装脚本(动态建模编译必须,运行可根据您的项目情况而定)
# 进入 infix-oracle 项目目录
~/runtime/develop/vertx-zero(master) » cd vertx-pin/zero-vista/infix-oracle
# 进入 Maven 本地安装目录
~/runtime/develop/vertx-zero/vertx-pin/zero-vista/infix-oracle(master) » cd maven
# 执行安装脚本
~/runtime/develop/vertx-zero/vertx-pin/zero-vista/infix-oracle/maven(master) » ./install-oracle-jar.sh
# 脚本内容如下
# mvn install:install-file \
# -Dfile=ojdbc7-12.1.0.2.jar \
# -DgroupId=com.oracle \
# -DartifactId=ojdbc7 \
# -Dversion=12.1.0.2
# -Dpackaging=jar
install-oracle-jar.sh
的内容如:
mvn install:install-file \
-Dfile=ojdbc7-12.1.0.2.jar \
-DgroupId=com.oracle \
-DartifactId=ojdbc7 \
-Dversion=12.1.0.2
-Dpackaging=jar
在IDEA的Maven窗口中添加新项目:
导入项目vertx-zero/vertx-pin/zero-vista/
(选择pom.xml文件)
导入项目后直接编译zero-vista
:
如此您就可以直接在项目中使用动态建模的SQL DDL插件了,使用时只需要在pom.xml
中引入下边片段即可(根据您使用的数据库选择合适的插件):
zero中的数据库支持以MySQL和TiDB为主,目前开放的支持的数据库种类基于项目需求。
注:当您作为协作者Coordinator提交代码时必须此步骤!
由于Github站点升级,当你作为Coordinator加入到项目开发时,新版本已不推荐使用用户名/密码方式拉取代码,而是需要在您的账号中生成个人的access_token
,拉取项目代码时使用该access_token
拉取。
其操作步骤如下:
登录您的Github个人账号空间,右上角选择Settings菜单:
选择左边菜单中最下边的Developer Settings:
选择左边菜单Personal access tokens,然后点击Generate new token按钮
勾选好您所需的权限后直接点击Genarate token按钮:
在结果页记录下您的个人token:
进入您的项目环境中,执行如下操作步骤进行库关联,先查看目前的远程库版本:
您的远程库名称为origin
,执行如下命令:
注意上述命令格式,token的位置介于https://
和github.com
之间,并且以@
结尾。
再次查看您的远程库,库路径已发生改变:
完成上述步骤之后,基本设置就完成了,当然在后续步骤中您可以直接使用git clone https://<Token>@<Repo>
的方式拉取代码,则 6 ~ 8 步骤可省略 ,即下边命令:
git clone https://<TOKEN>@github.com/silentbalanceyh/vertx-zero.git
如果从头搭建zero脚手架,使用新建流程,若是导入已经搭建好的项目则使用导入流程。
新建项目可直接下载最新的脚手架版本:https://github.com/silentbalanceyh/scaffold-zero,然后根据自身项目修改如下内容:
其中数据部分需修改Excel数据文件中的内容,这部分教程在配置章节讲解,上述修改部分参考本教程的配置篇来详细修改,一旦搭建好环境后就不用再变更,为一次性操作。
导入项目时如果作为Coordinator需更改项目内容,参考《1.4.Github安全设置》先配置个人token,导入的操作步骤执行如下:
为了区分标准脚手架和新项目,从
scaffold-zero
中下载的项目在此章节为smave
名称,从新建到配置完成的部分参考后续各配置章节。
从仓库下载代码(带token安全下载):
git clone https://<Token>@<Repo>
# 截图中以项目名smave为例,但该项目在私库中,所以读者无法直接访问,读者可直接访问自己创建好的Github仓库
参考《1.3.zero插件环境》直接添加一个新的Maven项目到IDEA环境中,添加完成后效果如:
注:vertx-zero和smave共存于一个IDEA窗口中。
打开终端,执行根目录的编译脚本
编译成功后可以看到如下截图(如此后端基本开发环境就搭建完成了)
Zero脚手架的初始化流程操作步骤如下:
为了团队协作开发,先在自己本地开发环境中追加如下hosts映射(部署时另外配置):
# Mac位置 /private/etc/hosts
# Windows位置 C:/Windows/System32/drivers/etc/hosts
127.0.0.1 ox.server.cn # 容器专用
127.0.0.1 ox.engine.cn # 服务专用
127.0.0.1 ox.integration.cn # 集成专用(可选)
为您的应用创建MySQL数据库账号:
~/server$ mysql -u root -p # 输入root密码连接到MySQL中
mysql > USE mysql;
mysql > CREATE USER 'smave'@'%' IDENTIFIED BY '<PASSWORD>';
mysql > GRANT all privileges ON *.* TO smave@'%' WITH GRANT OPTION;
执行数据库建库脚本
账号密码位于脚本 database-reinit.sh,请自行修改,按第二步创建的账号更改即可,推荐团队开发账号统一。
~/runtime/develop/smave/script/database(master) » ./database-reinit.sh
[Zero] 重建数据库成功!
重建完成后,可以看到空库(文中仅演示了最小配置,不带工作流库、动态库、删除历史备份库,其他库的配置参考后续配置章节处理):
执行初始化脚本,zero中的初始化使用liquibase完成,直接运行如下脚本:
执行完初始化脚本后可以在数据库看到生成的表结构:
「重要!」执行下边命令备份最新表结构用于生产发布:
表创建好过后,执行数据导入专用程序:cn.vertxup.SvLoader
「重要!」从此处开始,所有直接从IDEA中运行的主程序都必须配置好运行目录,否则无法以正确路径的方式加载数据,该步骤在生产环境中是不需要的,先点击SvLoader
的运行配置:
「重要!」点开运行配置后设置您的主程序的运行目录并保存该配置:
重要的事情说三遍:
注意第二个红色框,这一步对开发人员十分重要!*
注意第二个红色框,这一步对开发人员十分重要!*
然后点击运行或调试运行执行数据初始化主程序
运行完成后可看到如下日志:
如此,数据初始化就完成了,这个SvLoader
可以在您更改了任何/init/oob
中的数据过后执行反复初始化操作,属于高频使用的主程序,而本小节的初始化流程 也会在开发过程中反复使用。
容器启动流程操作步骤如下:
初始化完成后,直接运行主程序:cn.vertxup.SvAgent
:
看到如下界面,后端zero容器就启动成功了:
如果是自己从头搭建zero-ui脚手架,则使用新建流程,若是导入已经搭建好的项目则使用导入流程。
新建zero-ui项目先安装zero的脚本工具:https://www.vertxai.cn/,安装好工具之后直接运行如下命令:
新建项目后根据自身项目修改如下内容:
前端导入使用WebStorm,操作步骤如下:
从仓库下载代码(带token安全下载):
git clone https://<Token>@<Repo>
# 截图中以项目名smave-ui为例,但该项目在私库中,所以读者无法直接访问,读者可直接访问自己创建好的Github仓库
将代码导入WebStorm或其他前端工具IDE中:
选中您下载的项目打开
弹出框中选择
安装本地依赖库,基于yarn
,一次性执行,生产部署之前也需执行
脚本内容如下
上述脚本运行完成后可看到如下截图:
运行启动脚本
最终运行后可看到如下截图
从浏览器中打开前端:,此处PORT
是前端配置的端口号: 如果连接不上后端显示
如果连接上后端则显示
使用falcon/11111111
登录可进入主界面。
直接使用Ubuntu工具安装JDK 11:
sudo apt install openjdk-11-jdk
执行过后会有如下截图
验证Java是否安装成功
java -version
最终安装路径:/usr/lib/jvm/java-11-openjdk-amd64
,后续设置JAVA_HOME
。
安装Azul APT仓库:
# install the necessary dependencies
sudo apt-get -q update
sudo apt-get -yq install gnupg curl
# add Azul's public key
sudo apt-key adv \
--keyserver hkp://keyserver.ubuntu.com:80 \
--recv-keys 0xB1998361219BD9C9
# download and install the package that adds
# the Azul APT repository to the list of sources
curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb
# install the package
sudo apt-get install ./zulu-repo_1.0.0-3_all.deb
# update the package sources
sudo apt-get update
执行包安装的截图如下:
执行命令安装Zulu JDK 11:
# 标准安装
sudo apt-get install zulu11-jdk
本地安装Zulu JDK 11:
# 下载 deb 安装包
wget https://cdn.azul.com/zulu/bin/zulu11.54.25-ca-jdk11.0.14.1-linux_amd64.deb
# 执行本地安装
sudo apt-get install ./zulu11.54.25-ca-jdk11.0.14.1-linux_amd64.deb
安装截图如:
检查Java版本
最终安装地址:/usr/lib/jvm/zulu-11-amd64
,后续设置JAVA_HOME
。
直接使用Ubuntu工具安装Git:
sudo apt install git
验证Git是否安装完成
git --version
下载安装包:
wget https://github.com/apache/maven-mvnd/releases/download/0.7.1/mvnd-0.7.1-linux-amd64.zip
执行截图
对安装包执行解压:
unzip mvnd-0.7.1-linux-amd64.zip
重命名目录
mvn mvnd-0.7.1-linux-amd64.zip mvnd
该章节为2.2、2.3的补充章节。
Java环境变量
Mvnd环境变量
执行下边命令打开环境变量文件:
sudo vim /etc/profile
追加如下片段(按i
键编辑):
export JAVA_HOME=/usr/lib/jvm/zulu-11-amd64
export MAVEN_HOME=/home/localadmin/software/mvnd
export PATH=$PATH:$MAVEN_HOME/bin:$JAVA_HOME/bin
截图参考
编辑完成后执行Esc
,使用wq
退出vim
工具并保存,然后执行下边命令在当前会话中生效
检查Java和Mvnd
Java环境检查:java -version
Mvnd环境检查:mvnd -v
执行命令安装MySQL
sudo apt install mysql-server
验证安装好的服务
sudo systemctl status mysql
新版本操作系统安装5.7
(参考引用中教程先设置,然后执行此步骤的命令):
sudo apt install -f mysql-client=5.7* mysql-server=5.7*
配置root密码
配置mysql
追加下边配置
为了兼容Oracle数据库,zero对数据库的要求是大小写敏感的,且以大写为主,所有SQL关键字、数据库相关的内容都一律使用大写。
重启MySQL服务
验证MySQL服务和端口
连接MySQL
创建您的应用所需账号:
下载NodeJs安装包:
wget https://nodejs.org/dist/v16.14.2/node-v16.14.2-linux-x64.tar.xz
解压
tar -xvf ./node-v16.14.2-linux-x64.tar.xz
重命名目录(为后续方便):
mv node-v16.14.2-linux-x64 nodejs
环境变量配置
追加下边内容
保存后执行下边命令让环境生效
验证环境:
安装yarn,yarn在安装过程请使用全局模式安装-g
参数。
Zero Ai是自研发的开发辅助工具
(仅Linux环境)参考文档:http://www.vertxai.cn
执行安装命令
npm install -g vertx-ai
检查安装结果:
ai help
执行命令安装服务器:
sudo apt install apache2
查看服务器运行状态
sudo systemctl status apache2
修改端口和根目录
进入默认配置目录/etc/apache2/
在文件ports.conf
中修改内容
追加下边配置
创建默认目录
修改默认配置
修改开始配置以及中间配置(注意此处目录不可使用root
账号目录,否则)
为防止403错误,需要在/etc/apache2/apache2.conf
配置文件中追加
此步骤是因为在配置过程中我们更改了apache2的默认目录,从/var/www/html
修改到了/home/localadmin/server
中,如果您没有更改默认目录则可忽略这一步。
生产环境部署时,有时候会遇到刷新界面404的问题,该问题解决方案如下:
在您的部署目录下追加.htaccess
文件,该文件内容如下:
最后重启apache2服务
以 smave 为例,基本结构和在线的 scaffold-zero 一致。
在后端服务器中追加数据库配置,先添加hosts映射:
127.0.0.1 ox.server.cn # 前后端部署在同一台机器时前端使用该记录(开发也使用该记录)
127.0.0.1 ox.engine.cn # 数据库使用此映射记录
127.0.0.1 ox.integration.cn # 仅用于集成
(本地打包忽略)下载代码到生产环境
git clone https://<TOKEN>@github.com/silentbalanceyh/smave
(本地打包忽略)执行下边命令编译打包:
# vertx-zero,前文提到过
~/runtime/vertx-zero$ git pull
~/runtime/vertx-zero$ ./zero-compile.sh
# smave,编译项目
~/runtime/smave$ git pull
~/runtime/smave$ ./build.sh
(本地打包忽略)查看编译结果
本地编译后直接跳过 2 ~ 4 步骤,拷贝下边目录到容器启动目录
查看server
目录结构
在server
目录中创建启动命令工具和容器启动的脚本
程序更新脚本如下:
如果您更改了conf
部分的配置,请在更新时注意先备份,更新过后再还原,如下截图:
更改配置文件
更改跨域配置:
将最后一行内容更改为(注意域名小写,浏览器会自动转。):
文件管理地址更改:
将内容更改为:
database-reinit.sh
脚本在开发章节已经存在,此处不再重复,可以将该部分脚本拷贝到~/server/script/
中。
(第一次或表变更)执行数据库初始化
# 进入script/database目录去初始化
cd script/database
./database-reinit.sql
(第一次或表变更)执行建库操作,开发过程中已经导出了表结构的SQL,直接执行上边的建表的脚本
# 直接执行
./smave-database.sh
启动命令行工具
# 直接执行
./smave-console.sh
执行命令:r
,l
导入数据(Zero Ai命令)
启动容器:
启动容器后可从日志查看容器启动状态:
最终输出如下:
同时在logs/
目录中可以看到日志清单:
zero-epic-fabric目录中是核心框架日志
zero-epic-extension目录中是扩展框架日志
在运行日志中确认两个配置以证明conf
目录下的内容已生效
执行下边命令可看到运行的java进程:
下载代码到前端服务器中
cd ~/runtime/
git clone http://<TOKEN>@github.com/silentbalanceyh/smave-ui.git
# 下载前端代码到本机中
安装前端依赖库
~/runtime$ cd smave-ui
~/runtime/smave-ui$ yarn install
# 等待前端依赖库安装结束(第一次速度很慢)
由于生产环境的环境变量已经提前设置了,在./env.production
文件中,所以安装好依赖库后,前端可直接打包
# 打包消耗时间会挺长,主要原因是使用了TypeScript做部分数据结构的校验
# 所以最好是在本地打包好了直接把 `build` 目录上传到
~/runtime/smave-ui$ yarn build
最后将build
中的所有内容拷贝到~/server
中。
使用浏览器打开,您就可以看到如下界面:
本章节主要解析几个常用的内置映射域名相关信息,需注意的是此处的域名只是为了团队协作开发,并不是真实存在的域名,zero系统中包含三个核心域名:
ox.engine.cn
访问数据库专用域名。
Ok
Ok
ox.server.cn
访问后端容器专用域名。
Ok
x
ox.integration.cn
这三个域名映射需要您添加到本地hosts映射中:
# Mac位置 /private/etc/hosts
# Windows位置 C:/Windows/System32/drivers/etc/hosts
127.0.0.1 ox.server.cn # 容器域名
127.0.0.1 ox.engine.cn # 服务域名
127.0.0.1 ox.integration.cn # 集成域名(可选)
三个域名的使用结构图如下:
特殊说明:
使用域名访问服务可以保证不同的开发人员直接通过调整本地域名映射访问外置服务,主要处理以下几种核心场景:
开发数据库/测试数据库/生产数据库在不改变代码的情况下自由切换。
不同的集成服务在不改变代码的情况下自由切换。
不同开发人员访问这些服务时在不改变代码的情况下自由切换。
一般在生产环境部署时,前端zero ui
和后端zero
只有在同一台服务器上运行时,不需要更改ox.server.cn
的域名配置,通常部署时候我们会采用两台以上的机器分离部署,所以生产部署时会单独配置ox.server.cn
。
一般在生产环境部署时,后端zero
和所有的集成服务在同一台服务器上运行时,不需要更改ox.integration.cn
的域名配置,但往往生产环境部署时这些集成服务和后端zero
都是分离的,也会单独配置。
后端zero
以及开发工具访问所有数据库时统一使用了ox.engine.cn
的域名访问,除非生产环境部署时数据库和后端zero
分离,否则不需要更改ox.engine.cn
的域名配置。
4.1.1.1. 程序访问
数据库域名统一在vertx-jooq.yml
中配置:
在脚手架配置中您会看到下边几段配置代码(省掉数据库连接参数):
jooq:
# 主库配置
provider:
driverClassName: "com.mysql.cj.jdbc.Driver"
username: root
password: "xxxx"
instance: DB_UP
hostname: "ox.engine.cn"
jdbcUrl: "jdbc:mysql://ox.engine.cn:3306/DB_UP?...."
# 历史数据库
orbit:
driverClassName: "com.mysql.cj.jdbc.Driver"
username: root
password: "xxxx"
hostname: "ox.engine.cn"
instance: DB_UP_HIS
jdbcUrl: "jdbc:mysql://ox.engine.cn:3306/DB_UP_HIS?...."
# 工作流库
workflow:
name: HOTEL-WORKFLOW-ENGINE
builtIn:
# 文件管理工作流
- workflow/process.file.management/workflow.xlsx
database:
driverClassName: "com.mysql.cj.jdbc.Driver"
username: root
password: "xxxx"
instance: DB_UP_WF
hostname: "ox.engine.cn"
jdbcUrl: "jdbc:mysql://ox.engine.cn:3306/DB_UP_WF?...."
4.1.1.2. Liquibase访问
zero中使用使用liquibase执行数据库初始化,它的数据库配置位于文件:
该配置是一个属性文件,内容通常如:
url=jdbc:mysql://ox.engine.cn:3306/DB_QIANLI?....
driver=com.mysql.cj.jdbc.Driver
username=zero
password=xxxx
4.1.1.3. Jooq代码生成访问
zero中的Jooq代码生成配置位于领域模型定义的项目中,它的数据库配置位于文件:
该配置文件是一个XML文件,内容通常如:
<jdbc>
<driver>com.mysql.cj.jdbc.Driver</driver>
<url>
<![CDATA[ jdbc:mysql://ox.engine.cn:3306/DB_UP?..... ]]>
</url>
<username>root</username>
<password>xxxx</password>
</jdbc>
4.1.2.1. 跨域CORS
CORS跨域访问的域名一般位于vertx-jooq.yml
配置文件的尾端,其片段如下:
origin: "http://ox.server.cn:6001"
4.1.2.2. 前端Endpoint
当您的zero-ui前端访问后端zero容器时,前端的访问配置位于环境变量文件中:
环境变量文件主要有两个:
.env.development:开发环境专用
.env.production:生产环境专用
所有集成域名目前也位于vertx-jooq.yml
配置文件中,只是在脚手架项目里被注释掉了,需要使用时直接打开即可:
# ------------------- Redis专用 ----------------------
# redis:
# host: ox.integration.cn
# port: 6379
# ------------------- 历史备份专用 ----------------------
# 历史库专用
#trash:
# keepDay: -1
# ------------------- 全文检索专用 ----------------------
# Es索引库
#elasticsearch:
# hostname: ox.integration.cn
# port: 9200
# scheme: http
# index: cmdb
# username: elastic
# password: zero
# ------------------- 拓扑图专用 ----------------------
# 图引擎库
#neo4j:
# port: 7687
# protocol: bolt
# hostname: ox.integration.cn
# username: neo4j
# password: "zero"
细心的读者已经发现,后端配置所有的域名的位置比较集中:
除开Jooq/Liquibase工具使用的域名需要单独配置,这两个工具主要是开发过程中使用,生产部署时不会使用,可理解成一次性配置,配置好过后不需要更改。
生产部署专用的域名配置全部位于vertx-jooq.yml
文件中,这样设计的目的也是为了方便修改以及执行DevOps配置流程。
本来这个章节是Maven的基础知识,应该是不需要教程就可以过的知识点,但为了照顾初学者,本小节可以帮助您从零开始搭建一个scaffold-zero
的脚手架基础项目,在看章节步骤之前,先看看几个项目的作用:
zo-core
pom
您项目模块核心层父项目。
zo-core/zo-business
jar
您项目模块的业务逻辑层。
zo-core/zo-domain
jar
您的项目模块的领域模型层。
特殊说明:
数据访问层?整个项目结构中没有数据访问层是因为zo-domain
中的静态领域模型是使用Jooq代码生成工具生成,生成过程中已经带有Dao层的代码,并且在编程过程中,借用zero提供的抽象数据层以及查询引擎,不需要使用任何多余代码就可以完成数据库的底层访问,所以丢弃了传统项目中的数据访问层。
接口/控制层?整个项目结构中也不存在控制层和接口部分,由于zero以及将上层逻辑全部压缩到一起了,这部分内容根据您项目的复杂度可以有所差异,您也可以自行扩展。
多启动器?zo-driver
中可以包含一个以上的启动器,您可以书写不同种类的main
函数作为程序入口,通常:
开发过程中会使用双入口:Loader/Agent
,一个负责数据导入,另外一个负责容器启动。
生产部署过程中会使用单入口:Entry
,该入口根据不同参数可打开命令行工具和容器,参考前文部署教程。
Maven标识更改操作步骤如下(附带新建项目步骤):
删除下载下来的scaffold-zero
中的.git
目录,将代码推送到自己的代码仓库中。
在IDEA中选中项目,点击右键:Refactor -> Rename...,下图中选择最后一个:Rename module and directory
在弹出框中输入您的主项目标识信息
在所有子项目中重复步骤 2 ~ 3(合计五次):
注:一般在IDEA做rename的时候,Maven的配置并不会随着IDEA发生更改。
更改所有的POM文件:
POM文件在更改过程中需根据您自己的项目设置
项目本身的三个核心属性:groupId, artifactId, name
需酌情更改:
父子结构调整,子项目中(除开从vertx-import
继承的项目需调整继承部分:
变更完成后,保证编译通过,直接运行根目录:build.bat/build.sh
脚本,见到下边截图则您的Maven设置就完成了:
4.1中已经说明,数据库配置部分主要在vertx-jooq.yml
中,其中Camunda, 历史库,主库
的配置结构基本一致,如下:
jooq:
provider:
driverClassName: "com.mysql.cj.jdbc.Driver"
username: root
password: "xxxx"
instance: DB_UP
hostname: "ox.engine.cn"
jdbcUrl: "jdbc:mysql://ox.engine.cn:3306/DB_UP?..."
# 历史数据库,如果启用逻辑删除则需要使用该库
orbit:
driverClassName: "com.mysql.cj.jdbc.Driver"
username: root
password: "xxxx"
hostname: "ox.engine.cn"
instance: DB_UP_HIS
jdbcUrl: "jdbc:mysql://ox.engine.cn:3306/DB_UP_HIS?..."
## 工作流配置
workflow:
name: HOTEL-WORKFLOW-ENGINE
builtIn:
# 文件管理工作流
- workflow/process.file.management/workflow.xlsx
database:
driverClassName: "com.mysql.cj.jdbc.Driver"
username: root
password: "xxxx"
instance: DB_UP_WF
hostname: "ox.engine.cn"
jdbcUrl: "jdbc:mysql://ox.engine.cn:3306/DB_UP_WF?..."
需要更改的属性表如下:
driverClassName
JDBC连接专用的数据库驱动类名
instance
数据库名,和JDBC连接字符串同步修改
hostname
默认使用ox.engine.cn
username
数据库访问账号
password
数据库访问口令/密码
特殊说明:
options配置的内容关联到连接池属性,系统默认使用了HikariDataPool
连接池。
category目前系统中支持六种最基本的值
MYSQL5
MYSQL8
MYSQL(旧版专用)
ORACLE(旧版专用)
ORACLE11
ORACLE12
(保留)TIDB4
(保留)TIDB5
默认的jdbcUrl中带的MySQL配置参数如下表格:
serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&useSSL=false
数据库的category
属性实际并不是数据库访问过程中必须的,最新的JDBC可以根据您提供的driverClassName
以及jdbcUrl
反向分析数据库类型,而此处的category
主要设计如下:
在执行Jooq持久化过程中为数据库提供更好的Dialect方言以适配不同数据库。
zero在对数据库执行DDL动态建模/动态路由实施过程中,可根据category执行特定的组件选择以处理不同种类数据库的兼容性问题。
如果您启用了动态建模(zero-atom)功能,则额外的动态数据库会存储在您的X_SOURCE
表中,表结构和配置一致,而前端开发中心您可以看到目前四个库的启用禁用情况,如下图只启用了主库,并且可以在该界面更改动态建模库的信息:
容器端口的配置主要分两部分:后端端口和前端端口。
后端端口的配置如下图:
此处的name
在微服务环境和云端环境作为节点部署时需要特别注意,单体应用(本教程中)中可根据自己的项目进行设置。
host
设置成0.0.0.0
其含义在于任意IP地址都可访问,不限制主机的运行IP。
此处的port
就是您需要配置的端口号,Scaffold的默认端口为6000,Zero框架中的默认端口为6083,此处为了做Demo改成了6086。
前端端口的配置如下图:
前端端口号使用NODE
的环境变量PORT
进行指定,.env.development
负责开发环境端口号,.env.production
负责生产环境端口号。
后端配置前端的跨域必须和浏览器中访问的地址一致,一般位于vertx-jooq.yml
文件中,如:
其中origin
的配置意味着您最终会在浏览器中输入http://ox.server.cn:6001
来访问前端程序,而服务端只允许从这个路径的JS请求发生,这样就防止其他模式的脚本攻击,关于跨域更多信息可参考在线的跨域配置相关文档。
前端跨域的基本环境变量配置如:
使用前后端分离配置的核心结构图如下:
所以生产部署过程中,对外的两台服务器必须开放对应的端口,如图后端开放7000,前端开放6002。
如果搭建了Nginx的反向代理则可跳过上述步骤。
zero脚手架中的初始化登录账号位于启动器中:
打开该Excel文件:
主要添加的记录有三张表:
O_USER
OAuth认证模式的专用数据表,每个用户一条记录,包含了发放的唯一密钥。
S_USER
账号表,包括账号名、密码等。
R_USER_ROLE
账号角色关联表,存储了角色和用户的关联信息。
特别说明:
密钥是一个64位的随机字符串,可使用Zero Ai命令生成:
ai str -n <个数,默认1> -l <长度,默认64>
主键一般是UUID格式,可直接使用Zero Ai命令生成:
ai uuid -n <个数,默认20>
密码是MD5的加密格式,可直接使用Zero Ai命令生成(0.3.20
版本之后):
ai md5 -i <输入字符串>
如果是MacOs的系统,执行完命令之后可直接使用Cmd + V
快捷键粘贴刚刚生成的字符串。
修改完成后,直接运行Loader
程序(前文提到的数据加载程序),默认会加载init/oob
中的所有Excel数据文件,可反复加载,加载完成后重新启动容器,则新的账号密码就会生效。
租户信息在整个zero
环境中以sigma
为标识,带有租户的系统结构概念图如下:
特殊说明:
如图所示,每一个彩色小方块表示一个独立的Docker容器,这个容器中可能包含独立数据库、存储、服务也可能多个小方块组合到一起使用,从应用层的数据去标识,每个小方块都拥有一个独立的appId
和appKey
。
appId
用于读取基础应用数据
appKey
用于读取敏感数据
每一种颜色则表示一个租户信息,拥有唯一的sigma
值,最终从系统层可以看到,一个租户会有多个应用信息,而此处我们部署的前后端就充当了一个彩色小方块的Docker结构。
租户信息的区分主要体现在部分信息的数据导入过程:
如果您要启用Zero中提供的命令行,则需设置如下配置:
runtime目录中的configuration.json
是命令行专用配置,它的内容实际是引用租户文件:
{
"stellar": "init/environment.json"
}
有了上述配置后,您就可以使用如下代码:
// 直接调用 Ok.ok() 可提取租户信息
return Ok.ok().compose(okA -> {
// 此处的 okA 表示租户方
final JtApp app = okA.configApp();
// 而此处的 okB 表示客户方(客户方即集成方)
final OkB partyB = okA.partyB(appName);
});
init/environment.json
中的存储的数据就是租户的基本数据,格式如:
配置中有三个核心节点和租户信息相关,他们的用途分别为:
global
:该节点提供了当前租户的基本全局信息,用于Excel数据导入过程中的默认值赋予,有了该设置后,Excel数据文件中的数据就不需任何和应用、租户、语言相关的信息,只包含业务数据,最终形成如下结构图:
即:应用数据包 + environment.json = 租户数据包。
application
:PartyA专用配置数据,包括(应用数据X_APP
,数据库配置X_SOURCE
本章节旧事重提,主要用于配置前端环境变量:
项目的npm名称存储于package.json
中,该名称会在ai init
命令中直接设置:
{
"name": "smave-ui",
"version": "0.1.0",
"private": true,
}
集成配置环境变量如:
# 该应用使用的语言环境,X-Lang 传入值
Z_LANGUAGE=cn
# 远程容器RESTful访问端
Z_ENDPOINT=http://ox.server.cn:7000
# 主色调处理,该色调会影响整个 Ant Design的主色调
Z_CSS_COLOR=#3457e2
# CSS自定义类名前缀
Z_CSS_PREFIX=zo
# 站点的字体设置:默认是 14px
Z_CSS_FONT=13px
# 打开通用调试日志
Z_DEV_DEBUG=true
# 打开模拟数据专用日志(去后端独立运行前端专用设置)
Z_DEV_MOCK=true
# 打开远程请求专用配置监控请求响应信息
Z_DEV_AJAX=false
# 表单监控专用日志
Z_DEV_FORM=true
# 打开所见即所得的Monitor工具,使用键盘中的 home 拉出工具
Z_DEV_MONITOR=false
应用配置在前端和后端必须对应上,前端依旧是环境变量部分:
# 应用名称,对应到 X_APP 中的 NAME 字段
Z_APP=vie.app.zo
# 应用的语言环境,和后端对应
Z_LANGUAGE=cn
# 入口信息,可对接后端的 UI_PAGE 实现动态界面渲染,目前只是用于静态的入口端
# 登录入口端
Z_ENTRY_LOGIN=/login/index
# 管理入口端
Z_ENTRY_ADMIN=/amdin/index
后端配置位于下边文件中:
表格中的数据如下
本章主要介绍了zero新脚手架的基本配置以及开发环境和生产环境的详细部署流程,根据教程中的内容开发人员可完成如下任务:
搭建项目的开发环境(从零起步以及直接导入)
部署项目到生产环境
注意第二个红色框,这一步对开发人员十分重要!*
命令行启动脚本如下:
#!/usr/bin/env bash
chmod +x smave-app.jar
java -Djava.io.tmpdir=./tmp \
-cp conf \
-jar smave-app.jar config
# 保存为 smave-console.sh
容器启动脚本如:
#!/usr/bin/env bash
chmod +x smave-app.jar
OX_OPTS="$OX_OPTS -server \
-Xms8g -Xmx16g -XX:NewRatio=1 \
-XX:SurvivorRatio=3 -XX:PermSize=256m \
-XX:MaxPermSize=4g"
# 后台运行
nohup java $OX_OPTS -Djava.io.tmpdir=./tmp -cp conf -jar smave-app.jar start &
# 保存为 smave-server.sh
zero-epic-fabric.log是汇总后的日志
父子结构调整,父项目中调整module
部分
name
的调整则是为IDE量身打造的,调整过后可以在Maven窗口中看到更改结果
若窗口无变化点击截图中的刷新按钮看到该改变
true
是否启用Unicode
characterEncoding
UTF-8
数据库使用的默认编码
autoReconnect
true
是否自动重连
useSSL
false
是否启用SSL
failOverReadOnly
false
自动重连成功后,连接是否设置为只读
CORS会拦截掉所有请求源非法的请求,这种情况请求本身不会进入到后端应用中。
此处提到的请求主要是JS脚本级的请求,通常应用容器为浏览器,如果是直接使用程序发送请求方法除外。
integration
:PartyB专用配置数据,主要是集成数据,用于构造Integration
类专用。
React
前端
16.14.0
JDK
后端
11
Maven
后端
3.8.5
Zero
后端
0.8.1 ~
Vertx
后端
4.2.6
ElasticSearch
集成(全文检索)
7.x ~
Neo4j
集成(拓扑图)
4.x ~
Camunda
集成(工作流)
7.x ~
MySQL
数据库
5.x
Oracle
数据库
12.x
TiDB
数据库
5.x
可选
工作目录
~/runtime/zero-store/(文档管理专用)
生产部署
x
工作目录
~/server(前后端一致)
DB_UP
x
数据表
数据库中的主库
DB_UP_WF
可选
数据表
数据库中工作流专用库(Camunda库)
DB_UP_HIS
可选
数据表
数据库中的删除历史库
DB_XX
可选
数据表
动态建模专用库
# zero中内置脚本主要用于快速编译以及增量编译框架,其中内容如下:
# 1)完整编译(常用) -- zero-compile.sh
# 2)增量编译 -- zero-compile-increase.sh
# 3)「部分」编译核心框架 -- zero-compile-core.sh
# 4)「部分」编译扩展框架 -- zero-compile-extension.sh
# 5)「部分」编译插件 -- zero-compile-infix.sh
#
~/runtime/develop/vertx-zero(master) >> ./zero-compile.sh
......
# 最终输出如下
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 45.021 s (Wall Clock)
[INFO] Finished at: 2022-03-27T22:32:07+08:00
[INFO] ------------------------------------------------------------------------
mvnd clean package install -DskipTests=true -Dmaven.javadoc.skip=true -Dmaven.compile.fork=true -T 1C
~/runtime/develop/vertx-zero/vertx-pin/zero-vista(master) » mvn clean package install
.....
# 最终输出如下
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for 「vertx-vista」Scaffold Extension 0.9.0-SNAPSHOT:
[INFO]
[INFO] 「vertx-vista」Scaffold Extension .................... SUCCESS [ 1.693 s]
[INFO] Scaffold Plugin: MySQL(infix-mysql) ................ SUCCESS [ 6.121 s]
[INFO] Scaffold Plugin: Oracle(infix-oracle) .............. SUCCESS [ 3.783 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.339 s
[INFO] Finished at: 2022-03-28T05:46:15+08:00
[INFO] ------------------------------------------------------------------------
<!-- MySQL -->
<dependency>
<groupId>cn.vertxup</groupId>
<artifactId>infix-mysql</artifactId>
<version>${zero.version}</version>
</dependency>
<!-- Oracle -->
<dependency>
<groupId>cn.vertxup</groupId>
<artifactId>infix-oracle</artifactId>
<version>${zero.version}</version>
</dependency>
~/runtime/develop/vertx-zero(master) » git remote -v
origin https://github.com/silentbalanceyh/vertx-zero.git (fetch)
origin https://github.com/silentbalanceyh/vertx-zero.git (push)
~/runtime/develop/vertx-zero(master) » git remote set-url origin \
https://<TOKEN>@github.com/silentbalanceyh/vertx-zero.git
~/runtime/develop/smave(master) » ./build.sh
# build.sh (Linux专用)
# build.bat (Windows专用)
~/runtime/develop/smave/sv-driver/ix-smave(master*) » ./run-init.sh
# 最终输出如下:
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.531 s
[INFO] Finished at: 2022-03-28T10:20:04+08:00
[INFO] ------------------------------------------------------------------------
mysqldump -u root -pxxxx -h localhost --databases DB_SMAVE > src/main/resources/init/initialize.sql
~/runtime/develop/smave-ui(master) » ./run-update.sh
#!/usr/bin/env bash
ncu -u # package.json 检查更新
node ./scripts/zrun-package.js # 自动化版本管理(防止依赖)
rm -rf yarn.lock # 删除缓存
yarn install # 重新安装依赖
~/runtime/develop/smave-ui(master*) » ./run-zero.sh
# 由于引入了TypeScript,第一次启动会十分慢,启动过一次后如果依赖包不更改启动速度会很快
java -version
source /etc/profile
sudo mysql_secure_installation
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
# Windows专用,MySQL大小写敏感
lower_case_table_names=2
# 连接参数设置
max_connections=2048
wait_timeout=1814400
service mysql restart
ps -ef|grep mysql
netstat -an|grep 3306
mysql -u root -p
~/server$ mysql -u root -p # 连接到MySQL中
mysql > USE mysql;
mysql > CREATE USER 'smave'@'%' IDENTIFIED BY '<PASSWORD>';
mysql > GRANT all privileges ON *.* TO smave@'%' WITH GRANT OPTION;
sudo vim /etc/profile
export NODE_HOME=/home/localadmin/software/nodejs
export PATH=$NODE_HOME/bin:$PATH
source /etc/profile
node -v
npm install -g yarn
# 进入配置目录
cd /etc/apache2
sudo vim /etc/apache2/ports.conf
NameVirtualHost *:6002
Listen 6002
# 此处 xxx 是当前登录用户名
mkdir -P /home/xxx/server
# 权限必须是 755 以上
chmod 755 /home/xxx/server
cd sites-available/
cp 000-default.conf 000-default.conf.bak # 备份
sudo vim 000-default.conf
<VirtualHost *:6002>
....
DocumentRoot: /home/xxx/server
</VirtualHost>
<Directory /home/localadmin/server>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 先启用Linux中的 `mod_rewrite`
sudo a2enmod rewrite
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>
sudo systemctl restart apache2
ll sv-driver/ix-smave/target/
# 创建运行目录
mkdir ~/server
# 将打包的内容拷贝到该目录中
# - conf 文件夹 (配置文件位置)
# - lib 依赖库 (jar位置)
# - smave-app.jar (启动程序)
$ cp -rf \
> runtime/smave/sv-driver/ix-smave/target/smave-app.jar \
> runtime/smave/sv-driver/ix-smave/target/conf \
> runtime/smave/sv-driver/ix-smave/target/lib \
> server/
ll server
#!/usr/bin/env bash
rm -rf conf lib smave-app.jar
cp -rf ../runtime/smave/sv-driver/ix-smave/target/smave-app.jar \
../runtime/smave/sv-driver/ix-smave/target/conf \
../runtime/smave/sv-driver/ix-smave/target/lib \
.
# 保存为 smave-update-whole.sh
# 跨域配置更改
vim conf/vertx-jooq.yml
origin: "http://hpcs01"
# 文件存储目录变更
vim conf/plugin/is/configuration.json
{
"storeRoot": "/home/localadmin/server/store"
}
> r
[ μηδέν ]执行命令:"r", "(子系统)标准部署工具"
[ μηδέν ] (runtime)------>>>> Sub System: (子系统)标准部署工具
[ μηδέν ][ Production ] 请输入命令,使用 h 可查看帮助文档
> l
......
# 最终输出结果
[ μηδέν ]您的元数据仓库已重置初始化完成!重置结果:true
# 退出命令
# - b:返回上一级菜单(退出子系统)
# - q:退出整个命令行程序
# 执行启动命令
./smave-server.sh
~/server$ ./smave-server.sh
~/server$ nohup: appending output to 'nohup.out'
cd ~/server/
cat nohup.out
ll logs/2022-03-28/
# 查看运行进程
ps auxg|grep smave-app.jar
# 停止
kill -9 <进程号>
cp -rf build/* ~/server
访问集成服务专用域名。
Ok
x
zo-driver
pom
您项目的启动器容器。
zo-driver/ix-starter
jar
您项目的启动器(主项目)。
jdbcUrl
JDBC连接字符串
port
端口号,整数,不配置使用默认的 3306
options
JsonObject结构,额外的连接池配置
category
数据库种类,默认值:MYSQL5
serverTimezone
Asia/Shanghai
数据库运行时区
# Cross Domain
cors:
credentials: true
methods:
- DELETE
- GET
- POST
- PUT
- OPTIONS
headers:
- Authorization
- Accept
- Content-Disposition
- Content-Encoding
- Content-Length
- Content-Type
- X-App-Id
- X-App-Key
- X-Sigma
- X-Lang
- X-Session-Id
origin: "http://ox.server.cn:6001"
# 访问后端的接口主地址
Z_ENDPOINT=http://ox.server.cn:7000
# 跨域模式的配置
Z_CORS_MODE=cors
Z_CORS_CREDENTIALS=include
{
"global": {
"sigma": "xxxxxx",
"appId": "xxxxxx",
"appKey": "xxxxxx",
"language": "cn",
"active": true,
"createdBy": "zero-environment",
"scope": "vie.app.sv"
},
"application": {
"name": "vie.app.ox"
},
"integration": {
"customerB": {
"name": "partyB",
"config": "init/integration/partyB.json"
}
}
}
#!/usr/bin/env bash
mysql -u root -P 3306 -h 127.0.0.1 -p < conf/init/initialize.sql
echo "[Zero] 数据库表初始化完成"
useUnicode