참고:

Oracle Visual Builder Studio에서 Oracle SOA Suite 배치

소개

Oracle Visual Builder Studio는 다음과 같은 다양한 기술로 DevOps 프로세스를 자동화하는 공식 Oracle 도구입니다.

이 사용지침서에서는 Oracle SOA Suite에서 다음 기능을 구현하는 방법의 예를 보여줍니다.

중요 참고: 현재는 Oracle Visual Builder Studio를 통해 Oracle SOA Suite로 CI/CD를 구현하는 것만 가능합니다. 이는 Visual Builder Studio에만 필요한 패키지를 처리 및 컴파일(BUILD)하기 위해 가상 시스템에 플러그인이 이미 사전 설치되어 있기 때문입니다. 따라서 아직 Jenkins와 같은 다른 시장 도구로 CI/CD를 구현할 수 없습니다.

목표

Oracle Visual Builder Studio를 사용하여 DevOps 프로세스를 통해 자동으로 배치할 수 있는 프로젝트를 SOA Suite에서 구현합니다.

필요 조건

다음에 대한 지식:

작업 1: Oracle Streaming 인스턴스 생성

Oracle Cloud Streaming은 오픈 소스 Kafka 툴처럼 메시지 대기열 역할을 하는 애플리케이션입니다. Oracle Streaming은 관리형 솔루션으로서, 사용할 인스턴스를 생성하므로 인프라 거버넌스에 대해 걱정할 필요가 없습니다. 사용량에 대해서만 비용이 발생합니다. 또한 이 툴을 사용하면 Kafka의 REST API를 사용하여 기존 Kafka 프로젝트와 "서비스형 클라우드"의 이점을 호환할 수 있습니다.

이 자습서에서는 SOA 서비스 구현을 실행하여 메시지 대기열의 데이터를 소비하는 다른 서비스를 생성합니다. 따라서 첫 번째 단계에서는 Oracle Streaming 환경을 프로비저닝합니다.

작업 2: JDeveloper에서 SOA Suite 프로젝트 생성

Kafka를 대체하기 위해 Oracle Cloud Streaming 인스턴스를 생성할 것입니다. 다음 목표로 프로젝트를 만듭니다.

이 튜토리얼에는 전체 프로젝트가 포함되어 있습니다. 설정을 변경하여 SOA Suite 인스턴스에 컴파일, 패키지화 및 배치할 수 있습니다.

