Skip to content

集群部署

集群部署提供高可用性和负载均衡,适用于生产环境。

此文档主要说明流程引擎的集群部署,数据库和 Redis 是否使用集群,根据项目实际情况选择。

准备工作

此文档步骤说明基于流程引擎开发环境更新,建议本地先部署开发环境,再进行集群配置修改。

开发环境部署步骤参考:开发环境部署

架构设计

负载均衡层
    ├── Nginx / LVS
应用层
    ├── Node 1 (流程引擎)
    ├── Node 2 (流程引擎)
    └── Node 3 (流程引擎)
数据层
    ├── MySQL (可做主从复制)
    └── Redis (可做集群)

节点配置

服务器配置建议(200并发)

节点类型CPU内存磁盘用途
应用节点32核64GB200GB运行流程引擎应用
数据库节点16核32GB1TB存储流程数据
Redis节点4核8GB100GB缓存和Session存储

修改步骤

第一步:开启工作流的集群模式

修改 hzwf_config.properties 文件:

  1. 从 JAR 包中提取配置文件,路径:/horizon-workflow-pub-8.X.jar/hzwf_config.properties

  2. 将文件复制到工程的 src/main/resources/ 目录下,修改IsCluster=true

第二步:修改缓存模式

开启集群之后,需要修改成能支持集群的缓存模式,本方案选用 Redis。

修改步骤查看:集成 Redis

第三步:开启 Spring Session

3.1 添加依赖

修改 pom.xml 文件,增加 Spring Session 的依赖包:

xml
<!-- Spring Session 与 Redis 集成配置 -->
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

3.2 配置 Spring Session

修改 application.properties 配置文件,增加 Spring Session 的配置:

properties
# Spring Session 配置 - 处理集群模式下的 Session 一致性
spring.session.store-type=redis

# Redis 连接配置
spring.redis.host=127.0.0.1
spring.redis.password=
spring.redis.port=6379

Spring Session 配置

第四步:更新补丁文件

更新附件中的两个 Java 文件到项目环境:

文件说明
ContextListener.java上下文监听器
HorizonDomainFilter.java域名过滤器(平台环境需改名为 HorizonPlatFormDomainFilter

注意:项目需根据自身 JDK 版本进行编译。

第五步:修改 Spring 注册类加载顺序

拷贝源码:将jar包中的源码:/horizon/horizon-workflow-conf-8.2.3.jar!/com/horizon/boot/web/HorizonMvcConfigAdapter.java

拷贝到src下:src/main/java/com/horizon/boot/web/HorizonMvcConfigAdapter.java

修改说明:通过 setOrder() 方法修改过滤器优先级,使其执行顺序位于 SessionRepositoryFilter 之后。

修改 1:Session 一致性过滤器

java
/**
 * 保持 Session 一致性过滤器
 * @return
 */
@Bean
public FilterRegistrationBean filterRegistrationBean() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    HorizonDomainFilter horizonDomainFilter = new HorizonDomainFilter();
    registrationBean.setFilter(horizonDomainFilter);
    registrationBean.setOrder(SessionRepositoryFilter.DEFAULT_ORDER + 1);
    List<String> urlPatterns = new ArrayList<String>();
    urlPatterns.add("/*");
    registrationBean.setUrlPatterns(urlPatterns);
    return registrationBean;
}

修改 2:请求过滤器

java
/**
 * 请求过滤器
 * @return
 */
@Bean
public FilterRegistrationBean registrationBean() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    WorkflowContextFilter wcf = new WorkflowContextFilter();
    registrationBean.setOrder(SessionRepositoryFilter.DEFAULT_ORDER + 3);
    registrationBean.setFilter(wcf);
    registrationBean.addUrlPatterns("*.wf");
    return registrationBean;
}

说明:Session 一致性过滤器优先级为 +1,请求过滤器优先级为 +3,预留 +2 用于单点登录过滤器。

打包发布

将修改后的开发环境重新打包,发布到多个应用服务器中。

扩展说明

生产环境下,application.properties文件中springsession的增加以下配置,参数值和workflow-conf/properties/cache.properties里的redis值一致

properties
#Redis连接池的最大连接数
spring.redis.jedis.pool.max-active=300
#Redis连接池中最大空闲连接数
spring.redis.jedis.pool.max-idle=100
#连接池最小空闲连接数
spring.redis.jedis.pool.min-idle=20
#连接池的最大阻塞等待时间,默认为-1,表示没有时间限制
spring.redis.jedis.pool.max-wait=10000ms

redis哨兵模式时,application.properties文件中springsession的配置方式:

properties
spring.session.store-type=redis
#springsession 中 读取的redis信息配置
#哨兵主节点ip
spring.redis.host=192.168.3.170
#哨兵主节点端口
spring.redis.port=6379
spring.redis.password=123456
spring.redis.sentinel.master=mymaster
#哨兵的ip和端口
spring.redis.sentinel.nodes=192.168.3.170:26001,192.168.3.170:26002,192.168.3.170:26003

集群验证

部署完成后,通过以下方式验证集群是否正常工作:

  1. 启动多个节点:确保所有应用节点都能正常启动
  2. Session 共享测试:在一个节点登录后,切换到其他节点验证 Session 是否共享
  3. 负载均衡测试:通过负载均衡器访问应用,验证请求是否均匀分发
  4. 故障转移测试:停止其中一个节点,验证其他节点能否正常处理请求