云架构


OracleDB-23c-Beta融合数据库使用演示

OracleDB 23c Beta融合数据库使用演示

OracleDB是一种融合数据库,支持关系数据、JSON文档、地理空间数据等。本文档用来演示如何利用OracleDB(23c Beta)快速开发微服务。

这是一个点餐系统应用,使用Nginx提供静态Web界面,使用ORDS将数据库表的CRUD 和 存储过程 暴露为HTTP接口,另外还演示了如何利用ORDS快速开发下单微服务。架构如下:

![ConveragedDB Demo](../OracleDB-23c-Beta融合数据库使用演示.assets/ConveragedDB Demo.png)

1. 准备工作

卸载OpenJDK,安装GraalVM

rpm -qa|grep java

rpm -e --nodeps tzdata-java-2022f-1.el8.noar
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.352.b08-2.el8_7.x86_64

安装Docker Registry

docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest

安装merticskubectl top

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml 

docker pull registry.aliyuncs.com/google_containers/metrics-server:v0.6.2
docker tag registry.aliyuncs.com/google_containers/metrics-server:v0.6.2 k8s.gcr.io/metrics-server/metrics-server:v0.6.2
#国内网络修改
#sed -i 's/k8s.gcr.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml

修改数据库监听地址

vi /u01/app/oracle/product/23.0.0/dbhome_1/network/admin/listener.ora

#把TCP协议监听改成0.0.0.0
mkdir grabdish
cd grabdish
git clone -b 22.9.1 --single-branch https://github.com/oracle/microservices-datadriven.git

环境变量

export JAVA_HOME=/home/oracle/tools/java/graalvm-ce-java17-22.3.0
export GRAALVM_HOME=/home/oracle/tools/java/graalvm-ce-java17-22.3.0
export JAVA_HOME=$GRAALVM_HOME
export PATH=$GRAALVM_HOME/bin:/home/oracle/tools/maven/apache-maven-3.8.6/bin:/home/oracle/ords/22.3/bin:$PATH
export ORDS_CONFIG=/home/oracle/ords/config
export DOCKER_REGISTRY=localhost
export DOCKER_REGISTRY=localhost


export CONFIG_HOME=/home/oracle/grabdish/microservices-datadriven/grabdish/config/db/
export SCRIPT_HOME=$CONFIG_HOME/1db/apply
export COMMON_SCRIPT_HOME=/home/oracle/grabdish/microservices-datadriven/grabdish/config/db/common/apply

export DB_DEPLOYMENT=1DB


export DB_PASSWORD=oracle


export QUEUE_TYPE=teq
export QUEUE_MESSAGE_TYPE='sys.aq$_jms_text_message'

export DB1_ALIAS='127.0.0.1:1521/PDB1'
export DB1_ADMIN_USER=pdbadmin
export DB1_ADMIN_PASSWORD="oracle"

export AQ_USER=AQ
export AQ_PASSWORD="$DB_PASSWORD"

export ORDER_DB_ALIAS='127.0.0.1:1521/PDB1'
export ORDER_DB_TNS_ADMIN=pdbadmin
export ORDER_USER=ORDERUSER
export ORDER_PASSWORD="$DB_PASSWORD"

export INVENTORY_DB_ALIAS='127.0.0.1:1521/PDB1'
export INVENTORY_DB_NAME=PDB1
export INVENTORY_USER=INVENTORYUSER
export INVENTORY_PASSWORD="$DB_PASSWORD"
export INVENTORY_DB_TNS_ADMIN=admin

export ORDER_QUEUE=ORDERQUEUE
export INVENTORY_QUEUE=INVENTORYQUEUE

export INVENTORY_SERVICE_NAME='INVENTORY_SERVICE'
export ORDER_SERVICE_NAME='ORDER_SERVICE'

#export APEX_VERSION='21.1.7'

