注:

在 Oracle Visual Builder Studio 中部署 Oracle SOA Suite

简介

Oracle Visual Builder Studio is the official Oracle tool for automating DevOps processes with different technologies like:

本教程举例说明如何在 Oracle SOA Suite 中实施以下功能。

重要说明:当前,只能通过 Oracle Visual Builder Studio 使用 Oracle SOA Suite 实施 CI/CD。这是因为只有 Visual Builder Studio 才具有已预安装在虚拟机中的插件来处理和编译 (BUILD) 所需的软件包。因此,目前还无法使用 Jenkins 等其他市场工具实施 CI/CD。

目标

在 SOA Suite 中实施项目,可以通过 Oracle Visual Builder Studio 的 DevOps 流程自动部署该项目。

先决条件

了解以下内容:

任务 1:创建 Oracle 流处理实例

Oracle Cloud Streaming 是一个应用程序,旨在像开源 Kafka 工具一样充当消息队列。Oracle 流处理是一个托管解决方案,这意味着您可以创建一个实例供使用,而不必担心基础设施治理问题。仅为您使用的容量付费。该工具还允许您使用 Kafka 的 REST API,使其与现有 Kafka 项目兼容,具有“云即服务”的优势。

在本教程中,我们将执行 SOA 服务实施来生成,而另一个服务用于使用消息队列中的数据。因此,我们的第一站将预配 Oracle 流处理环境。

任务 2:在 JDeveloper 中创建 SOA Suite 项目

我们将创建 Oracle Cloud 流处理实例以替换 Kafka。创建具有以下目标的项目:

本教程包含完整项目。您可以更改设置以编译、打包并部署到 SOA Suite 实例。

