OracleDB-23c-Beta融合数据库使用演示
OracleDB 23c Beta融合数据库使用演示
OracleDB是一种融合数据库,支持关系数据、JSON文档、地理空间数据等。本文档用来演示如何利用OracleDB(23c Beta)快速开发微服务。
这是一个点餐系统应用,使用Nginx提供静态Web界面,使用ORDS将数据库表的CRUD 和 存储过程 暴露为HTTP接口,另外还演示了如何利用ORDS快速开发下单微服务。架构如下:

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