echo connect $DB1_ADMIN_USER/"$DB1_ADMIN_PASSWORD"@$DB1_ALIAS

2. 安装数据库对象

Step 1. 进入OracleDB
mkdir -p /home/oracle/23c/tablespaces/
sqlplus sys/oracle@127.0.0.1:1521/PDB1 as sysdba
CREATE TABLESPACE tbs_pdbadmin DATAFILE '/home/oracle/23c/tablespaces/tbs_pdbadmin.dbf' SIZE 500M AUTOEXTEND ON NEXT 10M;
CREATE TEMPORARY TABLESPACE tms_pdbadmin TEMPFILE '/home/oracle/23c/tablespaces/tms_pdbadmin.dbf' SIZE 500M AUTOEXTEND ON NEXT 10M;
CREATE USER pdbadmin IDENTIFIED BY oracle DEFAULT TABLESPACE tbs_pdbadmin TEMPORARY TABLESPACE tms_pdbadmin;
grant dba to pdbadmin;
Step 2. 安装数据库

用脚本安装

@01-db1-admin-create-schemas.sql
...

直接安装

connect pdbadmin/oracle@127.0.0.1:1521/PDB1

WHENEVER SQLERROR CONTINUE
DROP USER AQ CASCADE;
DROP USER ORDERUSER CASCADE;
DROP USER INVENTORYUSER CASCADE;

WHENEVER SQLERROR EXIT 1
-- AQ User
CREATE USER AQ IDENTIFIED BY oracle;
GRANT unlimited tablespace to AQ;
GRANT connect, resource TO AQ;
GRANT aq_user_role TO AQ;
GRANT EXECUTE ON sys.dbms_aqadm TO AQ;
GRANT EXECUTE ON sys.dbms_aq TO AQ;


-- Order User
CREATE USER INVENTORYUSER IDENTIFIED BY oracle;
GRANT unlimited tablespace to INVENTORYUSER;
GRANT connect, resource TO INVENTORYUSER;
GRANT aq_user_role TO INVENTORYUSER;
GRANT EXECUTE ON sys.dbms_aq TO INVENTORYUSER;
-- For inventory-springboot deployment
GRANT aq_administrator_role TO INVENTORYUSER;
GRANT EXECUTE ON sys.dbms_aqadm TO INVENTORYUSER;
-- For inventory-plsql deployment
GRANT CREATE JOB to INVENTORYUSER; 
GRANT EXECUTE ON sys.DBMS_SCHEDULER TO INVENTORYUSER;
--This is all we want but table hasn't been created yet... GRANT select on AQ.inventoryqueuetable to INVENTORYUSER;
GRANT SELECT ANY TABLE TO INVENTORYUSER;
GRANT select on gv$session to INVENTORYUSER;
GRANT select on v$diag_alert_ext to INVENTORYUSER;
GRANT select on DBA_QUEUE_SCHEDULES to INVENTORYUSER;

CREATE USER ORDERUSER IDENTIFIED BY oracle;
GRANT unlimited tablespace to ORDERUSER;
GRANT connect, resource TO ORDERUSER;
GRANT aq_user_role TO ORDERUSER;
GRANT EXECUTE ON sys.dbms_aq TO ORDERUSER;
GRANT SODA_APP to ORDERUSER;
--This is all we want but table hasn't been created yet... GRANT select on AQ.orderqueuetable to ORDERUSER;
GRANT SELECT ANY TABLE TO ORDERUSER;
GRANT select on "gv$session" to ORDERUSER;
GRANT select on v$diag_alert_ext to ORDERUSER;
GRANT select on DBA_QUEUE_SCHEDULES to ORDERUSER;


WHENEVER SQLERROR EXIT 1
connect AQ/oracle@127.0.0.1:1521/PDB1

