荣耀openERP系统采用前后端分离架构,后端基于Java技术栈,前端基于Vue框架,实现高内聚、低耦合的企业资源管理解决方案,具体如下所示:
架构模式:B/S多层架构(前端分离 + 服务端分层)
核心特性:
模块 | 技术实现 | 配置文件/代码定位 |
|---|---|---|
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等依赖 |
实现机制:
// 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);
}关键特性:
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
);执行流程:
<img style="width:600px;" src="/WB/webApp/openerp/arch/pic3-3-1.png" />
安全防护:
命名规范:
系统库:sd产品ID_cwaccset(如sd31512_cwaccset)
业务库:sd产品ID_账套名(如sd31512_company1)
数据隔离策略:
通过ConnectPools类动态加载不同账套数据源
前端请求携带accsetName参数标识当前账套
监控项 | 阈值 | 处理策略 |
|---|---|---|
活跃连接数 |
| 触发扩容警告 |
连接获取时间 |
| 记录慢连接日志 |
未关闭连接数 |
| 强制回收并告警 |
生产环境拓扑:
<img style="width:600px" src="/WB/webApp/openerp/arch/pic5-0-0.png" />
关键配置:
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"/>流量分发流程:
<img style="width:500px;" src="/WB/webApp/openerp/arch/pic5-2-1.png" />
架构优势对比
方案 | 传统Nginx负载均衡 | Tomcat智能分流服务 |
|---|---|---|
会话保持 | 依赖ip_hash | Cookie绑定+服务端状态维护 |
动态权重 | 需手动调整weight | 实时负载自动计算 |
故障恢复 | 依赖健康检查间隔 | 60秒自动剔除不可用节点 |
Java生态集成 | 需维护额外Nginx配置 | 与业务系统统一技术栈 |
<img style="width:250px;" src="/WB/webApp/openerp/arch/pic6-2-1.png" />
// ErpSDWebServerStart初始化参数
ConnectPools.maxPoolSize = Integer.parseInt(p.getProperty("MaxPoolSize", "100"));
ConnectPools.minPoolSize = Integer.parseInt(p.getProperty("MinPoolSize", "3"));批量操作:在UnFrozenTask中使用UPDATE...WHERE IN语句
索引策略:为所有账套的accset表建立复合索引
CREATE INDEX idx_accset_name ON accset USING BTREE (lower(name));检查项 | 检测频率 | 报警阈值 |
|---|---|---|
数据库连接池使用率 | 60秒 |
|
Tomcat活跃线程数 | 30秒 |
|
Session泄漏数量 | 300秒 |
|
多级容灾设计:
总结:
本架构通过Tomcat原生Session管理实现高可用,c3p0动态连接池支撑多账套业务,Struts拦截器链提供纵深防御,配合PostgreSQL集群保障数据安全。前端Vue+Element UI实现高效交互,后端ScheduledExecutorService确保任务调度可靠性,为传统ERP系统向云原生演进提供平滑过渡方案。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。