介绍

速达荣耀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

九、灾备方案

多级容灾设计:

  1. 实时热备:PostgreSQL流复制(主从同步)
  2. 每日增量备份:
pg_basebackup -h 主库IP -D /backup/$(date +%Y%m%d) -P -v
  1. 异地容灾:通过DomainRefreshTask动态切换域名解析

总结: 本架构通过Tomcat原生Session管理实现高可用,c3p0动态连接池支撑多账套业务,Struts拦截器链提供纵深防御,配合PostgreSQL集群保障数据安全。前端Vue+Element UI实现高效交互,后端ScheduledExecutorService确保任务调度可靠性,为传统ERP系统向云原生演进提供平滑过渡方案。

特技
  1. 使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md
  2. Gitee 官方博客 blog.gitee.com
  3. 你可以 https://gitee.com/explore 这个地址来了解 Gitee 上的优秀开源项目
  4. GVP 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
  5. Gitee 官方提供的使用手册 https://gitee.com/help
  6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 https://gitee.com/gitee-stars/
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