BEGIN
   DBMS_AQADM.CREATE_SHARDED_QUEUE (
      queue_name          => 'ORDERQUEUE',
      queue_payload_type   => DBMS_AQADM.JMS_TYPE,
      multiple_consumers   => true);

   DBMS_AQADM.CREATE_SHARDED_QUEUE (
      queue_name          => 'INVENTORYQUEUE',
      queue_payload_type   => DBMS_AQADM.JMS_TYPE,
      multiple_consumers   => true);

   DBMS_AQADM.START_QUEUE (
      queue_name          => 'ORDERQUEUE');

   DBMS_AQADM.START_QUEUE (
      queue_name          => 'INVENTORYQUEUE');

END;
/


BEGIN
   DBMS_AQADM.grant_queue_privilege (
      privilege     =>     'ENQUEUE',
      queue_name    =>     'ORDERQUEUE',
      grantee       =>     'ORDERUSER',
      grant_option  =>      FALSE);

   DBMS_AQADM.grant_queue_privilege (
      privilege     =>     'DEQUEUE',
      queue_name    =>     'ORDERQUEUE',
      grantee       =>     'INVENTORYUSER',
      grant_option  =>      FALSE);

   DBMS_AQADM.grant_queue_privilege (
      privilege     =>     'ENQUEUE',
      queue_name    =>     'INVENTORYQUEUE',
      grantee       =>     'INVENTORYUSER',
      grant_option  =>      FALSE);

   DBMS_AQADM.grant_queue_privilege (
      privilege     =>     'DEQUEUE',
      queue_name    =>     'INVENTORYQUEUE',
      grantee       =>     'ORDERUSER',
      grant_option  =>      FALSE);

   DBMS_AQADM.add_subscriber(
      queue_name=>'ORDERQUEUE',
      subscriber=>sys.aq$_agent('inventory_service',NULL,NULL));

   DBMS_AQADM.add_subscriber(
      queue_name=>'INVENTORYQUEUE',
      subscriber=>sys.aq$_agent('order_service',NULL,NULL));
END;
/


WHENEVER SQLERROR EXIT 1
connect INVENTORYUSER/oracle@127.0.0.1:1521/PDB1


create table inventory (
  inventoryid varchar(16) PRIMARY KEY NOT NULL,
  inventorylocation varchar(32),
  inventorycount integer CONSTRAINT positive_inventory CHECK (inventorycount >= 0) );

insert into inventory values ('sushi', '1468 WEBSTER ST,San Francisco,CA', 0);
insert into inventory values ('pizza', '1469 WEBSTER ST,San Francisco,CA', 0);
insert into inventory values ('burger', '1470 WEBSTER ST,San Francisco,CA', 0);
commit;

set echo on

--CREATE OR REPLACE PROCEDURE dequeueOrderMessage(p_action OUT varchar2, p_orderid OUT integer)
CREATE OR REPLACE PROCEDURE dequeueOrderMessage(p_orderInfo OUT varchar2)
IS

  dequeue_options       dbms_aq.dequeue_options_t;
  message_properties    dbms_aq.message_properties_t;
  message_handle        RAW(16);
  message               SYS.AQ$_JMS_TEXT_MESSAGE;
  no_messages           EXCEPTION;
  pragma                exception_init(no_messages, -25228);
          
BEGIN
--  dequeue_options.wait := dbms_aq.NO_WAIT;
   dequeue_options.wait := dbms_aq.FOREVER;
   dequeue_options.consumer_name := 'inventory_service';
   dequeue_options.navigation    := DBMS_AQ.FIRST_MESSAGE;
  
  -- dequeue_options.navigation := dbms_aq.FIRST_MESSAGE;
  -- dequeue_options.dequeue_mode := dbms_aq.LOCKED;

  DBMS_AQ.DEQUEUE(
    queue_name => 'AQ.ORDERQUEUE',
    dequeue_options => dequeue_options,
    message_properties => message_properties,
    payload => message,
    msgid => message_handle);
    -- COMMIT;

