能否在同一Tomcat实例的不同Web应用中部署Apache Ignite服务端与客户端节点?
实现方案:基于Ignite的跨Web应用会话复制(单集群模式)
一、核心前提
确保webapp1(服务端集群)和webapp2(客户端节点)使用完全相同的集群名称,这是两者加入同一集群的关键。
二、Webapp1(Ignite服务端集群节点)配置
添加Ignite依赖
在webapp1的构建文件中引入Ignite核心及Web模块依赖(以Maven为例):<dependency> <groupId>org.apache.ignite</groupId> <artifactId>ignite-core</artifactId> <version>你的Ignite版本号</version> </dependency> <dependency> <groupId>org.apache.ignite</groupId> <artifactId>ignite-web</artifactId> <version>你的Ignite版本号</version> </dependency>编写服务端Ignite配置
在WEB-INF目录下创建ignite-server-config.xml,配置为服务端模式:<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> <!-- 统一集群名称,必须和webapp2保持一致 --> <property name="clusterName" value="shared-session-cluster"/> <!-- 设置为服务端节点 --> <property name="clientMode" value="false"/> <!-- TCP/IP发现配置,让客户端能找到集群 --> <property name="discoverySpi"> <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder"> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder"> <property name="addresses"> <list> <!-- 填写webapp1所在服务器的IP+默认端口47500 --> <value>192.168.1.10:47500</value> </list> </property> </bean> </property> </bean> </property> <!-- 可选:开启持久化防止会话丢失 --> <property name="dataStorageConfiguration"> <bean class="org.apache.ignite.configuration.DataStorageConfiguration"> <property name="defaultDataRegionConfiguration"> <bean class="org.apache.ignite.configuration.DataRegionConfiguration"> <property name="persistenceEnabled" value="true"/> </bean> </property> </bean> </property> </bean> </beans>配置Web会话过滤器
在web.xml中添加Ignite会话过滤器,关联服务端配置:<filter> <filter-name>IgniteWebSessionFilter</filter-name> <filter-class>org.apache.ignite.cache.websession.IgniteWebSessionFilter</filter-class> <init-param> <param-name>cfgPath</param-name> <param-value>/WEB-INF/ignite-server-config.xml</param-value> </init-param> <!-- 会话缓存名称,webapp2需使用相同名称 --> <init-param> <param-name>cacheName</param-name> <param-value>web-sessions-cache</param-value> </init-param> </filter> <filter-mapping> <filter-name>IgniteWebSessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
三、Webapp2(Ignite客户端节点)配置
添加同版本依赖
和webapp1使用完全相同版本的Ignite核心及Web模块依赖。编写客户端Ignite配置
在WEB-INF目录下创建ignite-client-config.xml,配置为客户端模式:<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> <!-- 与服务端集群名称完全一致 --> <property name="clusterName" value="shared-session-cluster"/> <!-- 设置为客户端节点 --> <property name="clientMode" value="true"/> <!-- 指向服务端的发现地址 --> <property name="discoverySpi"> <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder"> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder"> <property name="addresses"> <list> <value>192.168.1.10:47500</value> </list> </property> </bean> </property> </bean> </property> </bean> </beans>配置Web会话过滤器
在web.xml中添加过滤器,关联客户端配置并使用相同缓存名称:<filter> <filter-name>IgniteWebSessionFilter</filter-name> <filter-class>org.apache.ignite.cache.websession.IgniteWebSessionFilter</filter-class> <init-param> <param-name>cfgPath</param-name> <param-value>/WEB-INF/ignite-client-config.xml</param-value> </init-param> <init-param> <param-name>cacheName</param-name> <param-value>web-sessions-cache</param-value> </init-param> </filter> <filter-mapping> <filter-name>IgniteWebSessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
四、关键注意事项
- 版本统一:webapp1和webapp2的Ignite版本必须完全一致,避免兼容性问题。
- 网络连通:确保webapp2服务器能访问webapp1的Ignite端口(默认47500、47100),防火墙需开放对应端口。
- 对象序列化:会话中存放的自定义对象必须实现
Serializable接口,否则无法跨节点复制。 - 缓存自定义:如需调整会话缓存的过期时间、容量等参数,仅需在服务端配置中添加缓存配置,客户端会自动同步使用。
内容的提问来源于stack exchange,提问作者Lakshmikantha Reddy
相关产品推荐
相关产品推荐

