速达荣耀Open
介绍
速达荣耀Open开源ERP+AI编程 速达荣耀open ERP系统采用前后端分离架构,后端基于Java技术栈,前端基于Vue框架,实现高内聚、低耦合的企业资源管理解决方案,具体如下所示:
一、整体架构概览
架构模式:B/S多层架构(前端分离 + 服务端分层) 核心特性:
- 基于Cookie的Session管理(Tomcat原生)
- c3p0连接池动态多账套支持
- Struts 2.5拦截器链安全控制
- Vue + Element UI交互式前端
- PostgreSQL多数据库实例管理
二、关键技术栈配置
| 模块 | 技术实现 | 配置文件/代码定位 |
|---|---|---|
| HTTP服务 | Tomcat 8.5 | server.xml配置HTTP/HTTPS端口 |
| Session管理 | Tomcat JDBCStore持久化 | context.xml配置PersistentManager+JDBCStore |
| 数据库连接池 | c3p0-0.9.1.2动态多数据源 | ConnectPools类管理多账套连接 |
| 安全控制 | 三重拦截器链(参数过滤/登录校验/连接监控) | SafeParamInterceptor+CheckLoginIntercepter+ConnectionInterceptor |
| 异步任务 | ScheduledExecutorService线程池 | ScheduleTaskService配置10线程任务池 |
| 前端框架 | Vue 2.5 + Webpack 3.6 | package.json定义ElementUI/ECharts等依赖 |
三、核心模块深度解析
1. 动态多账套数据库连接池
实现机制:
// ConnectPools类核心逻辑
public static ComboPooledDataSource getDataSource(String accsetName) throws Exception {
String accsetDBName = doGetDBNameByAccName(accsetName); // 转换账套名为数据库名
if (!dataSourceList.containsKey(accsetDBName)) {
// 动态创建新数据源
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setJdbcUrl("jdbc:postgresql://"+serverName+":"+port+"/"+accsetDBName);
ds.setMaxPoolSize(maxPoolSize); // 最大连接数100
ds.setMinPoolSize(minPoolSize); // 最小连接数3
ds.setTestConnectionOnCheckout(true); // 连接取出时校验
dataSourceList.put(accsetDBName, ds);
}
return dataSourceList.get(accsetDBName);
}
关键特性:
- 账套隔离:每个账套对应独立数据库实例(如sd31512_cwaccset)
- 连接泄漏防护:
// c3p0连接池配置
ds.setUnreturnedConnectionTimeout(50); // 50秒未归还连接自动回收
ds.setDebugUnreturnedConnectionStackTraces(true); // 打印泄漏堆栈
- 无序列表自动重连机制:acquireRetryAttempts=10(获取失败重试10次)
2. Session持久化管理
Tomcat配置:
<!-- $CATALINA_HOME/conf/context.xml -->
<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="org.apache.catalina.session.JDBCStore"
sessionTable="tomcat_sessions"
sessionIdCol="session_id"
sessionDataCol="session_data"/>
</Manager>
数据表结构:
CREATE TABLE tomcat_sessions (
session_id VARCHAR(100) PRIMARY KEY,
session_data BYTEA,
max_inactive INT,
last_access BIGINT
);
3. 安全拦截器链
执行流程: 
安全防护:
- XSS/SQL过滤:通过Requests.safeParam方法清洗参数
- 会话劫持防护:SessionID绑定IP地址(代码未展示,需在CheckLoginIntercepter中实现)
四、数据库架构设计
1. 多账套数据模型
命名规范: 系统库:sd[产品ID]cwaccset(如sd31512_cwaccset) 业务库:sd[产品ID][账套名](如sd31512_company1) 数据隔离策略: 通过ConnectPools类动态加载不同账套数据源 前端请求携带accsetName参数标识当前账套
2. 连接池监控指标
| 监控项 | 阈值 | 处理策略 |
|---|---|---|
| 活跃连接数 | >80% maxPoolSize | 触发扩容警告 |
| 连接获取时间 | >5000ms | 记录慢连接日志 |
| 未关闭连接数 | >5 | 强制回收并告警 |
五、系统部署架构
生产环境拓扑: 
关键配置: 1. Tomcat智能分流服务
// 分流服务核心逻辑(部署在独立Tomcat实例)
@WebServlet("/redirect")
public class LoadBalanceServlet extends HttpServlet {
private static final Map<String, Integer> nodeStats = new ConcurrentHashMap<>(); // 节点负载统计
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
// 获取最空闲节点
String targetNode = selectIdleNode();
resp.sendRedirect("http://"+targetNode+req.getRequestURI());
}
private String selectIdleNode() {
return nodeStats.entrySet().stream()
.min(Map.Entry.comparingByValue())
.orElseThrow().getKey();
}
// 节点心跳上报接口(各业务节点定期调用)
@WebServlet("/heartbeat")
public static class HeartbeatServlet extends HttpServlet {
protected void doPost(HttpServletRequest req) {
String node = req.getParameter("node");
int load = Integer.parseInt(req.getParameter("load"));
nodeStats.put(node, load); // 更新节点负载
}
}
}
实现特性:
| 特性 | 说明 |
|---|---|
| 动态负载检测 | 业务节点每30秒上报CPU/内存指标(通过/heartbeat接口) |
| 最小连接数策略 | 分流服务优先选择当前活跃请求最少的节点 |
| 会话保持 | 首次分流后通过Cookie记录目标节点,后续请求直连 |
| 故障自动剔除 | 超过60秒未收到心跳的节点自动从nodeStats移除 |
2. 业务节点配置
<!-- 各业务节点server.xml配置 -->
<Connector
port="808X"
maxThreads="200"
acceptCount="100"
connectionTimeout="20000"/>
流量分发流程: 
架构优势对比
| 方案 | 传统Nginx负载均衡 | Tomcat智能分流服务 |
|---|---|---|
| 会话保持 | 依赖ip_hash | Cookie绑定+服务端状态维护 |
| 动态权重 | 需手动调整weight | 实时负载自动计算 |
| 故障恢复 | 依赖健康检查间隔 | 60秒自动剔除不可用节点 |
| Java生态集成 | 需维护额外Nginx配置 | 与业务系统统一技术栈 |
六、扩展性设计
1. 横向扩展能力
- 无状态服务:Session数据持久化到数据库,支持节点动态扩容
- 数据库分片:按账套名称分库,通过ConnectPools.getConnectionByName()动态路由
- 分流服务集群化:通过ZooKeeper选举主分流节点,避免单点故障
- 动态扩容协议:新业务节点启动后自动向分流服务注册
2. SaaS多租户改造路径

