11.14. 为多个可引导 JAR 实例启用 Web 会话数据存储


您可以将 web-clustering 应用程序构建并打包为可引导 JAR。

先决条件

  • 您已检查了最新的 Maven 插件版本,如 9.minor.micro.Final-redhat-XXXXX,其中 9 是主版本,次版本微型 版本,X 是 Red Hat 构建号。例如: 9.0.1.Final-redhat-00009
  • 您已创建了 Maven 项目,并添加用于创建 web-clustering 应用程序的依赖项。请参阅 创建可引导 JAR Maven 项目

    重要

    在设置 Maven 项目时,您必须在 Maven archetype 配置中指定值。例如:

    $ mvn archetype:generate \
    -DgroupId=com.example.webclustering \
    -DartifactId=web-clustering \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-webapp \
    -DinteractiveMode=false
    cd web-clustering
    注意

    流程中显示的示例指定以下属性:

    • ${bootable.jar.maven.plugin.version} 用于 Maven 插件版本。

    您必须在项目中设置这些属性。例如:

    <properties>
        <bootable.jar.maven.plugin.version>9.0.1.Final-redhat-00009</bootable.jar.maven.plugin.version>
    </properties>

流程

  1. pom.xml 文件的 <build > 元素中添加以下内容。例如:

    <plugins>
    	<plugin>
    		<groupId>org.wildfly.plugins</groupId>
    		<artifactId>wildfly-jar-maven-plugin</artifactId>
    		<version>${bootable.jar.maven.plugin.version}</version>
    		<configuration>
    			<channels>
    				<channel>
    					<manifest>
    						<groupId>org.jboss.eap.channels</groupId>
    						<artifactId>eap-8.0</artifactId>
    					</manifest>
    				</channel>
    				<channel>
    					<manifest>
    						<groupId>org.jboss.eap.channels</groupId>
    						<artifactId>eap-xp-5.0</artifactId>
    					</manifest>
    				</channel>
    			</channels>
    			<feature-pack-location>org.jboss.eap.xp:wildfly-galleon-pack</feature-pack-location>
    			<layers>
    				<layer>datasources-web-server</layer>
    				<layer>web-clustering</layer>
    			</layers>
    		</configuration>
    		<executions>
    			<execution>
    				<goals>
    					<goal>package</goal>
    				</goals>
    			</execution>
    		</executions>
    	</plugin>
    </plugins>
    注意

    这个示例使用 web-clustering Galleon 层启用 Web 会话共享。

  2. 使用以下配置更新 src/main/webapp/WEB-INF 目录中的 web.xml 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <web-app version="4.0"
             xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee  http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
        <distributable/>
    </web-app>

    & lt;distributable /> 标签表示此 servlet 可以在多个服务器间分布。

  3. 创建用于存储 Java 文件的目录:

    $ mkdir -p APPLICATION_ROOT
    /src/main/java/com/example/webclustering/

    其中 APPLICATION_ROOT 是包含应用的 pom.xml 配置文件的目录。

  4. 创建包含以下内容的 Java 文件 MyServlet.java,并将该文件保存到 APPLICATION_ROOT/src/main/java/com/example/webclustering/ 目录中。

    package com.example.webclustering;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    @WebServlet(urlPatterns = {"/clustering"})
    public class MyServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws IOException {
            response.setContentType("text/html;charset=UTF-8");
            long t;
            User user = (User) request.getSession().getAttribute("user");
            if (user == null) {
                t = System.currentTimeMillis();
                user = new User(t);
                request.getSession().setAttribute("user", user);
            }
            try (PrintWriter out = response.getWriter()) {
                out.println("<!DOCTYPE html>");
                out.println("<html>");
                out.println("<head>");
                out.println("<title>Web clustering demo</title>");
                out.println("</head>");
                out.println("<body>");
                out.println("<h1>Session id " + request.getSession().getId() + "</h1>");
                out.println("<h1>User Created " + user.getCreated() + "</h1>");
                out.println("<h1>Host Name " + System.getenv("HOSTNAME") + "</h1>");
                out.println("</body>");
                out.println("</html>");
            }
        }
    }

    MyServlet.java 中的内容定义客户端向其发送 HTTP 请求的端点。

  5. 创建包含以下内容的 Java 文件 User.java,并将文件保存到 APPLICATION_ROOT/src/main/java/com/example/webclustering/ 目录中。

    package com.example.webclustering;
    
    import java.io.Serializable;
    
    public class User implements Serializable {
        private final long created;
    
        User(long created) {
            this.created = created;
        }
        public long getCreated() {
            return created;
        }
    }
  6. 打包应用程序:

    $ mvn package
  7. 可选 : 要在 JBoss EAP 裸机平台上运行应用程序,请按照在 JBoss EAP 裸机平台中使用可引导 JAR 中所述的步骤,但有以下区别:

    1. 在 JBoss EAP 裸机平台上,您可以使用 java -jar 命令运行多个可引导 JAR 实例,如下例所示:

      $ java -jar target/web-clustering-bootable.jar -Djboss.node.name=node1
      
      $ java -jar target/web-clustering-bootable.jar -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=10
    2. 验证 :您可以访问节点 1 实例中的应用程序: http://127.0.0.1:8080/clustering。记录用户会话 ID 和用户创建时间。

      终止此实例后,您可以访问节点 2 实例: http://127.0.0.1:8090/clustering。用户必须与会话 ID 和节点 1 实例的用户创建时间匹配。

  8. 可选 : 要在 JBoss EAP OpenShift 平台上运行应用程序,请按照在 JBoss EAP OpenShift 平台上使用可引导 JAR 中所述的步骤,但完成以下步骤:

    1. 在插件配置中添加 <cloud /> 元素。例如:

      <plugins>
         <plugin>
             ... <!-- You must evolve the existing configuration with the <cloud/> element  -->
             <configuration >
                 ...
                 <cloud/>
              </configuration>
          </plugin>
      </plugins>
    2. 重建应用程序:

      $ mvn clean package
    3. 使用 oc login 命令登录到您的 OpenShift 实例。
    4. 在 OpenShift 中创建一个新项目。例如:

      $ oc new-project bootable-jar-project
    5. 若要在 JBoss EAP OpenShift 平台上运行 web-clustering 应用,必须为 Pod 在其中运行的服务帐户授予授权访问权限。然后,服务帐户可以访问 Kubernetes REST API。以下示例显示了为服务帐户授予授权访问权限:

      $ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default
    6. 输入以下 oc 命令来创建应用程序镜像:

      $ mkdir target/openshift && cp target/web-clustering-bootable.jar target/openshift 
      1
      
      
      $ oc import-image ubi8/openjdk-17 --from=registry.redhat.io/ubi8/openjdk-17 --confirm 
      2
      
      
      $ oc new-build --strategy source --binary --image-stream openjdk-17 --name web-clustering 
      3
      
      
      $ oc start-build web-clustering --from-dir target/openshift 
      4
      1
      创建 target/openshift 子目录。打包的应用程序被复制到 openshift 子目录。
      2
      将最新的 OpenJDK 17 镜像流标签和镜像信息导入到 OpenShift 项目中。
      3
      根据 web-clustering 目录和 OpenJDK 17 镜像流创建构建配置。
      4
      使用 target/openshift 子目录作为二进制输入来构建应用程序。
    7. 部署应用程序:

      $ oc new-app web-clustering -e KUBERNETES_NAMESPACE=$(oc project -q)
      
      $ oc expose svc/web-clustering
      重要

      您必须使用 KUBERNETES_NAMESPACE 环境变量查看当前 OpenShift 命名空间中的其他 pod;否则,服务器会尝试从 default 命名空间检索 pod。

    8. 获取路由的 URL。

      $ oc get route web-clustering --template='{{ .spec.host }}'
    9. 使用上一命令返回的 URL,访问 Web 浏览器中的应用。例如:

      http://ROUTE_NAME/clustering

      记录用户会话 ID 和用户创建时间。

    10. 将应用程序扩展到两个 pod:

      $ oc scale --replicas=2 deployments web-clustering
    11. 发出以下命令来查看可用的 OpenShift pod 列表,并检查 pod 构建状态:

      $ oc get pods
    12. 使用 oc delete pod web-clustering-POD_NAME命令终止 最旧的 pod,其中 POD_NAME 是最旧的 pod 的名称。
    13. 再次访问应用程序:

      http://ROUTE_NAME/clustering

      预期的结果:会话 ID 和新 pod 生成的创建时间与终止的 pod 的创建时间匹配。这表示启用了 Web 会话数据存储。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部