# cat-taxi
**Repository Path**: AYueBlog/cat-taxi
## Basic Information
- **Project Name**: cat-taxi
- **Description**: 基于华夏代驾的软改出来的猫咪打车
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 5
- **Created**: 2024-11-25
- **Last Updated**: 2024-11-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
猫咪打车
# 0X0 项目已死,根本无法复现华夏打车项目
多端全栈项目实战,大型商业级代驾业务全流程落地 --by 华夏打车
# 0X1 关于作者的碎碎念
5天!!!愤怒脸!你知道我5天是怎么过来的吗?花费无数精力去按照文档与视频搭建项目,中途的坑让我一一道来。
# 0X2 我所见到恶心坑
## 首先第一坑
在使用docker安装各种各样的服务中间件的时候不会给你版本号,那么没有版本号视频是怎么安装的呢? 疑惑脸?好好好,这算是问到点子上了,视频怎么做的,他狗日是直接本地导入镜像的,说白了就是直接吧镜像打包好然后用docker的load命令直接加载。草(草本植物的一种代称)!!!你这样根本不知道他用了什么版本,兼容性问题会让你在后面埋下一颗大雷。
## 第二坑
在安装**ShardingSphere**这个玩意的时候我是真的有点想停止复现的想法了,首先这个没有版本号,我在前面提过了。然后,视频里面提到说是用的5.0版本,TNND,我安装的时候各种报错,jdk下了又下11-17版本都下了个遍,最离谱的还是 ShardingSphere这个中间件,我从5.0版本硬是下到了5.5版本中间的每个版本都挨个测试了一遍。好不容易解决兼容问题,这个项目作者还是会藏的啊,这个ShardingSphere中间件是打包好,里面的配置文件写的明明白白。而我还闷在鼓里,一遍遍跑,然后提示没有配置文件,报错!
最后去网上查才知道少了配置文件,然后文档的配置文件让我想死的心都有了,残缺不堪,每段只截取一部分,我花了一天的时间,我只记得凌晨4点我才睡的觉。万幸的是我把配置文件还原了出来,你可以看看那 2.4章节的配置文件有多长。但是我知道,有的核心部分我是真的复现不出来,后期肯定会暴雷!
## 第三坑
当我把所有的项目中间件都搭建完了,自豪脸!!我刚准备写代码的时候,视频给我迎头重击,视频说项目代码环境已经全部都写好了,你们可以直接套那个初始化代码模板就行了,然后就直接开始写Serve层代码了,每个项目工程都不介绍的,草!!!我翻遍**全网**也没有(你知道我能搭建私有docker仓库,我就有这个能力)初始化模板代码!无奈只能copy别人写好的代码,还copy几份不同的,然后拼接把项目跑出来了。


## 最后一坑直接放弃了,这也是我直接弃坑的主要原因
在跑前端环境的时候根本就跑不起来,微信小程序的插件我除了ocr,我一个都用不了,这意味着我的地图的导航,路线规划,乃至我最基本的地图都使用不了。
最可恨的是,我想查询某些接口的时候,我无意间翻到了一个配置文件里面居然调用了支付接口(为什么知道,原来我做过支付模块所以对这个熟悉的很)它哪怕不写注释我也知道这个是支付模块。支付模块不可怕,可怕的是微信支付模块,众所周知微信的支付模块是需要你去真的开个公司的。我哪里有这个条件哦,小程序的那些插件查了一下,也是需要开通企业级的资质,第二次呐喊,我哪里有那个条件哦。最后想了一下,跑一下vue前端的管理页面吧,好好好,直接雷击,压根无法运行,大片飘红,报错信息更是毫无逻辑,翻了一下网上的解决方案,就是没有解决方案。到此结束。最后放上一张解脱画面。