:本教程不包括实施 REST 服务的详细步骤。有关详细信息,请参阅如何通过 Oracle SOA Suite 实施和使用 REST 服务

  1. 使用此链接下载 SOAKafkaProducerApp 项目:SOAKafkaProducerApp.zip

    • 查找 /SOAKafkaProducerApp/SOAKafkaProducerApp/SOAKafkaProducerApp.jws 应用程序文件。

    • 您可以在 JDeveloper 中查看项目:SOAKafkaProducerPrjSOAKafkaConsumerPrj

  2. 单击应用程序树并查找 SOAKakfaConsumerPrj ,然后双击 KafkaConsumer,如下图所示。

    jdev-soa-1.png

    • 这是 SOA 项目对 Kafka 队列使用量的愿景。这是 SOA 组合类型的典型实施。这是 REST 服务(在公开服务通道中列出的组件),必须部署在 SOA 服务器上。链接到服务的组件是服务本身的实现,并按照上一个映像中所示排列在组件泳道中。通过双击 KafkaConsumer 组件,您将转到服务的实施,如下所示:

      jdev-bpel-1.png

    • 第一个实施阶段从名为“接收”的组件开始,该组件负责接收初始工作参数(通常是 REST 调用)。在本教程中,我们将不传递参数,但此处针对需要此资源的服务进行了说明。

      jdeve-receive-1.png

      jdev-receive-detail.png

      jdev-bpel-code.png

    • Java 嵌入式组件负责调用 Java 例程,在本例中,该例程稍后将调用名为 KafaExample 的类。

      jdev-embedded-code-1.png

    • 此 Java 嵌入中调用的 Java 代码负责 Kafka 或 Oracle 流队列的生产和使用例程(请记住,适用于 Oracle 流处理的 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-reply-details.png

  3. 使用 Maven 将 Java 程序包包含在代码中。

    • 在此项目中,我们注入 Java 代码来调用 Kafka 或 Oracle Cloud 流处理 API。由于是 Java 代码,因此通常需要包含程序包才能使用框架。在这些情况下,Maven 是最常用的工具,为此,您必须将其包含在项目中。使用鼠标右键,打开项目上的选项,然后选择从图库,如下图所示。

      soa-create-pom-file.png

    • 选择 Maven POM for Project 选项。

      soa-maven-select.png

    现在,您可以使用必要的框架配置软件包。

  4. 使用 Maven 进行构建。

    • 单击 "Application Windows"(应用程序 Windows)选项,然后单击 "Directory View"(目录视图)以访问 /SOA/SCA-INF/pom.xml 文件。

      View-maven-pom-xml-file.png

      文件 -pom-xml-file2.png

    • 双击 pom.xml 文件以在 JDeveloper 编辑器中将其打开,然后选择选项卡以查看代码。

    • 这样,您将能够可视化 pom.xml 文件的代码。

      pom-xml-original.png

    • 下面是对 DevOps 进程的重要更改。您必须包括这些用于自动化的行。

      :本教程中的项目已配置为支持 DevOps 自动化,但对于新项目,请按照以下过程自动执行 DevOps 进程。在 标记和 标记之间,可以包含此代码,这将负责将软件包汇编为以后使用 **Ant** 进行部署。

      对于 DevOps 自动化,需要包括以下 3 行。

      <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 进行构建和部署。

    • Ant 是市场中的知名工具,由 Jakarta 项目开发,负责为 Java 等项目自动执行编译、程序包构建和应用程序部署。在 DevOps 过程中, Ant 对于构建 SOA Suite 软件包以及在远程 Weblogic SOA Suite 服务器上部署此软件包至关重要。

    • 要创建 build.xml 文件,请使用鼠标右键打开项目上的选项,然后选择从图库,如下图所示。

      soa-create-pom-file.png

    • 在左侧菜单上选择选项,然后单击从项目构建文件

      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 流处理或 Kafka 端口。

  7. 在 JDeveloper 中启用嵌入式 SOA 服务器。

    • JDeveloper 具有用于开发和测试的集成 SOA Suite 服务器。它是一个服务器,具有开发 SOA 服务所需的几乎所有功能。要使用此服务器,必须创建并激活它。

    • 要激活服务器,首先需要查看应用程序服务器。为此,请转至“窗口”选项,然后选择应用程序服务器,如下图所示。

      jdeveloper-select-app-server.png

    • 应用程序服务器窗口将显示在屏幕的左侧。确保已在窗口中创建 integratedWeblogicServer。否则,您需要创建它,然后激活它以供使用。

    • 转到运行选项并选择启动服务器实例,如下图中所示。

      jdev-start-app-server.gif

    • 输入必需的数据以创建 Weblogic 实例。写下这些值,因为以后需要它们进行测试。

      jdev-create-app-server.gif

    • 如果您创建了服务器或者服务器已可用,请右键单击服务器并激活它,如下图中所示。

      jdeveloper-start-app-server.png

  8. 在 SOA Suite 中运行手动部署。

    • 首先,让我们手动部署 Kafka 使用者服务 (SOAKafkaConsumerPrj)。为此,请定位应用程序选项卡,然后使用鼠标右键打开菜单选项,如下图所示。

      soa-deploy-1.png

    • 选择部署选项,然后创建新的部署概要文件。您将看到一个配置屏幕,并且必须在生成文件时选择配置文件类型作为 SOA-SAR 文件

      soa-deploy-2.png

    • 为我们做好准备,以便在下一步中部署程序包。在下一个屏幕上,保留给定的选项并单击确定

      soa-deploy-3.png

    • 再次打开部署菜单选项。部署选项已创建并可供使用。选中它。

      soa-deploy-4.png

    • 现在,让我们选择直接部署到 SOA 服务器的选项。然后选择如下所示的选项。

      soa-deploy-5.png

    • 保留提供的所有选项,然后选择覆盖具有相同修订 ID 的任何现有组合。如果取消选中此选项,并且在首次运行后尝试执行连续部署,则会中断并显示错误消息。

      soa-deploy-6.png

    • 然后选择 IntegratedWeblogicServer 选项。此选项表示上一节中介绍的 JDeveloper 的嵌入式服务器(如何在 JDeveloper 中启用嵌入式 SOA 服务器)。

    • 如果 JDeveloper Weblogic 服务器已成功创建并启动,您将会看到下面的选项和 "RUNNING" 状态,确认所有内容都正常。如果未看到此选项,您可能尚未创建服务器或尚未启动服务器。查看以前的步骤。

      soa-deploy-9.png

    • 使用下一步确认,直到摘要屏幕并单击完成

    • 在底部中心窗口中,您可以按照应用程序的部署操作进行操作。等待您将部署完成视为成功消息。

      soa-deploy-11.png

  9. 在 Weblogic 中安装 JKS 证书。

    • 在 SSL 环境中,必须通过密钥(公共/专用)创建安全性,这些密钥将通过适合 WebLogic 环境的 JKS 证书来完成。密钥生成过程通过获取 Oracle Cloud 流处理实例的证书并将此证书添加到 JKS 文件来完成,我们称之为 DemoTrust (DemoTrust.jks)。

      :DemoTrust.jks 文件将使用 ALIAS 以及将在 Java 代码中使用的口令进行标记。

    • 创建 JKS 文件后,可以将此文件移动到 WebLogic 服务器结构中。

      1. 获取 Oracle Cloud 流处理证书。有关详细信息,请参阅将 Oracle Cloud Infrastructure Streaming Service Adapter 与 Oracle Integration 第 2 代结合使用

      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 文件夹:/wlserver/server/lib。例如:cd /u01/app/oracle/middleware/wlserver/server/libcd /User/u01/Oracle/Middleware/Oracle_Home/wlserver/server/lib

        • DemoTrust.jks 文件替换为此步骤中生成的文件。

        • 复制 DemoTrust.jks 文件后,必须更改部署文件的目录。创建类时,请更改这两个项目的 /src/soakafka/KafkaExample.java 文件(SOAKafkaProducerprjSOAKafkaConsumerprj),如下所示:

          change-truststore-soa-1.png

  10. 测试应用程序。

    • 上载测试环境后,您的实例将位于:http://localhost:7101/em.

    • 记住您的用户名和密码。

    • SOA 菜单项和部署的组件选项下转至您的应用程序。

      soa-test-5.png

    • 根据实施情况填写服务所需的消息参数。此参数称为“msg”,根据前面的步骤,消息格式为 JSON。

      soa-test-producer-1a.png

    • 以 JSON 格式输入消息后,单击“测试 Web 服务”以在消息队列上运行生成器服务。

      soa-test-producer-2.png

任务 3:在 Oracle Cloud 上创建 SOA Suite 实例

要部署应用程序,必须具有 Oracle SOA Suite 的活动实例。要在此教程中使用的实例将是市场上提供的映像,并且将具有堡垒为 SOA Suite 结构来保护服务器。

  1. 为此,我们来创建一个实例。在 Oracle Cloud 控制台中,单击主菜单(在屏幕的左上角)、选项“Marketplace”和“所有应用程序”,如下所示:

    市场 -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 隧道(稍后介绍)可以通过 Internet 访问 SOA Suite 服务器。

    实例 -soa-suite-compute.png

  6. 要在堡垒服务器与 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
    
    

    通过堡垒建立连接后,可以使用 http://localhost:7002/em. 访问 Weblogic Enterprise Manager

任务 4:使用 Oracle Visual Builder Studio 自动执行部署

现在,让我们自动将 SOA 实施部署到上一步中创建的 Weblogic 服务器。为此,您需要一个 Oracle Visual Builder Studio 实例。Oracle Visual Builder Studio 按项目工作,因此您可以创建项目并包括将参与其执行的用户。

您可以在本文档结尾的“相关链接”部分中找到有关该操作的更多信息,请使用 Visual Builder Studio 搜索部署。接下来,按照步骤配置 SOA Suite 实施的自动构建和部署到 Weblogic 服务器。

  1. 在 ORACLE SOA Suite 中为 BUILD 配置虚拟机。在开始设置之前,您需要配置满足编译 Oracle SOA Suite 项目需求的虚拟机,为此,您需要选择要安装在此 VM 中的正确工具。

    1. 单击左侧菜单上的 Organization(组织),然后单击 Virtual Machine Templates(虚拟机模板)

      vbst-create-template.png

    2. 单击创建模板可配置哪些工具可用于构建 SOA Suite 项目。然后键入模板的名称,如果需要,可以根据需要描述此模板。不要忘记选择此 VM 将启用哪个平台。选择 Oracle Linux 选项(在此文档的日期之前,我们有 Oracle Linux 7 ,但您可以选择另一个较新的选项。

      vbst-create-template-2.png

    3. 选择用于构建项目的所有重要组件。按如下所示选择所有选项。

      vbst-config-sw.png

      vbst-config-details.png

      您的 TEMPLATE 已创建,一旦项目要求构建,您的 VM 将立即实例化。

    4. Oracle Visual Builder Studio 中项目的构建配置。首先,在 Oracle Visual Builder Studio 中打开项目,在下面的示例中,单击 CRISTIANO HOSHIKAWA PROJ

      主可视建筑器 -studio.png

      • 您将看到您的项目页面以及带有可用选项的左侧菜单,并在源代码存储库和属于此项目(项目用户)的团队的右侧看到您的项目。

        Visual-builder-studio-project.png

    5. 单击左侧菜单上的“BUILD(构建)”选项可查看所有现有设置,然后让我们为您的项目配置一个新的“BUILD(构建)”。单击创建作业

      Visual-builder-studio-create-job.png

    6. 输入作业的名称并同时选择 VM 模板(在上一个会话中创建)。

      vbst-create-job-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(参数)”选项卡。您必须使用右侧的组合框菜单“添加参数”创建 3 个参数。下面是必须创建的名称以及括号中的类型:

      • WEBLOGICUSER:Weblogic 用户(字符串类型)

      • WEBLOGICPWD:您的 Weblogic 用户密码(类型密钥/密码)

      • WEBLOGICURL:您的 Weblogic 实例的 URL(字符串类型)

      • 一个重要的观察是,WEBLOGICURL 中的 URL 必须是 localhost,因为隧道将通过堡垒服务器建立

        vbst-parameters.png

    3. 现在单击“Before Build(构建前)”选项卡,配置从堡垒服务器到 Weblogic SOA Suite 服务器的 SSH 隧道。请记住,使用 SSH 密钥(私有密钥)并填写相应的字段。填写隧道组件的数据。

      • 用户名:opc

      • 本地端口: 11002

      • 远程主机:SOA Suite 实例的专用 IP

      • 远程端口: 11002

      • SSH 服务器:堡垒的公共 IP

      • 一个重要的观察点是,端口 11002 以前已配置为部署 SOA Suite 项目的访问端口。

        vbst-tunnel.png

    4. 单击“Steps(步骤)”选项卡,配置 SOA Suite 项目的 BUILD(通过 Maven)和 DEPLOYMENT(通过 ANT)。按如下方式填写:

      • 马夫
      • 目标:编译包

      • POM 文件:SOAKafkaProducerApp/SOAKafkaConsumerPrj/SOA/SCA-INF/pom.xml。这是用于汇编项目包的 Maven pom.xml 文件

      • ANT

        • 目标:sca-package 部署

        • 构建文件:SOAKafkaProducerApp/SOAKafkaConsumerPrj/build.xml。这是用于在构建后部署应用程序的 Ant build.xml 文件。

      • 属性

        • WEBLOGICUSER=${WEBLOGICUSER}

        • WEBLOGICPWD=${WEBLOGICPWD}

        • WEBLOGICURL=${WEBLOGICURL}

      重要提示

      • SOAKafkaProducerApp 应用程序有 2 个项目:SOAKafkaProducerPrj 和 SOAKafkaConsumerPrj。

      • 我们正在说明其中一个项目的配置。必须为其他项目执行相同的步骤。

      vbst-config-step.png

    5. 现在,让我们完成 BUILD 配置。选择“After Build(构建后)”选项卡。此步骤是可选的,但是您可能需要生成由上一步在运行 Maven 时创建的构件。为此,请配置此步骤,以便生成构件供以后下载。

      vbst-after-build.png

  3. 在 Oracle Visual Builder Studio 中执行构建。配置后,每次在代码资料档案库 (Visual Builder Studio git) 中进行提交时,都会自动启动 BUILD。您也可以手动运行“构建”,因为这只需单击“构建”选项即可。尝试运行 BUILD,您将能够检查生成的日志。

    vbst-log-1.png

    vbst-logs-3.png

    vbst-logs-2.png

确认

更多学习资源

探索 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 频道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心