后端系统运行
[一]创建数据库
[1]创建系统数据库
进入PostgreSQL
的SQL Shell(psql)
(在 Windows 的菜单中可以找到),使用超级管理员账号和密码登录进入数据库,执行以下脚本:
// 以下要分步,一条一条地执行,不要全部复制,一把全部执行。一定要注意每个语句结尾要以“;”结束。
CREATE USER herodotus WITH PASSWORD 'herodotus';
CREATE DATABASE herodotus OWNER herodotus;
GRANT ALL PRIVILEGES ON DATABASE herodotus TO herodotus;
- 这里不管是用户名,用户密码还是数据库名均使用 herodotus 是为了方便,请根据自己实际情况修改。
- 这里没有进行分库(即:所有的服务使用同一个数据库),如不满足需求,请在整体部署完成并且可以正常运行后,再结合自己的实际情况修改。
- 以上是均是以
PostgreSQL
作为默认数据库进行说明。 Linux
环境下在命令行中,以管理员账号登录PostgreSQL
数据库
提示
建表操作由系统负责自动完成,不需要手动操作,具体请看后面的操作步骤。
[2]创建 Nacos 数据库
(1)使用 MySQL 数据库
MySQL 是 Nacos 官方默认的外置数据库。相信大家对 MySQL 建库都很熟悉,就不再赘述。
建库脚本可以从 Nacos 官方 Github 下载,或者在 Dante Cloud 工程的 ${project_home}/configuration/scripts/nacos/sqls
目录下也可以找到。
(2)使用 PostgreSQL 数据库
如果您打算使用 Dante Cloud 自主封装的 Docker 镜像 herodotus/docker-server
,那么就可以使用 PostgreSQL 作为 Nacos 外置数据库。这样 Nacos 就可以和系统使用同一个数据库,无需在额外安装 MySQL。
创建 Nacos 数据库操作,与上一步相同,执行脚本如下:
// 以下要分步,一条一条地执行,不要全部复制,一把全部执行。一定要注意每个语句结尾要以“;”结束。
CREATE USER nacos WITH PASSWORD 'nacos';
CREATE DATABASE nacos OWNER nacos;
GRANT ALL PRIVILEGES ON DATABASE nacos TO nacos;
这里不管是用户名,用户密码还是数据库名均使用 nacos 是为了方便,请根据自己实际情况修改。
数据库创建完成之后,在 Dante Cloud 工程的 ${project_home}/configuration/scripts/nacos/sqls
目录下找到 nacos-postgresql_2.3.2.sql
脚本,用这个脚本建表和初始化 Nacos 数据。
[二]环境配置
[1]套件运行
在正式开始之前,要确保 Nacos、Kafka 相关套件可以正确运行。为了方便,这里使用的是 Docker Compose 方式来部署运行 Nacos、Kafka 如果您采用的是其他的部署安装方式,可以跳过本章节。
(1) 启动 Docker Desktop for Windows
在本地启动 Docker 环境。本地 Docker 环境的安装配置,参见本地 Docker 安装配置
(2) 执行 Docker Compose
在 Dante Cloud 工程的 ${project_home}/configuration/docker/docker-compose/windows
目录下找到 env.base.yml
脚本。
打开 CMD,执行以下命令运行 Docker Compose 脚本。
docker-compose -f ${project_home}/configurations/docker/docker-compose/windows/herodotus/env.base.yml up -d
脚本中的内容可结合自己的实际进行修改,修改后再执行脚本。
提示
env.base.yml
脚本中,进包含了 Nacos 和 Kafka,由于 ELK 等其他套件非常占用资源而且本地开发通常也不需要。- 如果需要安装全套资源,请只用
env.full.base.yml
- 新的版本中,为了减少环境依赖,改用纯 Kafka 镜像,无须再运行 Zookeeper。如果需要使用 Debezium,建议使用 Debezium 官方 Kafka 镜像,这种方式下还是需要使用 Zookeeper,详情参见 Debezium 官网。
[2]导入 Nacos 配置
提示
在进行以下操作之前,建议对 Nacos 中 Namespace,Group 等基础概念和具体操作先行做一定的了解。【官方文档】
方式一:手动创建 Nacos 配置信息
创建配置之前,请提前规划配置放置的命名空间(Namespace)。默认是放到 Nacos public
命名空间中,如果不符合您的需求,可以在新建命名空间之后,再进行配置的创建。
工程的 ${project_home}/configurations/backup/yamls
目录下,放置着所有需要导入到 Nacos
中的默认配置。开始其它工作之前,需要先在 Nacos 中创建所有配置
- 访问
Nacos
后台管理,默认本机地址, 使用默认账号nacos/nacos
登录。 - 在
Nacos
后台中,在配置管理 --> 配置列表
功能中,点击添加按钮,手动添加所有配置文件,操作如下图所示:
提示
${project_home}/configurations/backup/yamls
目录下,还有一级目录。这级目录的名称,是配置文件对应 Nacos
中的 Group
名称。所以在 Nacos
中新建配置时,一定要注意 Group
的创建和匹配。切勿全部新建到 DEFAULT_GROUP
组下,这样会导致无法正常运行。
方式二:批量导入 Nacos 配置
手动方式创建 Nacos 配置,比较繁琐和容易出错。为了使用提升使用的便捷性,在工程 ${project_home}/configurations/backup/alibaba
目录下提供可以直接导入的配置包。可以方便的完成导入配置,创建Group
等操作。
- 访问
Nacos
后台管理,默认本机地址, 使用默认账号nacos/nacos
登录。 - 在
Nacos
后台中,在配置管理 --> 配置列表
功能中,点击导入配置按钮,选择配置导入包即可,完成配置文件导入和 Group 的创建,操作如下图所示:
[3]修改 Nacos 配置
上一步所导入的配置参数均是使用默认的、本地化的配置,需要根据自己搭建的基础设施环境,对相关的配置进行修改。
- 访问
Nacos
后台管理,默认本机地址, 使用默认账号nacos/nacos
登录。 - 找到对应的配置文件进行修改。常用的设置在
herodotus-cloud-environment.yaml
中即可修改完成,如果不满足您实际需求,可再到其它的配置文件中详细修改。
说明
为了方便使用,Dante Cloud 所有的配置采用**“共享式,统一化多环境配置模式”**设计,大多数配置在对应 多环境
的 herodotus-cloud-environment.yaml
配置中就可以完成修改。例如,您当前使用的是 development
环境,那么在 Nacos 后台管理中,找到 Group 是 development
的 herodotus-cloud-environment.yaml
配置修改。
Dante Cloud 多环境配置设计及使用,参阅:【架构与设计】-> 多环境配置
[4]检出代码创建工程
IDEA
菜单 File -> New -> Project From Version Control...
, 在弹出框中输入本工程 Git 地址:https://gitee.com/dromara/dante-cloud.git,然后设置放置目录,点击 OK 即可
提示
不建议直接从 Gitee 或 Github 上,以 下载 ZIP 的方式获取代码。因为代码中集成了 git 信息打包工具,依赖于工程中的 .git
目录,用于查看 git 版本信息,相关信息也可在 Spring Boot Admin
中查看。直接以 ZIP 方式下载代码,可能会因找不到 .git
目录而导致编译出错。
[5]修改 pom.xml 配置
在工程根目录下,找到 pom.xml
, 修改对应 profile
中参数。由于使用的多环境,所以在该文件中,需要找到应环境的配置,修改该环境下的对应的配置信息。主要结构如下所示:
<!-- 开发 -->
<profile>
<id>development</id>
<activation>
<!--默认激活配置-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--当前环境-->
<profile>development</profile>
<database>postgresql</database>
<!--基础设施:tencent、alibaba、spring-->
<facility>alibaba</facility>
<!--代码构建控制-->
<!--跳过构建源代码包-->
<skip.build.source.package>false</skip.build.source.package>
<!--不copy代码包到docker构建目录-->
<skip.copy.docker.resource>false</skip.copy.docker.resource>
<!--不执行git commit 构建-->
<skip.build.git.commit.info>false</skip.build.git.commit.info>
<!--Spring Cloud Alibaba配置中心命名空间,用于支持多环境.这里必须使用ID,不能使用名称,默认为空-->
<alibaba.namespace>2e4f5cf6-2ac8-4fe0-99be-b0562659c120</alibaba.namespace>
<!--Spring Cloud Alibaba配置中心地址-->
<alibaba.config.server-addr>192.168.101.10:8848</alibaba.config.server-addr>
<!--Spring Cloud Alibaba服务发现地址-->
<alibaba.discovery.server-addr>192.168.101.10:8848</alibaba.discovery.server-addr>
<alibaba.sentinel.server-addr>192.168.101.10:8858</alibaba.sentinel.server-addr>
<tencent.polaris.namespace>default</tencent.polaris.namespace>
<!--Spring Cloud Tencent 配置 【(8091)grpc/tcp,默认注册中心端口;(8090)http/tcp,默认注册中心端口】-->
<tencent.polaris.server-addr>192.168.101.10:8091</tencent.polaris.server-addr>
<!--Spring Cloud Tencent Config 配置 【(8093)grpc/tcp,默认配置中心端口】-->
<tencent.polaris.config-addr>192.168.101.10:8093</tencent.polaris.config-addr>
<!--Spring Cloud Tencent 本地缓存目录-->
<tencent.polaris.local.dir>./configurations/configs/tencent/backup/config</tencent.polaris.local.dir>
</properties>
必须要修改的参数涉及以下几项:
- alibaba.namespace:Nacos 命名空间 ID。如果要使用的是默认的命名空间,该参数不设置任何值。
- alibaba.config.server-addr:配置中心地址,即 Nacos 服务端地址
- alibaba.discovery.server-addr:服务发现地址,即 Nacos 服务端地址
- alibaba.sentinel.server-addr:Sentinel Dashborad 地址
[6]代码编译
注意
对工程根目录下 pom.xml
中的参数进行修改,一定要重新编译代码,这样修改后的参数才会生效
编译方式一
用命令行进入到工程代码所在根据目录,通过执行下面命令进行编译
mvn install
或
mvn package
注意
在第一次编译的时候,因为在本地缓存缺少相关的包,所以在执行 mvn clean
操作时会提示错误。因此,在第一次编译时只使用 mvn package
或 mvn install
。第一次编译完成之后,就可以使用 mvn clean package
或 mvn clean install
命令进行编译。IDE 界面操作也是同理。
编译方式二
在 IDE 工程中,利用 IDE 提供的界面操作进行编译。
以IDEA
为例,在右侧Maven Panel
中,选择dante-cloud(root)
节点,点击 Lifecycle 节点下的install
或者 package
进行编译。参考下图:
详细参数说明,参阅:【架构与设计】-> 多环境配置
[三]创建数据表
警告
正式环境一定要提前做好数据备份
[1]修改配置
- 进入 Nacos 管理界面。找到您所使用的对应
多环境
下的herodotus-cloud-environment.yaml
配置文件
例如,您当前使用的是 development
环境,那么在 Nacos 后台管理中,找到 Group
是 development
的 herodotus-cloud-environment.yaml
配置。多环境配置,参阅:【架构与设计】-> 多环境配置
- 设置
herodotus-cloud-environment.yaml
配置文件中属性herodotus.switch.database.ddl-auto
的值为create
或update
- 如果是
MySQL
数据库的初次部署,那么最好将herodotus.switch.database.ddl-auto
的值设置为update
,否则就会出错。 herodotus.switch.database.ddl-auto
的值设置为update
, 再次运行服务,由于Hibernate
不同方言实现逻辑的不同,在有些数据库下运行,例如:PostgreSQL
, 对于某些兼容性问题,只是输出告警;在某些数据库下运行,例如 MySQL,对于某些兼容性问题,会直接抛出 Exception。所以出现这种情况,只要服务继续在运行就不是系统 BUG;如果出错直接导致服务运行停止,那么请报ISSUE
。
- 点击
发布
按钮,发布配置,让配置生效
[2]启动服务建表
1. 运行 UpmsApplication
服务
UpmsApplication
服务第一次正常运行之后,所有核心业务表都已经创建,UpmsApplication
服务中所有接口都已经存入 sys_interface
表中并转换为权限数据存入sys_attribute
表中。
如果看到有数据库表创建,同时
sys_authority
表中有数据,证明数据库表创建成功。
2. 运行 UaaApplication
服务
UaaApplication
服务第一次正常运行之后,所有 OAuth2 认证相关表都已经创建。UaaApplication
服务中所有接口都已经存入 sys_interface
表中并转换为权限数据存入sys_attribute
表中。
如果看到有以
oauth2_
开头的数据表创建,证明数据库表创建成功。
3. 运行 MessageApplication
服务
MessageApplication
服务第一次正常运行之后,所有站内消息等相关表都已经创建。MessageApplication
服务中所有接口都已经存入 sys_interface
表中并转换为权限数据存入sys_attribute
表中。
如果看到有以
msg_
开头的数据表创建,证明数据库表创建成功。
4. 运行 OssAbilityApplication
服务
OssAbilityApplication
服务第一次正常运行之后,OssAbilityApplication
服务中所有接口都已经存入 sys_interface
表中并转换为权限数据存入sys_attribute
表中。
为什么表结构的创建不提供脚本?
主要出于以下考虑:
- 一方面系统默认使用 Spring Data JPA 已经支持了自动建表,数据表的创建和更新都很方便,仅有的问题对于 MySQL 方言支持的一般,会有错误提示,但是不影响整体初始化逻辑。
- 另一方面微服务架构相比单体应用来说庞大得多,需要关注的内容也扩展了很多倍。提供数据库表结构的脚本,就意味随时要去关注这个 SQL 脚本的更新问题,一旦有遗漏就很容出错,会浪费很多时间和精力,得不偿失。
[3]服务启动顺序说明
1.核心服务
- UpmsApplication (用户中心服务 必需)
- UaaApplication (统一认证服务 必需)
- MessageApplication (平台消息服务 必需)
- OssAbilityApplication (对象存储服务 必需)
- GatewayApplication (服务网关服务 必需)
因 UpmsApplication 服务中包含权限数据汇总和分发机制,所以 UpmsApplication 服务要最先启动。UaaApplication、MessageApplication 和 OssAbilityApplication 服务启动顺序没有硬性要求。GatewayApplication 启动顺序没有硬性要求,建议可以放在最后启动
2.其它服务
- MonitorApplication (监控中心服务 可选)
- BpmnAbilityApplication (分布式工作流 可选)
建议 MonitorApplication 服务在所有服务启动之后,再行启动。
[四]数据库初始化
系统提供自动初始化和手动初始化数据库两种方式。自动化初始化数据库的机制完全由 Spring Data JPA 提供,使用习惯之后非常便捷。但是项目开源至今,发现很多人还是喜欢手动导数据,也提供了数据库初始化脚本。也正因为如此,也修改了本部分说明,主要说明手动导入数据,自动导入数据仅做说明供对此感兴趣的朋友参考。
[1]方式一:手动初始化
- 设置
herodotus-cloud-environment.yaml
配置文件中属性herodotus.switch.database.ddl-auto
的值为update
或none
。 - 在工程
${project_home}/platform/herodotus-cloud-oss-ability/resources/sqls
目录下,可以找到对应数据库数据初始化脚本。可以用你喜欢的方式导入数据库。
警告
要按照前面步骤,保证 UpmsApplication
、UaaApplication
、MessageApplication
、OssAbilityApplication
几个服务均已经正常运行过、服务中所有接口都已经转换为权限数据存入sys_attribute
表中以后,在执行数据库初始化脚本。
因为,数据库初始化脚本中,最后一条 SQL 语句,是根据 sys_attribute
表中存储的数据,动态生成权限数据。如果过早执行数据库初始化脚本,会导致权限数据创建不完整,前端出现“没有权限”提示问题。
[2]方式二:自动初始化
- 停止
OssAbilityApplication
服务 - 进入 Nacos 管理界面。找到您所使用的对应
多环境
下的herodotus-cloud-environment.yaml
配置文件。 - 设置
herodotus-cloud-environment.yaml
配置文件中属性herodotus.switch.database.ddl-auto
的值为update
或none
- 设置
herodotus-cloud-environment.yaml
配置文件中属性herodotus.switch.database.init-mode
的值为always
- 点击
发布
按钮,发布配置,让配置生效。 - 如果默认使用的不是
PostgreSQL
数据库,需要修改${project_home}/platform/herodotus-cloud-oss-ability/resources/bootstrap.yml
中spring.sql.init.data-locations
配置,放开您所使用数据库对应的 SQL 脚本。注释掉其它 SQL 脚本 - 再次运行
OssAbilityApplication
服务。
OssAbilityApplication
服务再一次正常运行之后,如果sys_user
,sys_role
,sys_role_permission
等表中都都已经有数据了,证明数据初始化成功。
自动初始化基本原理
Dante Cloud 数据库自动初始化,采用的是 Spring Boot
提供的数据库 SQL 脚本的执行机制。将已生成好的数据库 SQL 脚本,放入到代码工程的resources
目录下,按照指定格式命名,通过修改配置就可以实现 SQL 脚本的自动执行。
具体 SQL 文件名的格式为:schema-${platform}.sql
和 data-${platform}.sql
。platform
是用来指定不同的数据库类型,以此来实现不同数据库脚本的切换。
schema-${platform}.sql
:主要放置数据库定义语言(DDL
)SQL 脚本,例如:数据库表,视图,存储过程等。data-${platform}.sql
:主要放置数据操纵语言(DML
)SQL 脚本,例如:最经常用到的 SELECT,UPDATE,INSERT,DELETE。
由此可见,
schema-${platform}.sql
是先于data-${platform}.sql
执行的。
主要涉及需要修改的配置参数如下表所示:
配置 | 说明 |
---|---|
spring.sql.init.mode | 用于控制脚本执行状态。 |
spring.sql.init.platform | 数据库类型,主要用于在 data-locations 和 schema-locations 中定位不同数据库的脚本 |
spring.sql.init.data-locations | DML SQL 文件路径 |
spring.sql.init.schema-locations | DDL SQL 文件路径 |
这里要特别注意 spring.sql.init.mode
参数。
spring.sql.init.mode
参数包含以下几个值,具体含义见下表:
属性 | 说明 |
---|---|
always | 总是执行,相当于开启 |
never | 不执行,相当于关闭 |
embedded | 仅初始化嵌入式数据库,特殊需求和设计会用到 |
[3]回置配置
如果您使用了自动初始化的方式,一定要进行回置配置的操作
- 停止
OssAbilityApplication
服务 - 进入 Nacos 管理界面。找到您所使用的对应
多环境
下的herodotus-cloud-environment.yaml
配置文件。 - 设置
herodotus-cloud-environment.yaml
配置文件中属性herodotus.switch.database.init-mode
的值重置为never
。 - 检查
herodotus-cloud-environment.yaml
配置文件中属性herodotus.switch.database.ddl-auto
的值为update
或none
- 点击
发布
按钮,发布配置,让配置生效。
为什么回置并再次检查?
Dante Cloud 使用 Spring Data JPA
提供的机制实现数据库自动建表。 Spring Data JPA
数据库自动建表依赖的 Hibernate
,通过配置参数传递实现建表的控制。其中比较关键的参数就是 spring.jpa.hibernate.ddl-auto
。
spring.jpa.hibernate.ddl-auto
参数包含以下几个值,具体含义见下表:
属性 | 说明 |
---|---|
create | 每次加载 hibernate 时都会删除上一次的生成的表,再重新根据 model(与数据库表对应的实体)生成表,因此可能会导致数据丢失。 |
create-drop | 每次加载 hibernate 时根据 model 类生成表,服务一关闭,表就自动删除。该设置适用于演示环境等特殊场景使用 |
update | 最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构,再次使用时自动更新表结构,原有数据不会清空。 |
validate | 每次加载 hibernate 时,会校验数据与数据库的字段类型是否相同,字段不同会报错。 |
none | 不进行任何操作 |
- 如果
herodotus.switch.database.ddl-auto
的值为create
或create-drop
,再次启动服务会重新建表,那么前面的工作就白做了。 - 如果
herodotus.switch.database.init-mode
的值为always
,再次启动服务会再次执行 SQL 脚本,必定出现主键冲突问题导致失败。
[五]重置缓存
有过项目开发经验,特别是有过数据库数据缓存使用经验的朋友肯定都知道:如果系统中使用了数据库数据缓存,那么直接手动修改数据库的数据,就会导致数据库数据和缓存数据的不一致,而出现系统界面操作或显示,与预期不一致的情况。想要解决这类问题,要么在有条件的情况下清除缓存让缓存再重新生成,要么就只能等待相关查询产生的缓存过期后再次出发查询操作重新生成。
说明缓存这个问题的原因是,本系统中默认也启动了缓存,而且是多级缓存(Caffeine 本地 + Redis 远程)。这就导致一定会出现上面所说的问题,特别是在第一次搭建本系统时,如果某个步骤顺序错误,比如:数据库没有进行初始化,就运行前端界面进行操作,那么就会产生错误的缓存(JPA (Hibernate) 是基于 SQL 语句进行数据缓存的)
所以为了规避因缓存原因而产生让人莫名奇妙的问题,在以上步骤均完成之后(数据库初始化完成之后),一定要按照以下步骤进行缓存重置
- 停止所有服务
- 清空 Redis 缓存数据
- 再次运行所有服务
[六]部署完成
至此,所有的部署操作完成,就可以正常使用 Dante Cloud 开展各项工作。如何验证是否安装成功,请看其它章节。