--  p_action := message.get_string_property('action');
--  p_orderid := message.get_int_property('orderid');
    p_orderInfo := message.text_vc;
--  message.get_text(p_orderInfo);

  EXCEPTION
    WHEN no_messages THEN
    BEGIN
      p_orderInfo := '';
    END;
    WHEN OTHERS THEN
     RAISE;
END;
/
show errors


CREATE OR REPLACE PROCEDURE checkInventoryReturnLocation(p_inventoryId IN VARCHAR2, p_inventorylocation OUT varchar2)
IS

BEGIN
  update INVENTORYUSER.INVENTORY set inventorycount = inventorycount - 1 where inventoryid = p_inventoryId and inventorycount > 0 returning inventorylocation into p_inventorylocation;
  dbms_output.put_line('p_inventorylocation');
  dbms_output.put_line(p_inventorylocation);
END;
/
show errors



-- CREATE OR REPLACE PROCEDURE enqueueInventoryMessage(p_action IN VARCHAR2, p_orderid IN NUMBER)
CREATE OR REPLACE PROCEDURE enqueueInventoryMessage(p_inventoryInfo IN VARCHAR2)
IS
   enqueue_options     DBMS_AQ.enqueue_options_t;
   message_properties  DBMS_AQ.message_properties_t;
   message_handle      RAW(16);
   message             SYS.AQ$_JMS_TEXT_MESSAGE;

BEGIN

  message := SYS.AQ$_JMS_TEXT_MESSAGE.construct;
  -- message.text_vc := p_inventoryInfo;
  message.set_text(p_inventoryInfo);
  -- message.set_string_property('action', p_action);
  -- message.set_int_property('orderid', p_orderid);

  DBMS_AQ.ENQUEUE(queue_name => 'AQ.INVENTORYQUEUE',
           enqueue_options    => enqueue_options,
           message_properties => message_properties,
           payload            => message,
           msgid              => message_handle);

END;
/
show errors


CREATE OR REPLACE PROCEDURE dequeue_order_message(in_wait_option in BINARY_INTEGER, out_order_message OUT varchar2)
IS
  dequeue_options       dbms_aq.dequeue_options_t;
  message_properties    dbms_aq.message_properties_t;
  message_handle        RAW(16);
  message               SYS.AQ$_JMS_TEXT_MESSAGE;
  no_messages           EXCEPTION;
  pragma                exception_init(no_messages, -25228); 
BEGIN
  CASE in_wait_option
  WHEN 0 THEN
    dequeue_options.wait := dbms_aq.NO_WAIT;
  WHEN -1 THEN
    dequeue_options.wait := dbms_aq.FOREVER;
  ELSE
    dequeue_options.wait := in_wait_option;
  END CASE;

  dequeue_options.consumer_name := '$INVENTORY_SERVICE_NAME';
  dequeue_options.navigation    := dbms_aq.FIRST_MESSAGE;  -- Required for TEQ

  DBMS_AQ.DEQUEUE(
    queue_name         => 'AQ.ORDERQUEUE',
    dequeue_options    => dequeue_options,
    message_properties => message_properties,
    payload            => message,
    msgid              => message_handle);

  out_order_message := message.text_vc;

  EXCEPTION
    WHEN no_messages THEN
      out_order_message := '';
    WHEN OTHERS THEN
      RAISE;
END;
/
show errors

CREATE OR REPLACE PROCEDURE enqueue_inventory_message(in_inventory_message IN VARCHAR2)
IS
   enqueue_options     dbms_aq.enqueue_options_t;
   message_properties  dbms_aq.message_properties_t;
   message_handle      RAW(16);
   message             SYS.AQ$_JMS_TEXT_MESSAGE;
BEGIN
  message := SYS.AQ$_JMS_TEXT_MESSAGE.construct;
  message.set_text(in_inventory_message);

  dbms_aq.ENQUEUE(queue_name => 'AQ.INVENTORYQUEUE',
    enqueue_options    => enqueue_options,
    message_properties => message_properties,
    payload            => message,
    msgid              => message_handle);