# 1 系统环境部署
## 1.1 虚拟机与Centos配置
首先Linux的安装不再赘述,版本Centos7-2009版本。
PS:现在是2024年7月1日编写的文档,而CentOS官方宣布了停止维护CentOS的计划,CentOS 6已于2020年11月30日停止维护,CentOS 7已于2024年06月30日停止维护。但是对项目当前来讲系统停止维护没有任何影响。
但是考虑到后面的几年yum等安装方法可能受到大幅度的影响,如果可以进行平替的话,建议对系统进行平替。
唯一要注意的是采用VMware虚拟机系统安装的配置,流畅运行配置如下,当然,这里面采用最小化这里可以酌情精简配置:

**这里使用双网卡,一个是桥接网卡,另一个是net网卡,一个用于对外网络通信,一个用于局域网内部访问。**
举个栗子:
| 网卡 | 模式 | 地址/网关 |
| -------- | ------ | ----------------------------- |
| 桥接网卡 | static | 192.168.8.12 / 192.168.8.1 |
| net网卡 | static | 192.168.10.100 / 192.168.10.2 |
当然这里面还涉及到了系统的端口映射,就放到docker容器部署里面讲了。
# 2 docker容器部署
VMware中nat端口转发必要性:因为项目需要对外暴露,也就是说让别人的电脑也可以连上这台虚拟机。这时候使用nat模式的话是无法将虚拟机给其他的电脑进行连接,只能本机进行访问。这就意味,ssh远程访问,MySQL,redis等服务无法给其他的电脑进行连接,这里就需要引入VMware的端口转发功能,将你需要的功能进行转发。
端口转发如图:
| 服务 | 本机端口(宿主机) | docker服务器端口(子主机) | 服务源端口 |
| -------------- | ------------------- | -------------------------- | ------------------- |
| SSH远程服务 | 5022 | 22 | 22 |
| MySQL-1 | 3311 | 3311 | 3306 |
| MySQL-2 | 3312 | 3312 | 3306 |
| MySQL-3 | 3313 | 3313 | 3306 |
| MySQL-4 | 3314 | 3314 | 3306 |
| MySQL-5 | 3315 | 3315 | 3306 |
| ShardingSphere | 3307 | 3307 | 3307 |
| MongoDB | 27017 | 27017 | 27017 |
| redis | 6379 | 6379 | 6379 |
| Minio | 9001 UI端口 / 9000 | 9001 / 9000 | 9001 / 9000 |
| RabbitMQ | 15672 UI端口 / 5672 | 15672 UI端口 / 5672 | 15672 UI端口 / 5672 |
| Nacos | 8848 | 8848 | 8848 |
| Sentinel | 8719 / 8858 UI端口 | 8719 / 8858 UI端口 | 8719 / 8858 UI端口 |
## 2.1 MySQL集群
在docker中,我们需要为项目创建一个独立的docker网段,这样可以使项目之间的容器,与原本的容器不受干扰。
```
docker network create --subnet=10.0.0.0/24 cat
```
网段可以改自己喜欢的,"cat"最后的名字可以随便起
```
docker run -it
--restart=always \
-d --name mysql_1 -p 3311:3306 \
--net cat --ip 10.0.0.2 \
-m 400m \
-v /opt/data/mysql/mysql_1/data:/var/lib/mysql \
-v /opt/data/mysql/mysql_1/config:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-e TZ=Asia/Shanghai --privileged=true \
mysql:8.0.23 \
--lower_case_table_names=1
--skip-name-resolve
```
-p 端口映射
--net 设置刚才的网段
--ip 分配ip地址,需要注意的是,10.0.0.1是网关的 IP ( 不可用 )
-m 限制容器内存大小
-v 将docker容器的路径挂载到宿主机上
-e 设置参数
mysql:8.0.23 选择创建的镜像
--lower_case_table_names=1 MySQL的设置,不区分数据表的大小写。
--skip-name-resolve解决MySQL端口映射访问速度慢的问题。
```
echo "skip-name-resolve" >> /etc/mysql/my.cnf
```
改一下名字网段,连续创建剩下的MySQL容器。
## 2.2 ShardingSphere 安装
Apache ShardingSphere 是一款分布式 SQL 事务和查询引擎,可通过数据分片、弹性伸缩、加密等能力对任意数据库进行增强。
经过多次测试5.0-5.5版本的全版本,最后选择了5.1.2版本,这个版本是唯一最贴近5.0.0版本的使用版本。

