24.3.9. 将 HTTP 会话外部化到红帽数据网格

注意

您需要红帽数据网格订阅才能使用此功能。

红帽数据网格可用作 JBoss EAP 中应用特定数据的外部缓存容器,如 HTTP 会话。这允许扩展独立于应用的数据层,并使可能驻留于不同域中的不同 JBoss EAP 集群能够访问同一红帽数据网格集群的数据。此外,其他应用程序还可与红帽数据网格提供的缓存相连接。

下例演示了如何使 HTTP 会话外部化。它适用于 JBoss EAP 和受管域的单机实例。

  1. 创建 remote-cache-container如需更多信息,请参阅配置远程缓存容器
  2. 配置 HotRod 存储.HotRod 存储将专用远程缓存用于 JBoss EAP 服务器创建的每个缓存。通常,JBoss EAP 服务器上使用一个无效缓存,如下 CLI 脚本中所示。

    注意

    远程缓存需要在红帽数据网格服务器上手动配置。建议对这些缓存进行配置,是带有保守锁定的事务分发模式缓存。缓存名称必须与 test.war 等部署文件名对应。

    配置了远程缓存容器后,可以配置热门 存储 来取代任何现有的存储。以下 CLI 脚本演示了与无效缓存结合使用会话的典型用例:

    batch
    /subsystem=infinispan/cache-container=web/invalidation-cache=CACHE_NAME:add()
    /subsystem=infinispan/cache-container=web/invalidation-cache=CACHE_NAME/store=hotrod:add(remote-cache-container=CACHE_CONTAINER,fetch-state=false,purge=false,passivation=false,shared=true)
    /subsystem=infinispan/cache-container=web/invalidation-cache=CACHE_NAME/component=transaction:add(mode=BATCH)
    /subsystem=infinispan/cache-container=web/invalidation-cache=CACHE_NAME/component=locking:add(isolation=REPEATABLE_READ)
    /subsystem=infinispan/cache-container=web:write-attribute(name=default-cache,value=CACHE_NAME)
    run-batch

    该脚本配置一个新的无效缓存。然后,会话数据被保留在缓存中以获得性能并写入存储以获得弹性。

    可以使用 @Resource 注释将 HotRod 客户端直接注入到 Jakarta EE 应用中。在下例中,@ Resource 注释在 hotrod-client.properties 文件中查找类路径中的配置属性。

    @Resource(lookup = "java:jboss/infinispan/remote-container/web-sessions")
    private org.infinispan.client.hotrod.RemoteCacheContainer client;

    示例: hotrod-client.properties 文件

    infinispan.client.hotrod.transport_factory = org.infinispan.client.hotrod.impl.transport.tcp.TcpTransportFactory
    infinispan.client.hotrod.server_list = 127.0.0.1:11222
    infinispan.client.hotrod.marshaller = org.infinispan.commons.marshall.jboss.GenericJBossMarshaller
    infinispan.client.hotrod.async_executor_factory = org.infinispan.client.hotrod.impl.async.DefaultAsyncExecutorFactory
    infinispan.client.hotrod.default_executor_factory.pool_size = 1
    infinispan.client.hotrod.default_executor_factory.queue_size = 10000
    infinispan.client.hotrod.hash_function_impl.1 = org.infinispan.client.hotrod.impl.consistenthash.ConsistentHashV1
    infinispan.client.hotrod.tcp_no_delay = true
    infinispan.client.hotrod.ping_on_startup = true
    infinispan.client.hotrod.request_balancing_strategy = org.infinispan.client.hotrod.impl.transport.tcp.RoundRobinBalancingStrategy
    infinispan.client.hotrod.key_size_estimate = 64
    infinispan.client.hotrod.value_size_estimate = 512
    infinispan.client.hotrod.force_return_values = false
    
    ## below is connection pooling config
    
    maxActive=-1
    maxTotal = -1
    maxIdle = -1
    whenExhaustedAction = 1
    timeBetweenEvictionRunsMillis=120000
    minEvictableIdleTimeMillis=300000
    testWhileIdle = true
    minIdle = 1

保护远程缓存容器

可以使用 SSL 保护与远程红帽数据网格实例的通信。这可以通过在 JBoss EAP 实例 上配置 remote-cache-container 并在红帽数据网格实例上调整 hotrod 连接器以使用活动的安全域来完成。

  1. 在 JBoss EAP 中创建 客户端-ssl-context。有关创建 客户端-ssl-context 的更多信息,包括生成其他 elytron 组件,请参阅 如何为 JBoss EAP 配置服务器 安全性中的 客户端-ssl-context

    /subsystem=elytron/client-ssl-context=CLIENT_SSL_CONTEXT:add(key-manager=KEY_MANAGER,trust-manager=TRUST_MANAGER)
  2. 配置远程缓存容器,以使用客户端 SSL 上下文。

    /subsystem=infinispan/remote-cache-container=CACHE_CONTAINER/component=security:write-attribute(name=ssl-context,value=CLIENT_SSL_CONTEXT)
  3. 保护远程红帽数据网格实例,并为每个实例重复此操作。

    1. client-ssl-context 中使用的密钥存储复制到远程红帽数据网格实例。
    2. 配置 ApplicationRealm 以使用此密钥存储。

      /core-service=management/security-realm=ApplicationRealm/server-identity=ssl:add(keystore-path="KEYSTORE_NAME",keystore-relative-to="jboss.server.config.dir",keystore-password="KEYSTORE_PASSWORD")
    3. 调整热连接器以指向此安全域。

      /subsystem=datagrid-infinispan-endpoint/hotrod-connector=hotrod-connector/encryption=ENCRYPTION:add(require-ssl-client-auth=false,security-realm="ApplicationRealm")
    4. 重新载入远程红帽数据网格实例。

      reload