END;
/
show errors

CREATE OR REPLACE PROCEDURE check_inventory(in_inventory_id IN VARCHAR2, out_inventory_location OUT varchar2)
IS
BEGIN
  update INVENTORYUSER.INVENTORY set inventorycount = inventorycount - 1 
    where inventoryid = in_inventory_id and inventorycount > 0 
    returning inventorylocation into out_inventory_location;
  if sql%rowcount = 0 then
    out_inventory_location := 'inventorydoesnotexist';
  end if;
END;
/
show errors

CREATE OR REPLACE PROCEDURE inventory_service
IS
  order_message VARCHAR2(32767);
  order_inv_id VARCHAR2(16);
  order_inv_loc VARCHAR2(32);
  order_json JSON_OBJECT_T;
  inventory_json JSON_OBJECT_T;
BEGIN
  LOOP
    -- Wait for and dequeue the next order message
    dequeue_order_message(
      in_wait_option    => -1,  -- Wait forever
      out_order_message => order_message);

    -- Parse the order message
    order_json := JSON_OBJECT_T.parse(order_message);
    order_inv_id := order_json.get_string('itemid');

    -- Check the inventory
    check_inventory(
      in_inventory_id        => order_inv_id,
      out_inventory_location => order_inv_loc);
      
    -- Construct the inventory message
    inventory_json := new JSON_OBJECT_T;
    inventory_json.put('orderid',           order_json.get_string('orderid'));
    inventory_json.put('itemid',            order_inv_id);
    inventory_json.put('inventorylocation', order_inv_loc);
    inventory_json.put('suggestiveSale',    'beer');

    -- Send the inventory message
    enqueue_inventory_message(
      in_inventory_message   => inventory_json.to_string() );

    -- commit
    commit;
  END LOOP;
END;
/
show errors

WHENEVER SQLERROR EXIT 1
connect ORDERUSER/oracle@127.0.0.1:1521/PDB1



-- Place Order using MLE JavaScript
CREATE OR REPLACE PROCEDURE place_order_js (
  orderid           IN varchar2,
  itemid            IN varchar2,
  deliverylocation  IN varchar2)
AUTHID CURRENT_USER
IS
   ctx DBMS_MLE.context_handle_t := DBMS_MLE.create_context();
   order VARCHAR2(4000);
   js_code clob := q'~
    var oracledb = require("mle-js-oracledb");
    var bindings = require("mle-js-bindings");
    conn = oracledb.defaultConnection();

    // Construct the order object
    const order = {
      orderid: bindings.importValue("orderid"),
      itemid: bindings.importValue("itemid"),
      deliverylocation: bindings.importValue("deliverylocation"),
      status: "Pending",
      inventoryLocation: "",
      suggestiveSale: ""
    }
    
    // Insert the order object
    insert_order(conn, order);

    // Send the order message
    enqueue_order_message(conn, order);

    // Commit
    conn.commit;

    // Output order
    bindings.exportValue("order", order.stringify());

    function insert_order(conn, order) {
        conn.execute( "BEGIN insert_order(:1, :2); END;", [order.orderid, order.stringify()]);
    }

    function enqueue_order_message(conn, order) {
        conn.execute( "BEGIN enqueue_order_message(:1); END;", [order.stringify()]);
    }
   ~';
BEGIN
   -- Pass variables to JavaScript
   dbms_mle.export_to_mle(ctx, 'orderid', orderid); 
   dbms_mle.export_to_mle(ctx, 'itemid', itemid); 
   dbms_mle.export_to_mle(ctx, 'deliverylocation', deliverylocation); 

   -- Execute JavaScript
   DBMS_MLE.eval(ctx, 'JAVASCRIPT', js_code);
   DBMS_MLE.import_from_mle(ctx, 'order', order);
   DBMS_MLE.drop_context(ctx);

   HTP.print(order);