참고: 이 사용지침서에는 REST 서비스를 구현하는 자세한 단계가 포함되어 있지 않습니다. 자세한 내용은 Oracle SOA Suite로 REST 서비스를 구현하고 사용하는 방법을 참조하십시오.

  1. SOAKafkaProducerApp 프로젝트를 다운로드하려면 SOAKafkaProducerApp.zip 링크를 사용합니다.

    • /SOAKafkaProducerApp/SOAKafkaProducerApp/SOAKafkaProducerApp.jws 응용 프로그램 파일을 찾습니다.

    • JDeveloper(SOAKafkaProducerPrjSOAKafkaConsumerPrj)에서 프로젝트를 볼 수 있습니다.

  2. 응용 프로그램 트리를 누르고 SOAKakfaConsumerPrj를 찾고 다음 그림과 같이 KafkaConsumer를 두 번 누릅니다.

    jdev-soa-1.png

    • Kafka 대기열 소비에 대한 SOA 프로젝트의 비전입니다. 이는 SOA 조합 유형의 일반적인 구현입니다. 이 서비스는 REST 서비스(노출된 서비스 레인에 배치된 구성요소)이며 SOA 서버에 배치되어야 합니다. 서비스에 연결된 구성 요소는 서비스 자체의 구현이며 이전 이미지와 같이 Components 스윔레인에 정렬됩니다. KafkaConsumer 구성요소를 두 번 누르면 아래와 같이 서비스 구현으로 이동합니다.

      jdev-bpel-1.png

    • 첫 번째 구현 단계는 REST 호출의 일반적인 초기 작업 매개변수 수신을 담당하는 수신이라는 구성요소로 시작합니다. 이 자습서에서는 매개변수를 전달하지 않지만 이 리소스가 필요한 서비스에 대한 설명입니다.

      jdeve-receive-1.png

      jdev-수신-detail.png

      jdev-bpel-code.png

    • Java Embedded 구성 요소는 나중에 주석 처리된 KafaExample 클래스를 호출하는 Java 루틴을 호출합니다.

      jdev 내장 - code-1.png

    • 이 Java Embedding에서 호출된 Java 코드는 Kafka 또는 Oracle Stream 대기열의 운용 및 소비 루틴을 담당합니다(Oracle Streaming API는 Kakfa와 호환됨).

      java
      		package soakafka;
      
      		import org.apache.kafka.clients.consumer.ConsumerRecord;
      		import org.apache.kafka.clients.consumer.ConsumerRecords;
      		import org.apache.kafka.clients.consumer.KafkaConsumer;
      		import org.apache.kafka.clients.producer.KafkaProducer;
      		import org.apache.kafka.clients.producer.Producer;
      		import org.apache.kafka.clients.producer.ProducerRecord;
      		import org.apache.kafka.common.serialization.StringSerializer;
      		import org.apache.kafka.common.serialization.StringDeserializer;
      
      		import java.util.Arrays;
      		import java.util.Date;
      		import java.util.Properties;
      
      		import java.util.concurrent.ExecutionException;
      
      		import org.apache.kafka.clients.producer.Callback;
      		import org.apache.kafka.common.errors.WakeupException;
      
      		public class KafkaExample {
      		    private final String topic;
      		    private final Properties props;
      
      		    public KafkaExample(String brokers, String username, String password) {
      		        this.topic = "kafka_like";
      
      		        String jaasTemplate = "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"%s\" password=\"%s\";";
      		        String jaasCfg = String.format(jaasTemplate, username, password);
      
      		        String serializer = StringSerializer.class.getName();
      		        String deserializer = StringDeserializer.class.getName();
      		        //Propriedades
      		        props = new Properties();
      		        props.put("bootstrap.servers", brokers);
      		        props.put("group.id", "kafka-hoshikawa");
      		        props.put("enable.auto.commit", "false");
      		        props.put("max.poll.records", "10");
      		        props.put("auto.offset.reset", "earliest");
      		        props.put("key.deserializer", deserializer);
      		        props.put("value.deserializer", deserializer);
      		        props.put("security.protocol", "SASL_SSL");
      		        props.put("sasl.mechanism", "PLAIN");
      		        props.put("sasl.jaas.config", jaasCfg);
      		        //props.put("ssl.client.auth", "requested");
      		    }
      
      		    public String consume() {
      		        String ret = "";
      		        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
      		        consumer.subscribe(Arrays.asList(topic));
      
      		        try {
      		          while (true) {
      		            ConsumerRecords<String, String> records = consumer.poll(100);
      		            for (ConsumerRecord<String, String> record : records)
      		            {
      		              System.out.println(record.offset() + ": " + record.value());
      		              ret = ret + record.value();
      		            }
      		              if (ret != "")
      		                break;
      		          }
      		        } catch (Exception e) {
      		          // ignore for shutdown
      		        } finally {
      		          consumer.commitAsync();
      		          consumer.close();
      		        }
      		        return ret;
      		    };
      
      		    public void produce(String message) {
      		        Producer<String, String> producer = new KafkaProducer<String, String>(props);
      		        ProducerRecord record = new ProducerRecord<String, String>(topic, "msg", message);
      
      		        Callback callback = (data, ex) -> {
      		            if (ex != null) {
      		                ex.printStackTrace();
      		                return;
      		            }
      		            System.out.println(
      		                "Mensagem enviada com sucesso para: " + data.topic() + " | partition " + data.partition() + "| offset " + data.offset() + "| tempo " + data
      		                    .timestamp());
      		        };
      		        try {
      		            producer.send(record, callback).get();
      		        } catch (ExecutionException | InterruptedException e) {
      		        }
      		        finally {
      		            producer.close();
      		        }
      		    }
      
      		    public static void main(String[] args) {
      		                /*
      				String brokers = System.getenv("CLOUDKARAFKA_BROKERS");
      				String username = System.getenv("CLOUDKARAFKA_USERNAME");
      				String password = System.getenv("CLOUDKARAFKA_PASSWORD");
      		                */
      		                String brokers = "cell-1.streaming.us-ashburn-1.oci.oraclecloud.com:9092";
      		                String username = "hoshikawaoraclecloud/oracleidentitycloudservice/hoshikawa2@hotmail.com/ocid1.streampool.oc1.iad.amaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkgztajzakb5a";
      		                String password = "Wxxxxxxxxxxxxxxxxxxxxxxk";
      				KafkaExample c = new KafkaExample(brokers, username, password);
      		        c.consume();
      		    }
      		}
      
      		    public static void main(String[] args) {
      		                /*
      				String brokers = System.getenv("CLOUDKARAFKA_BROKERS");
      				String username = System.getenv("CLOUDKARAFKA_USERNAME");
      				String password = System.getenv("CLOUDKARAFKA_PASSWORD");
      		                */
      		                String brokers = "cell-1.streaming.us-ashburn-1.oci.oraclecloud.com:9092";
      		                String username = "hoshikawaoraclecloud/oracleidentitycloudservice/zzzzzzzzz2@zzzzzzil.com/ocid1.streampool.oc1.iad.amaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkgztajzakb5a";
      		                String password = "Wxxxxxxxxxxxxxxxxxxxxxxk";
      				KafkaExample c = new KafkaExample(brokers, username, password);
      		        c.consume();
      		    }
      		}
      
      
      

      jdev-assign-1.png

      jdev-assign-details.png을 입력합니다.

      jdev-reply-1.png

      jdev-회신-details.png

  3. Maven으로 코드에 Java 패키지를 포함합니다.

    • 이 프로젝트에서는 Kafka 또는 Oracle Cloud Streaming API를 호출하는 Java 코드를 주입합니다. Java 코드이므로 프레임워크를 사용하려면 패키지 포함이 필요한 경우가 많습니다. Maven은 이러한 경우 가장 많이 사용되는 도구이며 이를 프로젝트에 포함해야 합니다. 마우스 오른쪽 버튼을 사용하여 프로젝트 위의 옵션을 열고 다음 이미지와 같이 갤러리에서를 선택합니다.

      soa-create-pom-file.png

    • 프로젝트에 대한 Maven POM 옵션을 선택합니다.

      soa-maven-select.png

    이제 필요한 프레임워크로 패키지를 구성할 수 있습니다.

  4. Maven으로 구축하십시오.

    • Application Windows 옵션을 누른 다음 Directory View를 눌러 /SOA/SCA-INF/pom.xml 파일에 액세스합니다.

      보기-maven-pom-xml-file.png

      파일-pom-xml-file2.png

    • pom.xml 파일을 두 번 눌러 JDeveloper 편집기에서 열고 Source 탭을 선택하여 코드를 확인합니다.

    • 이렇게 하면 pom.xml 파일의 코드를 시각화할 수 있습니다.

      pom-xml-original.png

    • 다음은 DevOps 프로세스에 대한 매우 중요한 변경 사항입니다. 자동화를 위해 이러한 라인을 포함해야 합니다.

      참고: 이 자습서의 프로젝트는 DevOps 자동화를 지원하도록 이미 구성되어 있지만 새 프로젝트의 경우 이 절차에 따라 DevOps 프로세스를 자동화합니다. 태그와 태그 사이에 이 코드를 포함할 수 있습니다. 이 코드는 이후 배치를 위해 소프트웨어 패키지를 **Ant**로 어셈블하는 것입니다.

      DevOps 자동화의 경우 다음 세 행을 포함해야 합니다.

      <directory>target</directory>

      <outputDirectory>classes</outputDirectory>

      <sourceDirectory>src</sourceDirectory>

      devops-pom-xml.png

      따라서 전체 코드는 다음과 같습니다.

      xml
          pom.xml
      
          <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
      
            <groupId>soakafka</groupId>
            <artifactId>kafka</artifactId>
            <version>1.0-SNAPSHOT</version>
      
            <dependencies>
              <dependency>
                <groupId>org.apache.kafka</groupId>
                <artifactId>kafka-clients</artifactId>
                <version>1.0.0</version>
              </dependency>
            </dependencies>
      
            <build>
      
              <!-- For DevOps automation, you need to include the 3 lines below - Cristiano Hoshikawa - 2020-11-28 -->        
              <directory>target</directory>
              <outputDirectory>classes</outputDirectory>
              <sourceDirectory>src</sourceDirectory>
      
              <plugins>
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <version>3.1</version>
                  <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                  </configuration>
                </plugin>
                <plugin>
                  <artifactId>maven-assembly-plugin</artifactId>
                  <configuration>
                    <archive>
                      <manifest>
                        <mainClass>KafkaExample</mainClass>
                      </manifest>
                    </archive>
                    <descriptorRefs>
                      <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                  </configuration>
                  <executions>
                    <execution>
                      <id>make-assembly</id> <!-- this is used for inheritance merges -->
                      <phase>package</phase> <!-- bind to the packaging phase -->
                      <goals>
                        <goal>single</goal>
                      </goals>
                    </execution>
                  </executions>
                </plugin>
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-jar-plugin</artifactId>
                  <version>3.0.2</version>
                  <configuration>
                    <archive>
                      <manifest>
                        <mainClass>KafkaExample</mainClass>
                        <addClasspath>true</addClasspath>
                      </manifest>
                    </archive>
                  </configuration>
                </plugin>
              </plugins>
            </build>  
          </project>
      
      
  5. Ant를 사용하여 구축하고 배포하십시오.

    • AntJakarta 프로젝트에서 개발한 잘 알려진 시장 도구로, Java와 같은 프로젝트에 대한 컴파일, 패키지 빌드 및 응용 프로그램 배치 자동화를 담당합니다. DevOps 프로세스에서 AntSOA Suite 패키지를 빌드하고 원격 Weblogic SOA Suite 서버에 이 패키지를 배치하기 위한 기본 사항이 됩니다.

    • build.xml 파일을 만들려면 마우스 오른쪽 버튼을 눌러 프로젝트 위에 있는 옵션을 열고 다음 그림과 같이 From Gallery를 선택합니다.

      soa-create-pom-file.png

    • 왼쪽 메뉴에서 Ant 옵션을 선택한 다음 Buildfile from Project를 누릅니다.

      soa-create-ant.png

    • build.xml 파일은 Ant와 함께 사용하기 위한 매우 일반적인 구성 파일입니다.

      xml
          build.xml
      
          <?xml version="1.0" encoding="UTF-8" ?>
          <!--Ant buildfile generated by Oracle JDeveloper-->
          <!--Generated Oct 12, 2020 11:35:33 PM-->
          <project xmlns="antlib:org.apache.tools.ant" name="SOAKafkaProducerPrj" default="all" basedir=".">
            <property environment="env" />
            <property file="build.properties"/>
            <path id="library.SOA.Designtime">
              <pathelement location="${install.dir}/soa/plugins/jdeveloper/extensions/oracle.sca.modeler.jar"/>
            </path>
            <path id="library.SOA.Runtime">
              <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.fabric_11.1.1/fabric-runtime.jar"/>
              <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.fabric_11.1.1/tracking-api.jar"/>
              <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.fabric_11.1.1/tracking-core.jar"/>
              <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.fabric_11.1.1/edn.jar"/>
              <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.mgmt_11.1.1/soa-infra-mgmt.jar"/>
              <pathelement location="${oracle.commons}/modules/com.oracle.webservices.fabric-common-api.jar"/>
            </path>
            <path id="library.BPEL.Runtime">
              <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.bpel_11.1.1/orabpel.jar"/>
            </path>
            <path id="library.Mediator.Runtime">
              <pathelement location="${install.dir}/soa/soa/modules/oracle.soa.mediator_11.1.1/mediator_client.jar"/>
            </path>
            <path id="library.MDS.Runtime">
              <pathelement location="${oracle.commons}/modules/oracle.mds/mdsrt.jar"/>
            </path>
            <path id="library.BC4J.Service.Runtime">
              <pathelement location="${oracle.commons}/modules/oracle.adf.model/adfbcsvc.jar"/>
              <pathelement location="${oracle.commons}/modules/oracle.adf.model/adfbcsvc-share.jar"/>
              <pathelement location="${oracle.commons}/modules/commonj.sdo.backward.jar"/>
              <pathelement location="${oracle.commons}/modules/commonj.sdo.jar"/>
              <pathelement location="${oracle.commons}/modules/oracle.toplink/eclipselink.jar"/>
              <pathelement location="${oracle.commons}/modules/com.oracle.webservices.fmw.wsclient-impl.jar"/>
              <pathelement location="${oracle.commons}/modules/com.oracle.webservices.fmw.jrf-ws-api.jar"/>
              <pathelement location="${oracle.commons}/modules/com.oracle.webservices.fmw.web-common-schemas-impl.jar"/>
            </path>
            <path id="classpath">
              <path refid="library.SOA.Designtime"/>
              <path refid="library.SOA.Runtime"/>
              <path refid="library.BPEL.Runtime"/>
              <path refid="library.Mediator.Runtime"/>
              <path refid="library.MDS.Runtime"/>
              <path refid="library.BC4J.Service.Runtime"/>
            </path>
            <target name="init">
              <tstamp/>
              <mkdir dir="${workspace}/SOAKafkaProducerApp/SOAKafkaProducerPrj/SOA/SCA-INF/classes"/>
            </target>
            <target name="all" description="Build the project" depends="deploy,copy"/>
            <target name="clean" description="Clean the project">
              <delete includeemptydirs="true" quiet="true">
                <fileset dir="${output.dir}" includes="**/*"/>
              </delete>
            </target>
            <target name="compile" depends="init">
                <javac
                         srcdir="${workspace}/SOAKafkaProducerApp/SOAKafkaProducerPrj/SOA/SCA-INF/src/soakafka"
                         destdir="${workspace}/SOAKafkaProducerApp/SOAKafkaProducerPrj/SOA/SCA-INF/classes"
                     includeantruntime="false">
                     <include name="${workspace}/SOAKafkaProducerApp/SOAKafkaProducerPrj/SOA/SCA-INF/lib/**"/>
              </javac>
            </target>
            <target name="sca-compile" depends="compile">
                <ant antfile="${middleware.home}/soa/bin/ant-sca-compile.xml" inheritAll="false">
                     <property name="scac.input" value="${workspace}/SOAKafkaProducerApp/SOAKafkaProducerPrj/SOA/composite.xml"/>
                </ant>
            </target>
      
            <target name="sca-package" depends="sca-compile">
                <ant antfile="/${middleware.home}/soa/bin/ant-sca-package.xml" inheritAll="false">
                     <property name="compositeDir" value="${workspace}/SOAKafkaProducerApp/SOAKafkaProducerPrj/SOA"/>
                    <property name="compositeName" value="SOAKafkaProducerPrj"/>
                    <property name="revision" value="${revision}"/>
                    <property name="sca.application.home" value="${workspace}/SOAKafkaProducerApp/SOAKafkaProducerPrj"/>
                </ant>
            </target>
      
            <target name="deploy" description="Deploy JDeveloper profiles" depends="sca-package">
              <taskdef name="ojdeploy" classname="oracle.jdeveloper.deploy.ant.OJDeployAntTask" uri="oraclelib:OJDeployAntTask"
                       classpath="${oracle.jdeveloper.ant.library}"/>
              <ora:ojdeploy xmlns:ora="oraclelib:OJDeployAntTask" executable="${oracle.jdeveloper.ojdeploy.path}"
                            ora:buildscript="${oracle.jdeveloper.deploy.dir}/ojdeploy-build.xml"
                            ora:statuslog="${oracle.jdeveloper.deploy.dir}/ojdeploy-statuslog.xml">
                <ora:deploy>
                  <ora:parameter name="workspace" value="${oracle.jdeveloper.workspace.path}"/>
                  <ora:parameter name="project" value="${oracle.jdeveloper.project.name}"/>
                  <ora:parameter name="profile" value="${oracle.jdeveloper.deploy.profile.name}"/>
                  <ora:parameter name="nocompile" value="false"/>
                  <ora:parameter name="outputfile" value="${oracle.jdeveloper.deploy.outputfile}"/>
                </ora:deploy>
              </ora:ojdeploy>
      
               <!-- Deployment SOA Suite Composite -->
              <ant antfile="/${middleware.home}/soa/bin/ant-sca-deploy.xml" target="deploy" inheritall="false">
                <property name="user"      value="${WEBLOGICUSER}"/>
                <property name="password"  value="${WEBLOGICPWD}"/>
                <property name="serverURL"     value="${WEBLOGICURL}"/>
                <property name="sarLocation"   value="${workspace}/SOAKafkaProducerApp/SOAKafkaProducerPrj/SOA/deploy/sca_SOAKafkaProducerPrj_rev${revision}.jar"/>
                <property name="overwrite"     value="true"/>
              </ant>
      
            </target>
            <target name="copy" description="Copy files to output directory" depends="init">
              <patternset id="copy.patterns">
                <include name="**/*.GIF"/>
                <include name="**/*.JPEG"/>
                <include name="**/*.JPG"/>
                <include name="**/*.PNG"/>
                <include name="**/*.cpx"/>
                <include name="**/*.dcx"/>
                <include name="**/*.ejx"/>
                <include name="**/*.gif"/>
                <include name="**/*.ini"/>
                <include name="**/*.jpeg"/>
                <include name="**/*.jpg"/>
                <include name="**/*.png"/>
                <include name="**/*.properties"/>
                <include name="**/*.sva"/>
                <include name="**/*.tag"/>
                <include name="**/*.tld"/>
                <include name="**/*.wsdl"/>
                <include name="**/*.xcfg"/>
                <include name="**/*.xlf"/>
                <include name="**/*.xml"/>
                <include name="**/*.xsd"/>
                <include name="**/*.xsl"/>
                <include name="**/*.exm"/>
                <include name="**/*.xml"/>
                <exclude name="build.xml"/>
              </patternset>
              <copy todir="${output.dir}">
                <fileset dir="SOA/SCA-INF/src">
                  <patternset refid="copy.patterns"/>
                </fileset>
                <fileset dir=".">
                  <patternset refid="copy.patterns"/>
                </fileset>
              </copy>
            </target>
          </project>
      
      
    • build.properties 파일은 build.xml 구성 파일에 사용될 등록 정보를 결정합니다.

      build.properties
      
      oracle.commons=../../../../oracle_common/
      install.dir=../../../..
      oracle.home=${env.ORACLE_HOME_SOA_12_2_1}
      oracle.jdeveloper.workspace.path=${env.WORKSPACE}/SOAKafkaProducerApp/SOAKafkaProducerApp.jws
      middleware.home=${env.MIDDLEWARE_HOME_SOA_12_2_1}
      workspace=${env.WORKSPACE}
      oracle.jdeveloper.ant.library=${env.ORACLE_HOME_SOA_12_2_1}/jdev/lib/ant-jdeveloper.jar
      oracle.jdeveloper.deploy.dir=${env.WORKSPACE}/SOAKafkaProducerApp/SOAKafkaProducerPrj/deploy
      oracle.jdeveloper.ojdeploy.path=${oracle.home}/jdev/bin/ojdeploy
      javac.nowarn=off
      oracle.jdeveloper.project.name=SOAKafkaProducerPrj
      revision=1.0
      oracle.jdeveloper.deploy.outputfile=${env.WORKSPACE}/SOAKafkaProducerApp/SOAKafkaProducerPrj/deploy/sca_${profile.name}_rev{$revision}
      output.dir=classes
      javac.deprecation=off
      oracle.jdeveloper.deploy.profile.name=*
      javac.debug=on
      WEBLOGICPWD=${env.WEBLOGICPWD}
      WEBLOGICURL=${env.WEBLOGICURL}
      WEBLOGICUSER=${env.WEBLOGICUSER}
      
      
  6. 테스트를 위해 SOA Suite 환경을 초기화합니다. 먼저 SOA Suite 환경의 방화벽 포트를 엽니다. 릴리스할 포트는 9092이며 Oracle Streaming 또는 Kafka 포트를 나타냅니다.

  7. JDeveloper에서 내장 SOA 서버를 사용으로 설정합니다.

    • JDeveloper에는 개발 및 테스트를 위한 통합 SOA Suite 서버가 있습니다. SOA 서비스를 개발하는 데 필요한 거의 모든 기능을 갖춘 서버입니다. 이 서버를 사용하려면 해당 서버를 만들고 활성화해야 합니다.

    • 서버를 활성화하려면 먼저 응용 프로그램 서버를 확인해야 합니다. 이를 위해 "Window" 옵션으로 이동하여 다음 이미지와 같이 Application Servers를 선택합니다.

      jdeveloper-select-app-server.png

    • 화면 왼쪽에 Application Servers(응용 프로그램 서버) 창이 나타납니다. integratedWeblogicServer가 window에 이미 생성되어 있는지 확인합니다. 그렇지 않은 경우 생성 후 사용을 위해 활성화해야 합니다.

    • 다음 그림과 같이 Run 옵션으로 이동하고 Start Server Instance를 선택합니다.

      jdev-start-app-server.gif

    • WebLogic 인스턴스를 생성하는 데 필요한 데이터를 입력합니다. 나중에 테스트를 위해 필요할 때 값을 기록해 둡니다.

      jdev-create-app-server.gif

    • 서버를 만들었거나 이미 사용 가능한 경우 서버를 마우스 오른쪽 버튼으로 누르고 다음 그림과 같이 활성화합니다.

      jdeveloper-start-app-server.png

  8. SOA Suite에서 수동 배치를 실행합니다.

    • 먼저 Kafka 소비자 서비스(SOAKafkaConsumerPrj)를 수동으로 배치해 보겠습니다. 이렇게 하려면 다음 이미지에 표시된 대로 Applications(응용 프로그램) 탭을 찾아 마우스 오른쪽 버튼을 눌러 메뉴 옵션을 엽니다.

      콩-deploy-1.png

    • 배치 옵션을 선택한 다음 새 배치 프로파일을 생성합니다. 구성 화면이 표시되며 파일을 생성할 때 프로파일 유형을 SOA-SAR 파일로 선택해야 합니다.

      콩-deploy-2.png

    • 이렇게 하면 다음 단계에서 패키지를 배치할 수 있습니다. 다음 화면에서 지정된 옵션을 유지하고 OK를 누릅니다.

      콩-deploy-3.png

    • 배포 메뉴 옵션을 다시 엽니다. 배치 옵션이 생성되고 사용할 준비가 되었습니다. 선택합니다.

      콩-deploy-4.png

    • 이제 SOA 서버에 직접 배포하는 옵션을 선택하겠습니다. 그런 다음 아래와 같이 옵션을 선택합니다.

      콩-deploy-5.png

    • 제공된 모든 옵션을 그대로 두고 같은 개정 ID를 가진 기존 조합 겹쳐쓰기를 선택합니다. 이 옵션을 선택하지 않은 상태에서 첫번째 실행 후 연속 배치를 수행하려고 시도하면 오류 메시지와 함께 중단됩니다.

      콩-deploy-6.png

    • 그런 다음 IntegratedWeblogicServer 옵션을 선택합니다. 이 옵션은 이전 섹션에서 설명한 JDeveloper의 내장 서버를 나타냅니다(JDeveloper에서 내장 SOA 서버를 사용으로 설정하는 방법).

    • JDeveloper Weblogic 서버가 성공적으로 생성되고 시작된 경우 아래 옵션과 모든 것이 정상임을 확인하는 "실행" 상태가 표시됩니다. 이 옵션이 표시되지 않으면 아직 서버를 생성하지 않았거나 시작하지 않은 것일 수 있습니다. 이전 단계를 검토합니다.

      콩-deploy-9.png

    • 요약 화면이 표시될 때까지 Next로 확인하고 Finish를 누릅니다.

    • 하단 가운데 창에서 응용 프로그램 배치를 따를 수 있습니다. Deploy finished가 성공 메시지로 표시될 때까지 기다립니다.

      콩-deploy-11.png

  9. Weblogic에 JKS 인증서를 설치합니다.

    • SSL 환경에서는 WebLogic 환경에 적합한 JKS 인증서를 통해 수행되는 키(공용/전용)를 통해 보안을 만들어야 합니다. 키 생성 프로세스는 Oracle Cloud Streaming 인스턴스의 인증서를 얻고 이 인증서를 JKS 파일에 추가하여 수행됩니다. 여기서 DemoTrust(DemoTrust.jks)이라고 합니다.

      : DemoTrust.jks 파일은 Java 코드에 사용될 비밀번호와 함께 ALIAS에 기록됩니다.

    • JKS 파일을 생성한 후 이 파일을 WebLogic 서버 구조로 이동할 수 있습니다.

      1. Oracle Cloud Streaming 인증서를 가져옵니다. 자세한 내용은 Oracle Integration 2세대와 함께 Oracle Cloud Infrastructure Streaming Service Adapter 사용을 참조하십시오.

      2. JKS 파일을 생성합니다.

      3. Weblogic에 JKS 파일을 설치합니다.

        echo -n | openssl s_client -connect cell-1.streaming.us-ashburn-1.oci.oraclecloud.com:9092 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ociStreaming.cert keytool -keystore Streaming_truststore.jks -alias OSSStream -import -file ociStreaming.cert

        sudo keytool -importcert -file ociStreaming.cert -keystore DemoTrust.jks -alias "kafka" -storepass DemoTrustKeyStorePassPhrase

        예:

        echo -n | openssl s_client -connect cell-1.streaming.us-ashburn-1.oci.oraclecloud.com:9092 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ociStreaming.cert keytool -keystore Streaming_truststore.jks -alias OSSStream -import -file ociStreaming.cert

        sudo keytool -importcert -file ociStreaming.cert -keystore DemoTrust.jks -alias "kafka" -storepass DemoTrustKeyStorePassPhrase

        • 별칭으로 키 저장소를 생성하거나 삭제하려면 다음 단계를 따르십시오.

          shell
              sudo keytool -import -v -file streaming.us-ashburn-1.oci.oraclecloud.com.cer -storepass changeit -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/jre/lib/security/cacerts -alias "kafka"
          
              sudo keytool -delete -alias kafka -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/jre/lib/security/cacerts -storepass changeit
          
              sudo keytool -import -v -file streaming.us-ashburn-1.oci.oraclecloud.com.cer -keystore DemoTrust.jks -alias "kafka" -storepass DemoTrustKeyStorePassPhrase
          
              sudo keytool -delete -alias kafka -keystore DemoTrust.jks -storepass DemoTrustKeyStorePassPhrase
          
        • 일반적으로 경로가 /wlserver/server/lib인 wlserver 폴더를 찾습니다. 예: cd /u01/app/oracle/middleware/wlserver/server/lib, cd /User/u01/Oracle/Middleware/Oracle_Home/wlserver/server/lib

        • DemoTrust.jks 파일을 이 단계에서 생성된 파일로 바꿉니다.

        • DemoTrust.jks 파일을 복사한 후 파일을 배포한 디렉토리를 변경해야 합니다. 다음과 같이 클래스를 만들 때 두 프로젝트(SOAKafkaProducerprjSOAKafkaConsumerprj)의 /src/soakafka/KafkaExample.java 파일을 변경합니다.

          변경-신뢰 저장소-soa-1.png

  10. 응용 프로그램을 테스트합니다.

    • 테스트 환경을 업로드한 후 인스턴스는 http://localhost:7101/em.에서 사용할 수 있습니다.

    • 유저 이름과 암호를 저장합니다.

    • SOA 메뉴 항목 및 Deployed Components 옵션에서 애플리케이션으로 이동합니다.

      콩-test-5.png

    • 구현에 따라 서비스에 필요한 메시지 매개변수를 입력합니다. 이 매개변수의 이름은 "msg"이고 메시지 형식은 이전 단계에 따라 JSON입니다.

      soa 테스트-producer-1a.png

    • JSON 형식으로 메시지를 입력한 후 "웹 서비스 테스트"를 눌러 메시지 대기열에서 생산자 서비스를 실행합니다.

      soa 테스트-producer-2.png