注意,使用ShardingSphere 需要安装Java环境,但是经过测试,正常在centos7安装Java11-15版本都不行,**会报"Could not create the Java Virtual Machine."错误。**因为没有人在安装ShardingSphere 能解决这种错误的,这种错误在全网都是几乎无解的。
所以必须使用docker进行安装Java环境。jdk的镜像版本如下:

注意你在任何地方都找不到我这个版本的镜像,因为这个是我自己使用自建仓库拉取下来的,而原始版本是:

如果有能力可以直接下载。
然后就是配置文件了,这个几乎是我最头疼的。因为这个几乎我花了一个通宵根据原始的一点提示而补全出来的,我估计大部分的人都会止步于这一步了。话不多说,这里面一共就两个文件:server.yaml与config-sharding.yaml这两个文件。
都在**/opt/module/shardingsphere/conf**这个目录里面了,注意我是安装到/opt/module这个目录里面了,按照自己的安装位置进行一一对应。
首先是server.yaml配置文件:
```yaml
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
######################################################################################################
#
# If you want to configure governance, authorization and proxy properties, please refer to this file.
#
######################################################################################################
#mode:
# type: Cluster
# repository:
# type: ZooKeeper
# props:
# namespace: governance_ds
# server-lists: localhost:2181
# retryIntervalMilliseconds: 500
# timeToLiveSeconds: 60
# maxRetries: 3
# operationTimeoutMilliseconds: 500
# overwrite: false
#
rules:
- !AUTHORITY
users:
- root@%:root
- sharding@:root
provider:
type: ALL_PRIVILEGES_PERMITTED
- !TRANSACTION
defaultType: XA
providerType: Atomikos
# - !SQL_PARSER
# sqlCommentParseEnabled: true
# sqlStatementCache:
# initialCapacity: 2000
# maximumSize: 65535
# concurrencyLevel: 4
# parseTreeCache:
# initialCapacity: 128
# maximumSize: 1024
# concurrencyLevel: 4
#props:
# max-connections-size-per-query: 1
# kernel-executor-size: 16 # Infinite by default.
# proxy-frontend-flush-threshold: 128 # The default value is 128.
# proxy-opentracing-enabled: false
# proxy-hint-enabled: false
# sql-show: false
# check-table-metadata-enabled: false
# show-process-list-enabled: false
# # Proxy backend query fetch size. A larger value may increase the memory usage of ShardingSphere Proxy.
# # The default value is -1, which means set the minimum value for different JDBC drivers.
# proxy-backend-query-fetch-size: -1
# check-duplicate-table-enabled: false
# proxy-frontend-executor-size: 0 # Proxy frontend executor size. The default value is 0, which means let Netty decide.
# # Available options of proxy backend executor suitable: OLAP(default), OLTP. The OLTP option may reduce time cost of writing packets to client, but it may increase the latency of SQL execution
# # and block other clients if client connections are more than `proxy-frontend-executor-size`, especially executing slow SQL.
# proxy-backend-executor-suitable: OLAP
# proxy-frontend-max-connections: 0 # Less than or equal to 0 means no limitation.
# sql-federation-enabled: false
# # Available proxy backend driver type: JDBC (default), ExperimentalVertx
# proxy-backend-driver-type: JDBC
```
其实就是设置了一下数据库远程登录的账号与数据库的隔离性。
然后就是大头config-sharding.yaml文件:
```yaml
schemaName: cat-taxi
dataSources:
rep_s1_mis:
url: jdbc:mysql://10.0.0.2:3306/hxds_mis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rep_s1_cst:
url: jdbc:mysql://10.0.0.2:3306/hxds_cst?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rep_s2_cst:
url: jdbc:mysql://10.0.0.3:3306/hxds_cst?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rep_s1_dr:
url: jdbc:mysql://10.0.0.2:3306/hxds_dr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rep_s2_dr:
url: jdbc:mysql://10.0.0.3:3306/hxds_dr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rep_s1_rule:
url: jdbc:mysql://10.0.0.2:3306/hxds_rule?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rep_s2_rule:
url: jdbc:mysql://10.0.0.3:3306/hxds_rule?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rep_s3_odr:
url: jdbc:mysql://10.0.0.4:3306/hxds_odr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rep_s4_odr:
url: jdbc:mysql://10.0.0.5:3306/hxds_odr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rep_s3_vhr:
url: jdbc:mysql://10.0.0.4:3306/hxds_vhr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rep_s4_vhr:
url: jdbc:mysql://10.0.0.5:3306/hxds_vhr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rules:
- !SHARDING
tables:
tb_action:
actualDataNodes: rep_s1_mis.tb_action
tb_dept:
actualDataNodes: rep_s1_mis.tb_dept
tb_feedback:
actualDataNodes: rep_s1_mis.tb_feedback
tb_module:
actualDataNodes: rep_s1_mis.tb_module
tb_permission:
actualDataNodes: rep_s1_mis.tb_permission
tb_role:
actualDataNodes: rep_s1_mis.tb_role
tb_user:
actualDataNodes: rep_s1_mis.tb_user
tb_customer:
actualDataNodes: rep_s${1..2}_cst.tb_customer
databaseStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: cst-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_customer_fine:
actualDataNodes: rep_s${1..2}_cst.tb_customer_fine
databaseStrategy:
standard:
shardingColumn: customer_id
shardingAlgorithmName: cst-children-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_customer_car:
actualDataNodes: rep_s${1..2}_cst.tb_customer_car
tableStrategy:
standard:
shardingColumn: customer_id
shardingAlgorithmName: cst-children-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_driver:
actualDataNodes: rep_s${1..2}_dr.tb_driver
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: dr-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_driver_fine:
actualDataNodes: rep_s${1..2}_dr.tb_driver_fine
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: dr-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake'
tb_driver_lockdown:
actualDataNodes: rep_s${1..2}_dr.tb_driver_lockdown
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: dr-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_driver_recognition:
actualDataNodes: rep_s${1..2}_dr.tb_driver_recognition
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: dr-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_driver_settings:
actualDataNodes: rep_s${1..2}_dr.tb_driver_settings
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: dr-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_wallet:
actualDataNodes: rep_s${1..2}_dr.tb_wallet
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: dr-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_wallet_income:
actualDataNodes: rep_s${1..2}_dr.tb_wallet_income
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: dr-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_wallet_payment:
actualDataNodes: rep_s${1..2}_dr.tb_wallet_payment
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: dr-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_award_rule:
actualDataNodes: rep_s${1..2}_rule.tb_award_rule
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: rule-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_cancel_rule:
actualDataNodes: rep_s${1..2}_rule.tb_cancel_rule
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: rule-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_charge_rule:
actualDataNodes: rep_s${1..2}_rule.tb_charge_rule
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: rule-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_profitsharing_rule:
actualDataNodes: rep_s${1..2}_rule.tb_profitsharing_rule
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: rule-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_order:
actualDataNodes: rep_s${3..4}_odr.tb_order
tableStrategy:
standard:
shardingColumn: customer_id
shardingAlgorithmName: ord-children-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_order_appeal:
actualDataNodes: rep_s${3..4}_odr.tb_order_appeal
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: ord-order-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_order_bill:
actualDataNodes: rep_s${3..4}_odr.tb_order_bill
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: ord-order-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_order_call:
actualDataNodes: rep_s${3..4}_odr.tb_order_call
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: ord-order-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_order_comment:
actualDataNodes: rep_s${3..4}_odr.tb_order_comment
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: ord-order-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_order_monitoring:
actualDataNodes: rep_s${3..4}_odr.tb_order_monitoring
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: ord-order-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_order_profitsharing:
actualDataNodes: rep_s${3..4}_odr.tb_order_profitsharing
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: ord-order-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_order_violation:
actualDataNodes: rep_s${3..4}_odr.tb_order_violation
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: ord-order-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_voucher:
actualDataNodes: rep_s${3..4}_vhr.tb_voucher
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: vhr-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
tb_voucher_customer:
actualDataNodes: rep_s${3..4}_vhr.tb_voucher_customer
tableStrategy:
standard:
shardingColumn: customer_id
shardingAlgorithmName: vhr-children-inline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
bindingTables:
- tb_voucher
- tb_voucher_customer
- tb_order
- tb_order_appeal
- tb_order_bill
- tb_order_call
- tb_order_comment
- tb_order_monitoring
- tb_order_profitsharing
- tb_order_violation
- tb_award_rule
- tb_cancel_rule
- tb_charge_rule
- tb_profitsharing_rule
- tb_driver
- tb_driver_fine
- tb_driver_lockdown
- tb_driver_recognition
- tb_driver_settings
- tb_wallet
- tb_wallet_income
- tb_wallet_payment
- tb_customer
- tb_customer_car
- tb_customer_fine
shardingAlgorithms:
cst-inline:
type: INLINE
props:
algorithm-expression: rep_s${(id % 2)+1}_cst
cst-children-inline:
type: INLINE
props:
algorithm-expression: rep_s${(customer_id % 2)+1}_cst
dr-inline:
type: INLINE
props:
algorithm-expression: rep_s${(id % 2)+1}_dr
rule-inline:
type: INLINE
props:
algorithm-expression: rep_s${(id % 2)+1}_rule
ord-children-inline:
type: INLINE
props:
algorithm-expression: rep_s${(customer_id % 2)+1}_ord
ord-order-inline:
type: INLINE
props:
algorithm-expression: rep_s${(order_id % 2)+1}_ord
vhr-inline:
type: INLINE
props:
algorithm-expression: rep_s${(id % 2)+1}_vhr
vhr-children-inline:
type: INLINE
props:
algorithm-expression: rep_s${(customer_id % 2)+1}_vhr
keyGenerators:
snowflake:
type: SNOWFLAKE
```
这个我不想去解释里面的内容了,太痛苦了。
给shardingsphere/bin目录下的脚本给运行权限:进入shardingsphere的bin目录下然后执行
```bash
chmod 777 -R ./*
```
然后就是jdk的环境创建,不然无法配合使用。
```bash
docker run -it -d --name jdk -p 3307:3307 \
--net cat --ip 10.0.0.7 \
-m 700m -v /opt/module/shardingsphere:/opt/module/shardingsphere \
-e TZ=Asia/Shanghai --privileged=true \
registry.cn-hangzhou.aliyuncs.com/my-base-env/jdk:15.0.2 bash
```
端口这里要提一嘴,shardingsphere的暴露端口是3307,大概就是映射shardingsphere文件夹到容器里面,然后去运行bin目录里面的start.sh脚本就行了。
运行后去shardingsphere的logs文件夹看一下日志文件,没有报错就是运行成功了。
然后就是去连一下shardingsphere的数据库,账号密码你看server.yaml文件设置的。

