From da445a44deb5af2375ea8fd159d261d040b51a09 Mon Sep 17 00:00:00 2001 From: zhangjf Date: Tue, 17 Feb 2026 15:14:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20D.3/F.1/F.3=E4=BB=BB=E5=8A=A1=E5=AE=9E?= =?UTF-8?q?=E6=96=BD=20-=20Nacos=E9=85=8D=E7=BD=AE=E4=B8=AD=E5=BF=83/?= =?UTF-8?q?=E8=AF=BB=E5=86=99=E5=88=86=E7=A6=BB/=E7=B4=A2=E5=BC=95?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## D.3 Nacos统一配置中心 - 添加spring-cloud-starter-alibaba-nacos-config依赖 - 创建bootstrap.yaml配置文件 - DynamicConfig: @RefreshScope动态配置刷新示例 ## F.1 ShardingSphere读写分离 - 添加shardingsphere-jdbc-core依赖 - sharding-config.yaml: 读写分离配置示例 - 支持主从切换、负载均衡策略 ## F.3 数据库索引优化 - db-index-optimization.sql: 全库索引优化脚本 - 用户/角色/菜单/部门表索引 - 用款/支出/收款表索引 - 复合索引优化常用查询场景 --- doc/db-index-optimization.sql | 137 ++++++++++++++++++ fund-sys/pom.xml | 32 ++++ .../sys/config/DynamicConfig.java | 28 ++++ fund-sys/src/main/resources/bootstrap.yaml | 23 +++ .../src/main/resources/sharding-config.yaml | 49 +++++++ 5 files changed, 269 insertions(+) create mode 100644 doc/db-index-optimization.sql create mode 100644 fund-sys/src/main/java/com/fundplatform/sys/config/DynamicConfig.java create mode 100644 fund-sys/src/main/resources/bootstrap.yaml create mode 100644 fund-sys/src/main/resources/sharding-config.yaml diff --git a/doc/db-index-optimization.sql b/doc/db-index-optimization.sql new file mode 100644 index 0000000..275995a --- /dev/null +++ b/doc/db-index-optimization.sql @@ -0,0 +1,137 @@ +-- ===================================================== +-- 资金平台数据库索引优化SQL +-- 执行说明: 根据实际查询场景选择执行 +-- ===================================================== + +-- 使用fund_sys数据库 +USE fund_sys; + +-- ===================================================== +-- 用户表索引 +-- ===================================================== + +-- 用户名唯一索引(已存在可跳过) +CREATE UNIQUE INDEX IF NOT EXISTS idx_sys_user_username ON sys_user(username); + +-- 租户ID索引(多租户查询) +CREATE INDEX IF NOT EXISTS idx_sys_user_tenant_id ON sys_user(tenant_id); + +-- 部门ID索引(按部门查询用户) +CREATE INDEX IF NOT EXISTS idx_sys_user_dept_id ON sys_user(dept_id); + +-- 状态索引(查询启用/禁用用户) +CREATE INDEX IF NOT EXISTS idx_sys_user_status ON sys_user(status); + +-- 创建时间索引(按时间范围查询) +CREATE INDEX IF NOT EXISTS idx_sys_user_created_time ON sys_user(created_time); + +-- 复合索引: 租户+状态(常用查询组合) +CREATE INDEX IF NOT EXISTS idx_sys_user_tenant_status ON sys_user(tenant_id, status); + +-- ===================================================== +-- 角色表索引 +-- ===================================================== + +CREATE INDEX IF NOT EXISTS idx_sys_role_tenant_id ON sys_role(tenant_id); +CREATE INDEX IF NOT EXISTS idx_sys_role_status ON sys_role(status); + +-- ===================================================== +-- 菜单表索引 +-- ===================================================== + +CREATE INDEX IF NOT EXISTS idx_sys_menu_parent_id ON sys_menu(parent_id); +CREATE INDEX IF NOT EXISTS idx_sys_menu_type ON sys_menu(type); +CREATE INDEX IF NOT EXISTS idx_sys_menu_sort ON sys_menu(sort); + +-- ===================================================== +-- 部门表索引 +-- ===================================================== + +CREATE INDEX IF NOT EXISTS idx_sys_dept_parent_id ON sys_dept(parent_id); +CREATE INDEX IF NOT EXISTS idx_sys_dept_tenant_id ON sys_dept(tenant_id); + +-- ===================================================== +-- 用户角色关联表索引 +-- ===================================================== + +CREATE INDEX IF NOT EXISTS idx_sys_user_role_user_id ON sys_user_role(user_id); +CREATE INDEX IF NOT EXISTS idx_sys_user_role_role_id ON sys_user_role(role_id); + +-- ===================================================== +-- 角色菜单关联表索引 +-- ===================================================== + +CREATE INDEX IF NOT EXISTS idx_sys_role_menu_role_id ON sys_role_menu(role_id); +CREATE INDEX IF NOT EXISTS idx_sys_role_menu_menu_id ON sys_role_menu(menu_id); + +-- ===================================================== +-- 操作日志表索引 +-- ===================================================== + +CREATE INDEX IF NOT EXISTS idx_sys_log_user_id ON sys_log(user_id); +CREATE INDEX IF NOT EXISTS idx_sys_log_tenant_id ON sys_log(tenant_id); +CREATE INDEX IF NOT EXISTS idx_sys_log_operation ON sys_log(operation); +CREATE INDEX IF NOT EXISTS idx_sys_log_created_time ON sys_log(created_time); +-- 复合索引: 租户+时间(常用日志查询) +CREATE INDEX IF NOT EXISTS idx_sys_log_tenant_time ON sys_log(tenant_id, created_time); + + +-- ===================================================== +-- 使用fund_req数据库(用款申请) +-- ===================================================== + +USE fund_req; + +-- 用款申请表索引 +CREATE INDEX IF NOT EXISTS idx_fund_request_tenant_id ON fund_request(tenant_id); +CREATE INDEX IF NOT EXISTS idx_fund_request_user_id ON fund_request(user_id); +CREATE INDEX IF NOT EXISTS idx_fund_request_status ON fund_request(status); +CREATE INDEX IF NOT EXISTS idx_fund_request_created_time ON fund_request(created_time); +CREATE INDEX IF NOT EXISTS idx_fund_request_project_id ON fund_request(project_id); +-- 复合索引: 租户+状态+时间(审批列表查询) +CREATE INDEX IF NOT EXISTS idx_fund_request_tenant_status_time ON fund_request(tenant_id, status, created_time); + + +-- ===================================================== +-- 使用fund_exp数据库(支出管理) +-- ===================================================== + +USE fund_exp; + +-- 支出表索引 +CREATE INDEX IF NOT EXISTS idx_fund_expense_tenant_id ON fund_expense(tenant_id); +CREATE INDEX IF NOT EXISTS idx_fund_expense_request_id ON fund_expense(request_id); +CREATE INDEX IF NOT EXISTS idx_fund_expense_status ON fund_expense(status); +CREATE INDEX IF NOT EXISTS idx_fund_expense_created_time ON fund_expense(created_time); +-- 复合索引: 租户+支付状态 +CREATE INDEX IF NOT EXISTS idx_fund_expense_tenant_status ON fund_expense(tenant_id, status); + + +-- ===================================================== +-- 使用fund_receipt数据库(收款管理) +-- ===================================================== + +USE fund_receipt; + +-- 收款表索引 +CREATE INDEX IF NOT EXISTS idx_fund_receipt_tenant_id ON fund_receipt(tenant_id); +CREATE INDEX IF NOT EXISTS idx_fund_receipt_project_id ON fund_receipt(project_id); +CREATE INDEX IF NOT EXISTS idx_fund_receipt_status ON fund_receipt(status); +CREATE INDEX IF NOT EXISTS idx_fund_receipt_created_time ON fund_receipt(created_time); +-- 复合索引: 租户+确认状态 +CREATE INDEX IF NOT EXISTS idx_fund_receipt_tenant_status ON fund_receipt(tenant_id, status); + + +-- ===================================================== +-- 分析慢查询(可选) +-- ===================================================== + +-- 查看表的索引情况 +-- SHOW INDEX FROM sys_user; + +-- 分析查询执行计划 +-- EXPLAIN SELECT * FROM sys_user WHERE tenant_id = 1 AND status = 1; + +-- 查看慢查询日志(需要开启慢查询日志) +-- SHOW VARIABLES LIKE 'slow_query_log'; +-- SHOW VARIABLES LIKE 'long_query_time'; diff --git a/fund-sys/pom.xml b/fund-sys/pom.xml index cf30c06..f1f01a7 100644 --- a/fund-sys/pom.xml +++ b/fund-sys/pom.xml @@ -41,6 +41,13 @@ mysql-connector-j + + + org.apache.shardingsphere + shardingsphere-jdbc-core + 5.4.1 + + com.zaxxer @@ -80,6 +87,31 @@ org.springframework.security spring-security-crypto + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + + + net.logstash.logback + logstash-logback-encoder + 7.4 + diff --git a/fund-sys/src/main/java/com/fundplatform/sys/config/DynamicConfig.java b/fund-sys/src/main/java/com/fundplatform/sys/config/DynamicConfig.java new file mode 100644 index 0000000..e708f04 --- /dev/null +++ b/fund-sys/src/main/java/com/fundplatform/sys/config/DynamicConfig.java @@ -0,0 +1,28 @@ +package com.fundplatform.sys.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 动态配置示例 + * 通过Nacos配置中心动态刷新配置 + */ +@Configuration +@RefreshScope +public class DynamicConfig { + + @Value("${app.feature.switch:false}") + private Boolean featureSwitch; + + @Value("${app.max-request-size:10MB}") + private String maxRequestSize; + + public Boolean isFeatureEnabled() { + return featureSwitch; + } + + public String getMaxRequestSize() { + return maxRequestSize; + } +} diff --git a/fund-sys/src/main/resources/bootstrap.yaml b/fund-sys/src/main/resources/bootstrap.yaml new file mode 100644 index 0000000..a4a5399 --- /dev/null +++ b/fund-sys/src/main/resources/bootstrap.yaml @@ -0,0 +1,23 @@ +spring: + application: + name: fund-sys + cloud: + nacos: + # Nacos配置中心 + config: + server-addr: localhost:8848 + namespace: fund-platform + group: DEFAULT_GROUP + file-extension: yaml + # 共享配置 + shared-configs: + - data-id: common.yaml + group: DEFAULT_GROUP + refresh: true + # 动态刷新 + refresh-enabled: true + # Nacos服务发现 + discovery: + server-addr: localhost:8848 + namespace: fund-platform + group: DEFAULT_GROUP diff --git a/fund-sys/src/main/resources/sharding-config.yaml b/fund-sys/src/main/resources/sharding-config.yaml new file mode 100644 index 0000000..03dc5c6 --- /dev/null +++ b/fund-sys/src/main/resources/sharding-config.yaml @@ -0,0 +1,49 @@ +# ===================================================== +# ShardingSphere 读写分离配置示例 +# 生产环境使用时取消注释并修改为实际的数据库地址 +# ===================================================== + +#spring: +# datasource: +# driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver +# url: jdbc:shardingsphere:classpath:sharding-config.yaml + +# ===================================================== +# sharding-config.yaml (放在resources目录下) +# ===================================================== +#mode: +# type: Standalone +# repository: +# type: JDBC +# +#dataSources: +# ds_master: +# dataSourceClassName: com.zaxxer.hikari.HikariDataSource +# driverClassName: com.mysql.cj.jdbc.Driver +# jdbcUrl: jdbc:mysql://master-host:3306/fund_sys?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai +# username: root +# password: zjf@123456 +# ds_slave_0: +# dataSourceClassName: com.zaxxer.hikari.HikariDataSource +# driverClassName: com.mysql.cj.jdbc.Driver +# jdbcUrl: jdbc:mysql://slave-host:3306/fund_sys?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai +# username: root +# password: zjf@123456 +# +#rules: +# - !READWRITE_SPLITTING +# dataSources: +# readwrite_ds: +# writeDataSourceName: ds_master +# readDataSourceNames: +# - ds_slave_0 +# transactionalReadQueryStrategy: PRIMARY +# loadBalancerName: round_robin +# loadBalancers: +# round_robin: +# type: ROUND_ROBIN +# props: +# default: 0 +# +#props: +# sql-show: true