EXCEPTION
   WHEN others THEN
     dbms_mle.drop_context(ctx);
     HTP.print(SQLERRM);

END;
/
show errors



-- Enqueue order message
CREATE OR REPLACE PROCEDURE enqueue_order_message(in_order_message IN VARCHAR2)
AUTHID CURRENT_USER
IS
   enqueue_options     dbms_aq.enqueue_options_t;
   message_properties  dbms_aq.message_properties_t;
   message_handle      RAW(16);
   message             SYS.AQ$_JMS_TEXT_MESSAGE;
BEGIN
  message := SYS.AQ$_JMS_TEXT_MESSAGE.construct;
  message.set_text(in_order_message);

  dbms_aq.ENQUEUE(queue_name => 'AQ.ORDERQUEUE',
    enqueue_options    => enqueue_options,
    message_properties => message_properties,
    payload            => message,
    msgid              => message_handle);
END;
/
show errors


-- Insert order
CREATE OR REPLACE PROCEDURE insert_order(in_order_id IN VARCHAR2, in_order IN VARCHAR2)
AUTHID CURRENT_USER
IS
  order_doc             SODA_DOCUMENT_T;
  collection            SODA_COLLECTION_T;
  status                NUMBER;
  collection_name       CONSTANT VARCHAR2(20) := 'orderscollection';
  collection_metadata   CONSTANT VARCHAR2(4000) := '{"keyColumn" : {"assignmentMethod": "CLIENT"}}';
BEGIN
  -- Write the order object
  collection := DBMS_SODA.open_collection(collection_name);
  IF collection IS NULL THEN
    collection := DBMS_SODA.create_collection(collection_name, collection_metadata);
  END IF;

  order_doc := SODA_DOCUMENT_T(in_order_id, b_content => utl_raw.cast_to_raw(in_order));
  status := collection.insert_one(order_doc);
END;
/
show errors



-- place order microserice (GET)
-- Example: ../ords/orderuser/placeorder/order?orderId=66&orderItem=sushi&deliverTo=Redwood
CREATE OR REPLACE PROCEDURE place_order (
  orderid           IN varchar2,
  itemid            IN varchar2,
  deliverylocation  IN varchar2)
AUTHID CURRENT_USER
IS
  order_json            JSON_OBJECT_T;
BEGIN
  -- Construct the order object
  order_json := new JSON_OBJECT_T;
  order_json.put('orderid', orderid);
  order_json.put('itemid',  itemid);
  order_json.put('deliverylocation', deliverylocation);
  order_json.put('status', 'Pending');
  order_json.put('inventoryLocation', '');
  order_json.put('suggestiveSale', '');

  -- Insert the order object
  insert_order(orderid, order_json.to_string());

  -- Send the order message
  enqueue_order_message(order_json.to_string());

  -- Commit
  commit;

  HTP.print(order_json.to_string());

  EXCEPTION
    WHEN OTHERS THEN
      HTP.print(SQLERRM);

END;
/
show errors





-- frontend place order (POST)
CREATE OR REPLACE PROCEDURE frontend_place_order (
  serviceName IN varchar2,
  commandName IN varchar2,
  orderId     IN varchar2,
  orderItem   IN varchar2,
  deliverTo   IN varchar2)
AUTHID CURRENT_USER
IS
BEGIN
  place_order(
    orderid => orderId,
    itemid  => orderItem,
    deliverylocation => deliverTo);
END;
/
show errors

修改配置

vi src/main/resources/META-INF/microprofile-config.properties

oracle.ucp.jdbc.PoolDataSource.orderpdb.URL = jdbc:oracle:thin:orderuser/oracle@192.168.56.23:1521/PDB1
oracle.ucp.jdbc.PoolDataSource.orderpdb.user = orderuser
oracle.ucp.jdbc.PoolDataSource.orderpdb.password = oracle