작업 3: Oracle Cloud에서 SOA Suite 인스턴스 생성

애플리케이션을 배치하려면 Oracle SOA Suite의 활성 인스턴스가 있어야 합니다. 이 자습서에서 사용할 인스턴스는 마켓플레이스에서 사용할 수 있는 이미지이며 서버 보호를 위해 배스천에서 제공하는 SOA Suite 구조를 갖게 됩니다.

  1. 이를 위해 인스턴스를 생성하겠습니다. Oracle Cloud 콘솔에서 기본 메뉴(화면 왼쪽 상단 모서리에 있음), "마켓플레이스" 옵션 및 "모든 애플리케이션"을 아래와 같이 누릅니다.

    시장-place.png

  2. 이미지 검색 화면에서 "soa suite"를 입력하여 올바른 이미지를 찾습니다.

    마켓플레이스-soa-suite.png

  3. "Oracle SOA Suite (BYOL)" 옵션을 눌러 인스턴스 생성을 시작합니다. 선택할 수 있는 필수 옵션이 표시됩니다. 자세한 내용은 Oracle Cloud Infrastructure에서 Oracle SOA Suite on Marketplace 사용을 참조하십시오.

    • SOA Suite 버전 확인: 12.2.1.4 이상(이 워크샵은 버전 12.2.1.4으로 개발됨)

    • SOA Suite 인스턴스를 생성할 구획을 선택합니다.

    • 라이센스 계약의 조항 및 조건에 동의하는지 확인합니다.

    • 스택 실행을 누릅니다.

      soa-suite-creation.png

  4. Oracle Cloud 콘솔 기본 메뉴에서 컴퓨트 및 인스턴스로 이동합니다.

    컴퓨팅-select.png

  5. SOA Suite 인스턴스를 생성한 구획을 선택하면 2개의 가상 머신이 표시됩니다.

    • SOA Suite 서버
    • SOA Suite 서버 보호를 위한 배스천으로 사용될 VM

    참고: VM 배스천에는 공용 IP가 있으며, 나중에 설명된 대로 IP 터널을 열어 인터넷을 통해 SOA Suite 서버에 액세스할 수 있습니다.

    인스턴스-soa-suite-compute.png

  6. Bastion Server와 SOA Suite 인스턴스 간에 터널을 설정하려면 다음과 같이 SSH 명령을 통해 터널을 설정할 수 있습니다.

    shell
        ssh -Y -i <Arq.Chave SSH> -L <Port SOA>:<IP Instance SOA Suite>:<Port External> opc@<IP Public Bastion>
    
        Example:
        ssh -Y -i keyrvbastion.pem -L 7002:10.253.128.9:7002 opc@152.67.55.11
    
    

    Bastion을 통해 연결을 설정한 후 http://localhost:7002/em.를 사용하여 Weblogic Enterprise Manager에 액세스할 수 있습니다.

