首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >速达荣耀Open开源ERP-产品架构简介

速达荣耀Open开源ERP-产品架构简介

原创
作者头像
用户12538530
修改2026-06-05 09:24:09
修改2026-06-05 09:24:09
60
举报

荣耀openERP系统采用前后端分离架构,后端基于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. 动态多账套数据库连接池

实现机制:

代码语言:java
复制
// 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配置:

代码语言:xml
复制
<!-- $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>

数据表结构:

代码语言:sql
复制
CREATE TABLE tomcat_sessions (
    session_id VARCHAR(100) PRIMARY KEY,
    session_data BYTEA,
    max_inactive INT,
    last_access BIGINT
);

3. 安全拦截器链

执行流程:

<img style="width:600px;" src="/WB/webApp/openerp/arch/pic3-3-1.png" />

安全防护:

  • XSS/SQL过滤:通过Requests.safeParam方法清洗参数
  • 会话劫持防护:SessionID绑定IP地址(代码未展示,需在CheckLoginIntercepter中实现)

四、数据库架构设计

1. 多账套数据模型

命名规范:

系统库:sd产品ID_cwaccset(如sd31512_cwaccset)

业务库:sd产品ID_账套名(如sd31512_company1)

数据隔离策略:

通过ConnectPools类动态加载不同账套数据源

前端请求携带accsetName参数标识当前账套

2. 连接池监控指标

监控项

阈值

处理策略

活跃连接数

80% maxPoolSize

触发扩容警告

连接获取时间

5000ms

记录慢连接日志

未关闭连接数

5

强制回收并告警

五、系统部署架构

生产环境拓扑:

<img style="width:600px" src="/WB/webApp/openerp/arch/pic5-0-0.png" />

关键配置:

1. Tomcat智能分流服务

代码语言:java
复制
// 分流服务核心逻辑(部署在独立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. 业务节点配置

代码语言:xml
复制
<!-- 各业务节点server.xml配置 -->
<Connector 
    port="808X" 
    maxThreads="200"
    acceptCount="100"
connectionTimeout="20000"/>

流量分发流程:

<img style="width:500px;" src="/WB/webApp/openerp/arch/pic5-2-1.png" />

架构优势对比

方案

传统Nginx负载均衡

Tomcat智能分流服务

会话保持

依赖ip_hash

Cookie绑定+服务端状态维护

动态权重

需手动调整weight

实时负载自动计算

故障恢复

依赖健康检查间隔

60秒自动剔除不可用节点

Java生态集成

需维护额外Nginx配置

与业务系统统一技术栈

六、扩展性设计

1. 横向扩展能力

  • 无状态服务:Session数据持久化到数据库,支持节点动态扩容
  • 数据库分片:按账套名称分库,通过ConnectPools.getConnectionByName()动态路由
  • 分流服务集群化:通过ZooKeeper选举主分流节点,避免单点故障
  • 动态扩容协议:新业务节点启动后自动向分流服务注册

2. SaaS多租户改造路径

<img style="width:250px;" src="/WB/webApp/openerp/arch/pic6-2-1.png" />

七、性能优化专项

1. 连接池参数调优

代码语言:java
复制
// ErpSDWebServerStart初始化参数
ConnectPools.maxPoolSize = Integer.parseInt(p.getProperty("MaxPoolSize", "100"));
ConnectPools.minPoolSize = Integer.parseInt(p.getProperty("MinPoolSize", "3"));

2. SQL执行优化

批量操作:在UnFrozenTask中使用UPDATE...WHERE IN语句

索引策略:为所有账套的accset表建立复合索引

代码语言:sql
复制
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流复制(主从同步)pg_basebackup -h 主库IP -D /backup/$(date +%Y%m%d) -P -v
  2. 每日增量备份:
  3. 异地容灾:通过DomainRefreshTask动态切换域名解析

总结:

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、整体架构概览
  • 二、关键技术栈配置
  • 三、核心模块深度解析
    • 1. 动态多账套数据库连接池
    • 2. Session持久化管理
    • 3. 安全拦截器链
  • 四、数据库架构设计
    • 1. 多账套数据模型
    • 2. 连接池监控指标
  • 五、系统部署架构
  • 六、扩展性设计
    • 1. 横向扩展能力
    • 2. SaaS多租户改造路径
  • 七、性能优化专项
    • 1. 连接池参数调优
    • 2. SQL执行优化
  • 八、运维监控体系
    • 1. 健康检查指标
    • 2. 日志管理策略
  • 九、灾备方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档