vi pom.xml 
imagePullPolicy: IfNotPresent
secret.value: oracle

测试

export queueowner=AQ
export orderqueuename=ORDERQUEUE
export inventoryqueuename=inventoryqueue
export SECRETS_PASSWORD=oracle

~/tools/java/graalvm-ce-java17-22.3.0/bin/java -jar  target/frontend-helidon.jar -classpath target/libs/*.jar

~/tools/java/graalvm-ce-java17-22.3.0/bin/java -jar  target/order-helidon.jar -classpath target/libs/*.jar

~/tools/java/graalvm-ce-java17-22.3.0/bin/java -jar  target/inventory-helidon.jar -classpath target/libs/*.jar



istioctl kube-inject -f frontend-helidon-deployment.yaml | kubectl apply -f -
istioctl kube-inject -f frontend-service.yaml | kubectl apply -f -

istioctl kube-inject -f inventory-helidon-deployment.yaml | kubectl apply -f -
istioctl kube-inject -f order-helidon-deployment.yaml | kubectl apply -f -



kubectl create ns msdataworkshop

istioctl kube-inject -f frontend-helidon/frontend-helidon-deployment.yaml | kubectl apply -n msdataworkshop -f -
kubectl apply -n msdataworkshop -f frontend-helidon/frontend-service-nodeport.yaml
kubectl apply -n msdataworkshop -f frontend-istio-gw.yaml

istioctl kube-inject-f inventory-helidon/inventory-helidon-deployment.yaml | kubectl apply -n msdataworkshop -f -
kubectl apply -n msdataworkshop -f inventory-helidon/inventory-service.yaml

istioctl kube-inject -f order-helidon/order-helidon-deployment.yaml | kubectl apply -n msdataworkshop -f -
kubectl apply -n msdataworkshop -f order-helidon/order-service.yaml

istioctl kube-inject -f supplier-helidon-se/supplier-helidon-se-deployment.yaml | kubectl apply -n msdataworkshop -f -
kubectl apply -n msdataworkshop -f supplier-helidon-se/supplier-helidon-se-service.yaml

istioctl kube-inject -f ords/ords-deployment.yaml | kubectl apply -n msdataworkshop -f -
kubectl apply -n msdataworkshop -f ords/ords-service.yaml

kubectl get pod -n msdataworkshop
kubectl get svc -n msdataworkshop


kubectl delete -f frontend-helidon/frontend-helidon-deployment.yaml  -n msdataworkshop
kubectl delete -f frontend-helidon/frontend-service-nodeport.yaml  -n msdataworkshop
kubectl delete -f inventory-helidon/inventory-helidon-deployment.yaml  -n msdataworkshop
kubectl delete -f inventory-helidon/inventory-service.yaml  -n msdataworkshop
kubectl delete -f order-helidon/order-helidon-deployment.yaml  -n msdataworkshop
kubectl delete -f order-helidon/order-service.yaml  -n msdataworkshop

3. 编译与部署

Step 1. 编译镜像
cd ~/ords
vi dockerfile
FROM container-registry.oracle.com/java/openjdk:17
MAINTAINER  Wilbur(wenbin.chen@oracle.com)

RUN mkdir -p /home/oracle/ords/
COPY ./22.3/ /home/oracle/ords/22.3/
COPY ./config/ /home/oracle/ords/config/
RUN ls -la /home/oracle/ords/*

#ENV PATH=/home/oracle/oracle/22.3/ords/bin:$PATH
ENV ORDS_CONFIG=/home/oracle/ords/config

EXPOSE 8080

WORKDIR /home/oracle/ords/
ENTRYPOINT ["/home/oracle/ords/22.3/bin/ords","serve"]
 docker build -t ords-service .
 docker build -t pyorder .
Step 2. 部署
cd ~/ords
vi ords-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ords
spec:
  selector:
    matchLabels:
      app: ords
  replicas: 1
  template:
    metadata:
      labels:
        app: ords
    spec:
      containers:
      - name: ords
        image: ords
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "1Gi"
            cpu: "1"
          limits:
            memory: "2Gi"
            cpu: "1"
kubectl -n msdataworkshop delete -f ords-deployment.yaml 
kubectl -n msdataworkshop apply -f ords-deployment.yaml
kubectl -n msdataworkshop get pods

kubectl -n msdataworkshop logs `kubectl -n msdataworkshop get pods |grep ords|awk '{print $1}'`
cd ~/ords
vi ords-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: ords
  labels:
    app: ords
spec:
  type: ClusterIP
  ports:
  - port: 8080
    name: ords
    targetPort: 8080
  selector:
    app: ords
kubectl -n msdataworkshop delete -f ords-service.yaml 
kubectl -n msdataworkshop apply -f ords-service.yaml
kubectl -n msdataworkshop get svc

kubectl -n msdataworkshop logs `kubectl -n msdataworkshop get pods |grep ords|awk '{print $1}'`
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: grabdish-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grabdish
spec:
  hosts:
  - "*"
  gateways:
  - grabdish-gateway
  http:
  - route:
    - destination:
        host: frontend
        port:
          number: 8080 
sqlplus inventoryuser/oracle@192.168.56.23:1521/PDB1
exec ords.enable_schema(true)
quit

sqlplus orderuser/oracle@192.168.56.23:1521/PDB1
exec ords.enable_schema(true)
quit

sqlplus supplieruser/oracle@192.168.56.23:1521/PDB1
exec ords.enable_schema(true)
quit

接口:

# Place Order
curl -v -X POST ^
-H "Content-Type: application/json" "http://localhost:31588/ords/orderuser/place_order/" ^
-d "{\"orderid\":\"<VALUE>\",\"itemid\":\"<VALUE>\",\"deliverylocation\":\"<VALUE>\"}"

# Delete Order
curl -v -X DELETE  ^
"http://localhost:31588/ords/orderuser/order/<VALUE>" 

# Delete All 
curl -v -X POST ^
-H "Content-Type: application/json" "http://localhost:31588/ords/orderuser/delete_all_order/" ^
-d "{\"testabc\":\"<VALUE>\"}"


# Update Order 
curl -v -X PUT ^
-H "Content-Type: application/json" "http://localhost:31588/ords/orderuser/order/<VALUE>" ^
-d "{\"content_type\":\"<VALUE>\",\"created_on\":\"<VALUE>\",\"last_modified\":\"<VALUE>\",\"version\":\"<VALUE>\",\"json_document\":\"<VALUE>\"}"

# QueryOrder
curl --location ^
"http://localhost:31588/ords/orderuser/order/" 
curl --location ^
"http://localhost:31588/ords/orderuser/order/<VALUE>" 




# Get Inventory
curl --location ^
"http://localhost:31588/ords/inventoryuser/inventory/<VALUE>" 

# Get Inventory Count
curl -v -X POST ^
-H "Content-Type: application/json" "http://localhost:31588/ords/inventoryuser/get_inventory_count/" ^
-d "{\"itemid\":\"<VALUE>\"}"

# add Inventory
curl -v -X POST ^
-H "Content-Type: application/json" "http://localhost:31588/ords/inventoryuser/add_inventory/" ^
-d "{\"in_inventory_id\":\"<VALUE>\"}"

# remove Inventory
curl -v -X POST ^
-H "Content-Type: application/json" "http://localhost:31588/ords/inventoryuser/check_inventory/" ^
-d "{\"in_inventory_id\":\"<VALUE>\"}"
git pull
15220196630
Oracle@123

mvn package
 docker build .
kubectl -n msdataworkshop delete pod `kubectl -n msdataworkshop get pods |grep front|awk '{print $1}'`
kubectl -n msdataworkshop get pod