七、性能优化专项
1. 连接池参数调优
// ErpSDWebServerStart初始化参数
ConnectPools.maxPoolSize = Integer.parseInt(p.getProperty("MaxPoolSize", "100"));
ConnectPools.minPoolSize = Integer.parseInt(p.getProperty("MinPoolSize", "3"));
2. SQL执行优化
批量操作:在UnFrozenTask中使用UPDATE...WHERE IN语句 索引策略:为所有账套的accset表建立复合索引
CREATE INDEX idx_accset_name ON accset USING BTREE (lower(name));
八、运维监控体系
1. 健康检查指标
| 检查项 | 检测频率 | 报警阈值 |
|---|---|---|
| 数据库连接池使用率 | 60秒 | >85%持续5分钟 |
| Tomcat活跃线程数 | 30秒 | >200 |
| Session泄漏数量 | 300秒 | >10个/分钟 |
2. 日志管理策略
- ELK日志收集:通过Filebeat采集Tomcat日志
- 慢SQL记录:在ConnectionInterceptor中记录执行时间>2秒的SQL
九、灾备方案
多级容灾设计:
- 实时热备:PostgreSQL流复制(主从同步)
- 每日增量备份:
pg_basebackup -h 主库IP -D /backup/$(date +%Y%m%d) -P -v
- 异地容灾:通过DomainRefreshTask动态切换域名解析
总结: 本架构通过Tomcat原生Session管理实现高可用,c3p0动态连接池支撑多账套业务,Struts拦截器链提供纵深防御,配合PostgreSQL集群保障数据安全。前端Vue+Element UI实现高效交互,后端ScheduledExecutorService确保任务调度可靠性,为传统ERP系统向云原生演进提供平滑过渡方案。
特技
- 使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md
- Gitee 官方博客 blog.gitee.com
- 你可以 https://gitee.com/explore 这个地址来了解 Gitee 上的优秀开源项目
- GVP 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
- Gitee 官方提供的使用手册 https://gitee.com/help
- Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 https://gitee.com/gitee-stars/
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)