11.14. 여러 부팅 가능한 JAR 인스턴스에 대한 웹 세션 데이터 스토리지 활성화
웹 클러스터 애플리케이션을 부팅 가능한 JAR로 빌드하고 패키징할 수 있습니다.
사전 요구 사항
-
9.minor.micro.Final-redhat-XXXXX와 같은 최신 Maven 플러그인 버전을 확인했습니다. 여기서 9 는 주요 버전이며 마이너 버전은 마이크로 마이크로 버전이며 X 는 Red Hat 빌드 번호입니다. 예:9.0.1.Final-redhat-00009. Maven 프로젝트를 생성하고 웹 클러스터 애플리케이션을 생성하기 위한 종속 항목을 추가했습니다. 부팅 가능한 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>-
프로세스
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>참고이 예제에서는
웹 클러스터링 Galleon 계층을사용하여 웹 세션 공유를 활성화합니다.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/> 태그는 이 서블릿이 여러 서버에 분산될 수 있음을 나타냅니다.Java 파일을 저장할 디렉터리를 만듭니다.
$ mkdir -p APPLICATION_ROOT /src/main/java/com/example/webclustering/여기서
APPLICATION_ROOT는 애플리케이션의pom.xml구성 파일이 포함된 디렉터리입니다.다음 내용으로 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 요청을 보내는 끝점을 정의합니다.다음 콘텐츠를 사용하여 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; } }애플리케이션을 패키징합니다.
$ mvn package선택 사항: JBoss EAP 베어 메탈 플랫폼에서 애플리케이션을 실행하려면 JBoss EAP 베어 메탈 플랫폼에서 부팅 가능한 JAR 사용에 설명된 단계를 따르십시오. 그러나 다음과 같은 차이점이 있습니다.
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확인: 노드 1 인스턴스에서 애플리케이션에 액세스할 수 있습니다. http://127.0.0.1:8080/clustering. 사용자 세션 ID와 사용자 생성 시간을 확인합니다.
이 인스턴스를 종료한 후 노드 2 인스턴스에 액세스할 수 있습니다. http://127.0.0.1:8090/clustering. 사용자는 노드 1 인스턴스의 세션 ID 및 사용자 생성 시간과 일치해야 합니다.
선택 사항: JBoss EAP OpenShift 플랫폼에서 애플리케이션을 실행하려면 JBoss EAP OpenShift 플랫폼에서 부팅 가능한 JAR 사용에 설명된 단계를 수행하되 다음 단계를 완료합니다.
<
;cloud/> 요소를 플러그인 구성에 추가합니다. 예를 들면 다음과 같습니다.<plugins> <plugin> ... <!-- You must evolve the existing configuration with the <cloud/> element --> <configuration > ... <cloud/> </configuration> </plugin> </plugins>애플리케이션을 다시 빌드합니다.
$ mvn clean package-
oc login명령을 사용하여 OpenShift 인스턴스에 로그인합니다. OpenShift에서 새 프로젝트를 생성합니다. 예를 들면 다음과 같습니다.
$ oc new-project bootable-jar-projectJBoss EAP OpenShift 플랫폼에서 웹 클러스터 애플리케이션을 실행하려면 포드가 실행 중인 서비스 계정에 대한 권한 부여 액세스 권한을 부여해야 합니다. 그러면 서비스 계정이 Kubernetes REST API에 액세스할 수 있습니다. 다음 예제에서는 서비스 계정에 권한 부여 권한을 보여줍니다.
$ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default다음
oc명령을 입력하여 애플리케이션 이미지를 생성합니다.$ mkdir target/openshift && cp target/web-clustering-bootable.jar target/openshift1 $ oc import-image ubi8/openjdk-17 --from=registry.redhat.io/ubi8/openjdk-17 --confirm2 $ oc new-build --strategy source --binary --image-stream openjdk-17 --name web-clustering3 $ oc start-build web-clustering --from-dir target/openshift4 애플리케이션을 배포합니다.
$ oc new-app web-clustering -e KUBERNETES_NAMESPACE=$(oc project -q) $ oc expose svc/web-clustering중요KUBERNETES_NAMESPACE환경 변수를 사용하여 현재 OpenShift 네임 스페이스의 다른 pod를 확인해야 합니다. 그러지 않으면 서버가default네임스페이스에서 포드를 검색하려고 합니다.경로의 URL을 가져옵니다.
$ oc get route web-clustering --template='{{ .spec.host }}'이전 명령에서 반환된 URL을 사용하여 웹 브라우저의 애플리케이션에 액세스합니다. 예를 들면 다음과 같습니다.
http://ROUTE_NAME/clustering사용자 세션 ID 및 사용자 생성 시간을 확인합니다.
애플리케이션을 두 개의 Pod로 확장합니다.
$ oc scale --replicas=2 deployments web-clustering다음 명령을 실행하여 사용 가능한 OpenShift Pod 목록을 보고 포드 빌드 상태를 확인합니다.
$ oc get pods-
oc delete pod web-clustering-POD_NAME명령을 사용하여 가장 오래된 Pod를 종료합니다. 여기서 POD_NAME 은 가장 오래된 Pod의 이름입니다. 애플리케이션에 다시 액세스합니다.
http://ROUTE_NAME/clustering예상 결과: 새 Pod에서 생성한 세션 ID와 종료된 Pod의 생성 시간과 일치합니다. 이는 웹 세션 데이터 스토리지가 활성화되었음을 나타냅니다.