# 启动须知 启动项目前,认真阅读 [简介](default.md) 章节的 `模式介绍` 小节,了解本项目支持的几种租户模式 | 模式\描述 | 表中有无租户字段 | 实体类中有无租户字段 | 分布式事务| 有几个数据库 | |---|---|---|---|---| | NONE | 无 | 无 | 支持 | zuihou_none | | COLUMN | 有 | 无 | 支持 | zuihou_column | | SCHEMA | 无 | 无 | 支持 | zuihou_defaults、zuihou_base_{tenant}、zuihou_extend_{tenant} | | DATASOURCE | 无 | 无 | 支持 | zuihou_defaults、zuihou_base_{tenant}、zuihou_extend_{tenant} | ## SCHEMA、DATASOURCE 模式各个服务介绍 | 后台服务 | 项目名 | 启动时连接的库 | 运行时租户库 | 功能描述 | |---|---|---|---|---| | 认证服务 | zuihou-oauth | zuihou_defaults | zuihou_base_{tenant} | 负责登录、用户必备的数据接口 | | 权限服务 | zuihou-authority | zuihou_defaults | zuihou_base_{tenant} | 权限、公共、组织架构等基础功能。 后期考虑更名为 zuihou-base(欢迎提建议) | | 文件服务 | zuihou-file | zuihou_defaults | zuihou_base_{tenant} | 负责文件上传、下载等功能 | | 消息服务 | zuihou-msgs | zuihou_defaults | zuihou_base_{tenant} | 负责站内信、消息、短信、邮件等功能 | | 租户服务 | zuihou-tenant | zuihou_defaults | zuihou_defaults | 负责租户模式管理租户 | | 网关服务 | zuihou-gate | zuihou_defaults | zuihou_extend_{tenant} | 负责统一路由、认证、限流等 | | 订单服务 | zuihou-order | zuihou_defaults | zuihou_extend_{tenant} | 演示用 | | 演示服务 | zuihou-demo | zuihou_defaults | zuihou_extend_{tenant} | 演示用 | | 定时服务 | zuihou-jobs | zuihou_defaults | zuihou_base_{tenant}、zuihou_extend_{tenant} | 负责定时任务 | ## 创建数据库 1. 执行 docs/sql/1.先执行我,创建数据库.sql 脚本,创建6个数据库. ~~~ zuihou_defaults: 默认库,NONE、SCHEMA、DATASOURCE 模式使用 zuihou_base_0000: 内置租户0000 的基础库 zuihou_extend_0000: 内置租户0000 的扩展库 zuihou_column: COLUMN模式使用, 该库中所有的业务表都有 tenant_code 字段 zuihou_none: NONE模式使用 zuihou_zipkin: zipkin 服务端使用 zuihou_nacos_121: nacos 服务端使用 zuihou_seata: seata 服务端使用 ~~~ 2. 向 zuihou_zipkin库导入脚本: docs/sql/zuihou_zipkin.sql 3. 根据您想要使用的租户模式,合理的导入脚本 * [ ] NONE - 向 zuihou_none 库导入 zuihou_defaults.sql - 向 zuihou_none 库导入 zuihou_base_0000.sql - 向 zuihou_none 库导入 zuihou_extend_0000.sql * [ ] COLUMN - 向 zuihou_column 库导入 zuihou_defaults.sql - 向 zuihou_column 库导入 zuihou_column.sql 该模式若想分库参考none模式分库。 * [ ] SCHEMA - 向 zuihou_defaults 库导入 zuihou_defaults.sql - 向 zuihou_base_0000 库导入 zuihou_base_0000.sql - 向 zuihou_extend_0000 库导入 zuihou_extend_0000.sql * [ ] DATASOURCE - 向 zuihou_defaults 库导入 zuihou_defaults.sql - 向 zuihou_base_0000 库导入 zuihou_base_0000.sql - 向 zuihou_extend_0000 库导入 zuihou_extend_0000.sql > zuihou_base_0000.sql、zuihou_base_0000.sql 和 zuihou_column.sql 脚本的区别在于,zuihou_column.sql的表里面都有一个 tenant_code 字段, 且zuihou_base_0000.sql + zuihou_base_0000.sql = zuihou_column.sql ## 如何让每一个服务连自己的的库? mysql.yml 里面配置一个全局的数据库信息,每个服务连接的信息跟mysql.yml不一致时, 在zuihou-xxx-server.yml 配置文件中覆盖mysql.yml的配置即可。 1. NONE ``` zuihou: mysql: database: zuihou_defaults # 修改成自己想要的 业务库 database: tenantDatabasePrefix: zuihou_base # 该模式忽略该参数 multiTenantType: NONE ``` 2. COLUMN ``` zuihou: mysql: database: zuihou_column_all # 修改成自己想要的 业务库 database: tenantDatabasePrefix: zuihou_base # 该模式忽略该参数 multiTenantType: COLUMN ``` 3. SCHEMA ``` zuihou: mysql: database: zuihou_defaults # 修改成自己想要的 默认库 database: tenantDatabasePrefix: zuihou_base # 修改成自己想要的 租户库前缀 multiTenantType: SCHEMA ``` 4. DATASOURCE ``` zuihou: mysql: database: zuihou_defaults # 修改成自己想要的 默认库 database: tenantDatabasePrefix: zuihou_base # 修改成自己想要的 租户库前缀 multiTenantType: DATASOURCE ``` ## 分库原则: SCHEMA模式和DATASOURCE模式不建议每个服务一个库,假设权限、文件、消息、认证、网关服务每个服务独立数据库(共5个), 那么新增一个租户时,租户库会成倍的增加, 会占用N * 5个库(还有一个默认库)。 COLUMN和NONE模式则不用考虑上述问题。 鉴于此,合理的合库至关重要,在本系统中,权限、消息、文件、认证服务等都可以理解成基础功能,而网关、订单、demo服务等属于扩展功能, 使用本框架二次开发某种类型的项目时(如商城、ERP、CMS等)可以理解成业务功能, 所以推荐分库规则为: 1. 租户服务、定时任务 共用默认库,命名规则为 zuihou_defaults 2. 权限、消息、文件、认证服务 共用基础库,命名规则为 zuihou_base_{TENANT} 3. 网关、订单、demo服务 共用扩展库,命名规则为 zuihou_extend_{TENANT} 4. 二次开发时可以新建一个业务库,命名规则为 zuihou_biz_{TENANT} # 正式开始修改配置,启动项目 ## 修改配置 1. 参考 [环境准备](环境准备.md) , 将所有配置导入 nacos 中**新建的命名空间**中,并在**nacos**中修改mysql、redis、rabbitmq等信息。 2. 修改 `src/main/filters/config-dev.properties` 文件的的配置, 将nacos 的ip 、端口、namespace、username、password 修改成自己刚创建的命名空间!!! (强烈建议namespace跟我的保持一致,减少出错概率!!!) ~~~ nacos.ip=127.0.0.1 nacos.port=8848 nacos.namespace=b16f7baf-56e7-4f4e-a26c-425ee0668016 nacos.username=nacos nacos.password=nacos nacos.seata.namespace=3cca7d98-3b1c-44d3-90e5-86abaaf0048a # seata 的 grouplist ip seata.ip=127.0.0.1 # seata 的 grouplist 端口 seata.port=8091 logging.file.path=/data/projects/logs ~~~ 3. 修改 zuihou-jobs-server 项目的配置: - 由于 zuihou-jobs-server 不是SpringCloud 的项目,它是独立的一个SpringBoot项目,所以配置文件没放在nacos中 - 配置文件路径:`zuihou-jobs/zuihou-jobs-server/src/main/resources/application.yml` ~~~ zuihou: redis: ip: 127.0.0.1 port: 16379 password: SbtyMveYNfLzTks7H0apCmyStPzWJqjy mysql: database: zuihou_defaults # 默认库 ip: ${MYSQL_IP:127.0.0.1} # 修改为 数据库IP username: root password: root port: 3306 driverClassName: com.mysql.cj.jdbc.Driver database: multiTenantType: SCHEMA # 模式 tenantDatabasePrefix: zuihou_base ~~~ 4. 修改项目日志存放路径,位置: `src/main/filters/config-dev.properties` : ~~~ logging.file.path=/data/projects/logs # window系统,会在当前项目代码所有盘的根路路径自动创建,所以无需修改,如:d://data//projects/logs # mac 系统和linux系统,需要手动创建 /data/projects/logs 目录,或者修改成别的已经存在且有写入权限的目录。 # mac系统创建目录并授权: # mkdir -p /data/projects/logs/ # chown -R ${USER}:wheel /data/projects/logs ~~~ 5. 编译项目: 进入项目根目录, 使用命令编译项目: ~~~ clean install -DskipTests=true -T8 -P dev -f pom.xml ~~~ 或者在IDEA中,使用Maven插件编译 : 选中`Toggle 'skip Tests' Module`按钮、选中`Profiles` - `dev` 、同时选中`clean` + `insatll` 、右键 `Run Maven Build` ,然后等待编译完成。 ![](https://img.kancloud.cn/32/8c/328c3f12191e66e1be3b98683afc4d2b_2326x2130.png) ## 启动前再次强调! 1. nacos里面新建命名空间 2. 在新建的命名空间下导入`third-party/nacos/clientConfig` 下面的所有配置 3. 在naocs配置列表修改 `redis.yml` 、 `mysql.yml`和`rabbitmq.yml` 4. 将 `src/main/filters/config-dev.properties` 里面的 `nacos.xxx` 属性修改成自己的nacos对应的属性。 5. 使用IDEA执行 `clean install ` 编译项目!!! (可以用命令行执行,也可以用IDEA的maven工具执行) 6. 绝大多数启动失败的朋友都是忽略了以上这几步 ## 工程启动顺序 1. 先启动`rabbitmq`、`redis`、`mysql`、`nacos`等基础服务。 rabbitmq 和 redis 可以修改配置后不用启动。 2. 启动`seata-server` (可选, 目前分布式事务只是测试阶段,所以本项目中,只作为演示使用) 3. 启动`OauthApplication`(必须)、`AuthorityApplication` 、 `FileServerApplication`、 `MsgsServerApplication`、`JobsServerApplication`、`MonitorApplication(可选)` 项目 ![](https://img.kancloud.cn/16/2e/162eda7db4747d37a3fbe9304e1edb35_982x760.png) 4. 启动 `OrderServerApplication`、`DemoServerApplication`项目(可选,主要用于演示分布式事务和一些测试方法,这2个服务启动时报错,大都是因为seata-server没启动成功,请认真阅读环境准备章节) 5. 最后启动`ZuulServerApplication` 或者 `GatewayServerApplication` (必须)其中之一 ![](https://img.kancloud.cn/f6/79/f679532ee6c87d9ae5dc7a7133a2b184_926x790.png) 6. 建议使用`GatewayServerApplication`, 因为`ZuulServerApplication` 性能较差。 7. 平时开发时,可以按需启动,像Monitor、Zipkin等只需要生产环境启动即可。 8. zipkin启动,请参考:[zipkin配置\(2.19以上版本\)](zipkin配置2.19以上版本.md) ## 验证服务是否启动成功 - 打开nacos[http://localhost:8848/nacos](http://localhost:8848/nacos)若看到下图,则说明服务注册成功 ![](https://img.kancloud.cn/b9/e6/b9e6a980694859e9ac1e988d147becf9_3798x1502.png) - 或者打开项目控制台,看到打印的如图信息说明启动成功。 ![](https://img.kancloud.cn/30/e1/30e196a1198570319f5834d54c2f83c7_3632x1150.png) - 访问一下地址: ``` 认证服务文档:http://127.0.0.1:8773/doc.html 租户服务文档:http://127.0.0.1:8771/doc.html 权限服务文档:http://127.0.0.1:8764/doc.html 文件服务文档:http://127.0.0.1:8765/doc.html 消息服务文档:http://127.0.0.1:8768/doc.html 订单服务文档:http://127.0.0.1:8769/doc.html demo服务文档:http://127.0.0.1:8770/doc.html zuul网关聚合文档:http://127.0.0.1:8760/api/gate/doc.html gateway网关聚合文档:http://127.0.0.1:8760/api/doc.html 定时任务后台:http://127.0.0.1:8767/zuihou-jobs-server 全链路监控:http://127.0.0.1:8772/zipkin SpringBootAdmin监控:http://127.0.0.1:8762/zuihou-monitor ``` ## 启动成功后,看看启动日志是否异常? 启动后控制台会打印一些彩色的日志,其中蓝色字体的日志均为正常。部分红色日志为警告,注意以下日志: 1, 加载nacos数据的日志(蓝色), 正常的项目启动后会打印加载出以下配置文件:common.yml、redis.yml、mysql.yml、rabbitmq.yml、zuihou-authority-server.yml等 。 (SpringCloudAlibaba2.2.0 将不会打印这些日志) ``` 2019-12-05 11:56:31.302:[ INFO] [main:2231] [c.a.cloud.nacos.client.NacosPropertySourceBuilder.loadNacosData:87] --> Loading nacos data, dataId: 'common.yml', group: 'DEFAULT_GROUP' 2019-12-05 11:56:31.320:[ INFO] [main:2249] [c.a.cloud.nacos.client.NacosPropertySourceBuilder.loadNacosData:87] --> Loading nacos data, dataId: 'redis.yml', group: 'DEFAULT_GROUP' 2019-12-05 11:56:31.327:[ INFO] [main:2256] [c.a.cloud.nacos.client.NacosPropertySourceBuilder.loadNacosData:87] --> Loading nacos data, dataId: 'mysql.yml', group: 'DEFAULT_GROUP' 2019-12-05 11:56:31.333:[ INFO] [main:2262] [c.a.cloud.nacos.client.NacosPropertySourceBuilder.loadNacosData:87] --> Loading nacos data, dataId: 'rabbitmq.yml', group: 'DEFAULT_GROUP' 2019-12-05 11:56:31.337:[ INFO] [main:2266] [c.a.cloud.nacos.client.NacosPropertySourceBuilder.loadNacosData:87] --> Loading nacos data, dataId: 'zuihou-authority-server.yml', group: 'DEFAULT_GROUP' 2019-12-05 11:56:31.340:[ INFO] [main:2269] [c.a.cloud.nacos.client.NacosPropertySourceBuilder.loadNacosData:87] --> Loading nacos data, dataId: 'zuihou-authority-server-dev.yml', group: 'DEFAULT_GROUP' ``` 2,警告日志(红色),出现以下红色日志时,给人的第一反应就是报错了? 其实不是,这只是SpringBoot 的EndpointId警告这几个端点命名不规范: service-registry、nacos-config、nacos-discovery、histrxy.stream 等, ``` 2019-12-05 11:56:33.312:[ WARN] [main:4241] [o.springframework.boot.actuate.endpoint.EndpointId.logWarning:135] --> Endpoint ID 'nacos-config' contains invalid characters, please migrate to a valid format. 2019-12-05 11:56:33.316:[ WARN] [main:4245] [o.springframework.boot.actuate.endpoint.EndpointId.logWarning:135] --> Endpoint ID 'nacos-discovery' contains invalid characters, please migrate to a valid format. 2019-12-05 11:56:33.875:[ WARN] [main:4804] [o.springframework.boot.actuate.endpoint.EndpointId.logWarning:135] --> Endpoint ID 'service-registry' contains invalid characters, please migrate to a valid format. ``` 3,警告日志(红色):该警告不知道有啥用。 解决方案为:在src/main/resources下添加空的config.properties ``` 2019-12-05 11:56:35.969:[ WARN] [main:6898] [com.netflix.config.sources.URLConfigurationSource.<init>:121] --> No URLs will be polled as dynamic configuration sources. ``` ## 至此,后端就全部启动完成 若看完文档,启动还是有很多问题,请参考 [视频](启动视频.md)