## 2.3 安装MongoDB
这里简单的概述一下要做的事情,拉取镜像,然后就是写安装MongoDB的配置文件。写启动脚本最后运行。
镜像版本为当前最新版本:latest

在你想安装的地方创建mongoDB创建配置文件:
创建 /opt/data/mongoDB/mongod.conf 文件,然后在文件中添加如下内容:
```yaml
storage:
dbPath: "/data/db"
security:
authorization: enabled
net:
port: 27017
bindIp: "0.0.0.0"
```
启动 MongoDB 容器
```shell
docker run -it -d --name mongo \
-p 27017:27017 \
--net cat --ip 10.0.0.8 \
-v /opt/data/mongoDB:/etc/mongo \
-v /opt/data/mongoDB/data/db:/data/db \
-m 400m --privileged=true \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=admin \
-e TZ=Asia/Shanghai \
--restart=always \
registry.cn-hangzhou.aliyuncs.com/my-base-env/mongo \
--config /etc/mongo/mongod.conf
```
然后使用工具连接就行了

## 2.4 redis安装
拉取镜像redis镜像,这里还是选择6.0.10版本:

编写配置文件:redis.conf
创建 /opt/data/redis/conf/redis.conf 文件,然后在文件中添加如下内容:
```shell
# 指定 redis 只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求
# bind 127.0.0.1
bind 0.0.0.0
# 是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。
protected-mode no
# redis监听的端口号。
port 6379
# 此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,然后在终端中执行sysctl -p。
tcp-backlog 511
# 此参数为设置客户端空闲超过timeout,服务端会断开连接,为0则服务端不会主动断开连接,不能小于0。
timeout 0
# tcp keepalive参数。如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。在Linux内核中,设置了keepalive,redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值。
tcp-keepalive 0
# 指定了服务端日志的级别。级别包括:debug(很多信息,方便开发、测试),verbose(许多有用的信息,但是没有debug级别信息多),notice(适当的日志级别,适合生产环境),warn(只有非常重要的信息)
loglevel notice
# 指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null。
logfile ""
# 数据库的数量,默认使用的数据库是DB 0。可以通过SELECT命令选择一个db
databases 12
# redis是基于内存的数据库,可以通过设置该值定期写入磁盘。
# 注释掉“save”这一行配置项就可以让保存数据库功能失效
# 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
# 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)
# 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
save 900 1
save 300 10
save 60 10000
# 当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误
stop-writes-on-bgsave-error yes
# 使用压缩rdb文件,rdb文件压缩使用LZF压缩算法,yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间
rdbcompression yes
# 是否校验rdb文件。从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置。
rdbchecksum yes
# rdb文件的名称
dbfilename dump.rdb
# 数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录
dir ./
# requirepass配置可以让用户使用AUTH命令来认证密码,才能使用其他命令。这让redis可以使用在不受信任的网络中。为了保持向后的兼容性,可以注释该命令,因为大部分用户也不需要认证。使用requirepass的时候需要注意,因为redis太快了,每秒可以认证15w次密码,简单的密码很容易被攻破,所以最好使用一个更复杂的密码。注意只有密码没有用户名。
#requirepass admin
```
跟原来的配置文件修改了一点东西,关闭了严格服务模式,删除了密码验证。
docker启动redis脚本:
```shell
docker run -it -d --name redis -m 200m \
-p 6379:6379 --privileged=true \
--net cat --ip 10.0.0.9 \
-v /opt/data/redis/conf/:/usr/local/etc/redis \
-e TZ=Asia/Shanghai \
--restart=always \
registry.cn-hangzhou.aliyuncs.com/my-base-env/redis:6.0.10 \
redis-server /usr/local/etc/redis/redis.conf
```
连接一下看一下是否成功