작업 4: Oracle Visual Builder Studio를 사용하여 배치 자동화

이제 이전 단계에서 생성된 Weblogic 서버에 SOA 구현을 자동으로 배치해 보겠습니다. 이를 위해서는 Oracle Visual Builder Studio의 인스턴스가 필요합니다. Oracle Visual Builder Studio는 프로젝트별로 작동하므로 프로젝트를 생성하고 실행에 참여할 사용자를 포함할 수 있습니다.

이 문서 끝에 있는 관련 링크 섹션에서 작업에 대한 자세한 내용을 찾아 Visual Builder Studio를 사용하여 배치를 검색할 수 있습니다. 다음 단계에 따라 Weblogic 서버에 대한 SOA Suite 구현의 자동 빌드 및 배치를 구성합니다.

  1. ORACLE SOA Suite에서 BUILD에 대한 가상 시스템을 구성합니다. 설정을 시작하기 전에 Oracle SOA Suite 프로젝트 컴파일 요구를 충족하는 가상 머신을 구성해야 합니다. 이를 위해서는 이 VM에 설치할 올바른 도구를 선택해야 합니다.

    1. 왼쪽 메뉴에서 Organization을 누른 다음 Virtual Machine Templates를 누릅니다.

      vbst-생성-template.png

    2. 템플리트 생성을 눌러 SOA Suite 프로젝트 구축에 사용할 수 있는 툴을 구성합니다. 그런 다음 템플릿의 이름을 입력하고 원하는 경우 선택적으로 이 템플릿에 대해 설명할 수 있습니다. 이 VM이 작동할 플랫폼을 선택해야 합니다. Oracle Linux 옵션을 선택합니다(이 문서의 날짜까지는 Oracle Linux 7이 있었지만 더 최근 옵션을 선택할 수 있습니다).

      vbst-생성-template-2.png

    3. 프로젝트 작성에 필요한 중요한 구성요소를 모두 선택합니다. 아래와 같이 모든 옵션을 선택합니다.

      vbst 구성-sw.png

      vbst 구성-details.png

      TEMPLATE가 생성되고 프로젝트가 빌드를 요청하는 즉시 VM이 인스턴스화됩니다.

    4. Oracle Visual Builder Studio에서 프로젝트의 구성을 빌드합니다. 먼저 Oracle Visual Builder Studio 내에서 프로젝트를 열고 아래 예에서 CRISTIANO HOSHIKAWA PROJ를 누릅니다.

      메인 비주얼 빌더-studio.png

      • 사용 가능한 옵션이 있는 왼쪽 메뉴와 소스 코드 저장소의 프로젝트 오른쪽 및 이 프로젝트의 일부인 팀(프로젝트 사용자)과 함께 프로젝트 페이지가 표시됩니다.

        비주얼 빌더-스튜디오-project.png

    5. 왼쪽 메뉴에서 BUILD(빌드) 옵션을 눌러 기존 설정을 모두 확인한 다음 프로젝트에 대한 새 BUILD를 구성하겠습니다. 작업 생성을 누릅니다.

      비주얼 빌더-스튜디오-생성-job.png

    6. 작업의 이름을 입력하고 VM 템플리트(이전 세션에서 생성됨)도 선택합니다.

      vbst-create-작업-details.png

  2. 이제 프로젝트 빌드를 단계별로 구성하겠습니다. 구성의 첫번째 부분은 소스 코드로 이전에 생성해야 하는 Oracle SOA Suite 프로젝트의 저장소를 설정하는 것입니다. 이 문서에서는 이 문서의 git에서 사용 가능한 SOAKafkaProducerApp 프로젝트로 작업합니다. 이 프로젝트를 Oracle Visual Builder Studio 인스턴스의 git에 복제할 수 있습니다.

    1. SOAKafkaProducerApp 프로젝트를 Visual Builder Studio로 복제한 후 Git 저장소 이름으로 BUILD를 구성하고 "Automatically perform BUILD on SCM commit" 옵션을 선택합니다. 또한 분기 이름이 git 프로젝트와 일치하는지 확인합니다.

      vbst-git.png

    2. 이제 "Parameters" 탭을 선택합니다. 오른쪽에 콤보 상자 메뉴 "매개변수 추가"를 사용하여 세 개의 매개변수를 만들어야 합니다. 아래에는 생성되어야 하는 이름 및 괄호 안에 다음 유형이 있습니다.

      • WEBLOGICUSER: Weblogic 사용자(문자열 유형)

      • WEBLOGICPWD: Weblogic 사용자 비밀번호(유형 암호/비밀번호)

      • WEBLOGICURL: Weblogic 인스턴스의 URL(문자열 유형)

      • 중요한 관찰은 Bastion Server를 통해 터널이 설정되므로 WEBLOGICURL의 URL이 localhost여야 한다는 것입니다.

        vbst-parameters.png

    3. 이제 "빌드 전" 탭을 눌러 Bastion 서버에서 Weblogic SOA Suite Server로 SSH 터널을 구성합니다. SSH 키(전용 키)를 사용하고 해당 필드를 입력하십시오. 터널 조립품에 대한 데이터를 채웁니다.

      • 유저 이름: opc

      • 로컬 포트: 11002

      • 원격 호스트: SOA Suite 인스턴스의 전용 IP

      • 원격 포트: 11002

      • SSH 서버: 배스천의 공용 IP

      • 중요한 관찰 사항은 포트 11002가 SOA Suite 프로젝트를 배치하기 위한 액세스 포트로 정확하게 구성되었다는 것입니다.

        vbst-tunnel.png

    4. "단계" 탭을 눌러 SOA Suite 프로젝트의 BUILD(Maven을 통해) 및 DEPLOYMENT(ANT를 통해)를 구성합니다. 다음과 같이 입력합니다.

      • 이동
      • 목표: 패키지 컴파일

      • POM 파일: SOAKafkaProducerApp/SOAKafkaConsumerPrj/SOA/SCA-INF/pom.xml. 프로젝트 패키지를 어셈블하기 위한 Maven pom.xml 파일입니다.

      • 앤트

        • 대상: sca-package 배치

        • 빌드 파일: SOAKafkaProducerApp/SOAKafkaConsumerPrj/build.xml. 빌드 후 응용 프로그램을 배치하기 위한 Ant build.xml 파일입니다.

      • 속성

        • WEBLOGICUSER=${WEBLOGICUSER}

        • WEBLOGICPWD=${WEBLOGICPWD}

        • WEBLOGICURL=${WEBLOGICURL}

      중요:

      • SOAKafkaProducerApp 응용 프로그램에는 SOAKafkaProducerPrj 및 SOAKafkaConsumerPrj라는 두 개의 프로젝트가 있습니다.

      • 프로젝트 중 하나의 구성을 보여줍니다. 다른 프로젝트에 대해 동일한 단계를 수행해야 합니다.

      vbst 구성-step.png

    5. 이제 BUILD 구성을 완료하겠습니다. "After Build" 탭을 선택합니다. 이 단계는 선택사항이지만 Maven 실행 시 이전 단계에서 생성된 아티팩트를 생성할 수 있습니다. 이를 위해 아티팩트가 나중에 다운로드되도록 이 단계를 구성합니다.

      vbst-after-build.png

  3. Oracle Visual Builder Studio에서 BUILD를 실행합니다. 구성된 후에는 코드 저장소(Visual Builder Studio git)에 커밋이 있을 때마다 BUILD가 자동으로 시작됩니다. BUILD를 수동으로 실행할 수도 있습니다. 이렇게 하려면 BUILD 옵션을 누르기만 하면 됩니다. BUILD를 실행해 보고 생성된 로그를 확인할 수 있습니다.

    vbst-log-1.png

    vbst-logs-3.png

    vbst-logs-2.png

승인

추가 학습 자원

docs.oracle.com/learn에서 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer을 방문하십시오.

제품 설명서는 Oracle Help Center를 참조하십시오.