## 2.5 安装Minio
老三样了,拉镜像写配置起运行脚本。这里还要多一步,就是配置存放文件路径的权限。
镜像选择最新的latest版本。

创建 Minio 文件存储路径
```shell
mkdir -p /opt/data/minio/data # 创建文件夹
chmod -R 777 /opt/data/minio/data # 给其设置权限,否则Minio无法使用该文件夹保存文件
```
写启动 Minio 脚本:其中 9000 是上传文件端口,9001 是 Minio 自带的 Web 端管理系统的端口,这里提一嘴,官网在账号与密码设置了限制,账号不得小于5为字符,密码不得小于8位字符
```shell
docker run -it -d --name minio -m 400m \
-p 9000:9000 -p 9001:9001 \
--net cat --ip 10.0.0.10 \
-v /opt/data/minio/data:/data \
-e TZ=Asia/Shanghai --privileged=true \
--env MINIO_ROOT_USER="admin" \
--env MINIO_ROOT_PASSWORD="ljcvip8888" \
--restart=always \
registry.cn-hangzhou.aliyuncs.com/my-base-env/minio
```
安装成功后验证一下web界面是否能打开

## 2.6 安装RabbitMQ
拉取 RabbitMQ 镜像文件

直接运行docker脚本
```shell
docker run -it -d --name mq \
--net cat --ip 10.0.0.11 \
-p 15672:15672 -p 5672:5672 -m 500m \
-e TZ=Asia/Shanghai --privileged=true \
--restart=always \
registry.cn-hangzhou.aliyuncs.com/my-base-env/rabbitmq:latest
```
3. 进入容器内部后,执行`rabbitmq-plugins enable rabbitmq_management`,即可进入[RabbitMQ后台系统](http://host_ip:15672/#/)
用户名/密码:guest/guest

3. 执行`rabbitmq-plugins enable rabbitmq_tracing`、`rabbitmqctl trace_on`和`rabbitmqctl trace_on -p myhost`,开启消息追踪
## 2.7 安装Nacos
拉取 Nacos 镜像文件2.0.4版本

编写docker运行脚本
```shell
docker run -it -d -p 8848:8848 --env MODE=standalone \
--net cat --ip 10.0.0.12 -e TZ=Asia/Shanghai \
--name nacos \
--restart=always \
registry.cn-hangzhou.aliyuncs.com/my-base-env/nacos-server:v2.0.4
```
登陆 Nacos [控制台](http://192.168.10.100:8848/nacos),账密都是:nacos,进入即可查看具体状况

## 2.8 安装Sentinel
拉取镜像文件1.8.7版本

编写运行docker脚本
````shell
docker run -it -d --name sentinel \
-p 8719:8719 -p 8858:8858 \
--net cat --ip 10.0.0.13 \
-e TZ=Asia/Shanghai -m 400m \
--restart=always \
registry.cn-hangzhou.aliyuncs.com/my-base-env/sentinel-dashboard:1.8.7
````
打开webUI界面检查是否安装成功
登陆 Sentinel [控制台](http://host_ip:8858/#/dashboard),账密都是:sentinel,进入即可查看具体状况

# 3 代码实现
微服务端口预览
## 服务总览
子系统总览
| 序号 | 子系统 | 端口号 | 具体用途 |
| :--: | :----------: | :--------: | :----------------: |
| 1 | cat-tm | 7970和8070 | 分布式事务管理节点 |
| 2 | cat-dr | 8001 | 司机子系统 |
| 3 | cat-odr | 8002 | 订单子系统 |
| 4 | cat-snm | 8003 | 消息通知子系统 |
| 5 | cat-mps | 8004 | 地图子系统 |
| 6 | cat-oes | 8005 | 订单执行子系统 |
| 7 | cat-rule | 8006 | 规则子系统 |
| 8 | cat-cst | 8007 | 客户子系统 |
| 9 | cat-vhr | 8008 | 代金券子系统 |
| 10 | cat-nebula | 8009 | 大数据子系统 |
| 11 | cat-mis-api | 8010 | MIS子系统 |
| 12 | cat-workflow | 8011 | 工作流子系统 |
| 13 | bff-driver | 8101 | 司机bff子系统 |
| 14 | bff-customer | 8102 | 客户bff子系统 |
| 15 | gateway | 8080 | 网关子系统 |