開發及建置事件轉送
建立使用區塊鏈事件的 Oracle Functions 應用程式,並將它們轉送至「Oracle 串流服務」。
事件轉送應用程式需要證明資料,才能連線串流服務。證明資料會保留在 Oracle Cloud Infrastructure Vault 中。執行 Terraform 程式碼時,證明資料會儲存在 Vault 中。證明資料會在您執行 OCI 環境的初始組態設定時產生。
函數提供下列服務:
- 從保存庫擷取串流服務證明資料。
- 解密證明資料 (Vault 會儲存加密值)。
- 從 base64 編碼的字串解碼。
- 使用與 Kafka-compatible API 連線至串流服務時,請使用解碼的證明資料。
- 從 JSON 事件訊息建立並填入名為 event 的 Java 物件。
- 使用 Kafka API 傳送事件訊息。
建立事件轉送
您可以使用任何程式設計語言建立轉送,但 Kafka API 是以 Java 記錄的最佳使用 Java。
EventProducer 類別具有下列方法:
@FnConfiguration
public void config(RuntimeContext ctx) { ... }
private String decryptData(String cipherText) { ... }
public String handleRequest(Event event) { ... }
pom.xml
檔案中也需要下列相依性:
<dependencies>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-keymanagement</artifactId>
<version>1.12.5</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>com.fnproject.fn</groupId>
<artifactId>api</artifactId>
<version>${fdk.version}</version>
</dependency>
.
.
.
確定您已安裝 fn CLI 工具。如需詳細資訊,請參閱 https://github.com/fnproject/fn#quickstart。
組建事件轉送
您必須先使用 docker tag
命令,將本機來源影像的複本建立為新影像 (新影像實際上只是現有來源影像的參照),才能發送影像。作為新影像的名稱,指定 Oracle Cloud Infrastructure Registry 中您要植入影像之目標位置的完整路徑。
標記需要以下資訊:
- 您區域的 Docker 登錄端點
- 您的物件儲存命名空間
若要取得區域的端點,請在依區域區分的可用性表格中查詢您的區域。例如,美國東部 (阿什本) 的登錄端點是https://iad.ocir.io
。
尋找您的物件儲存命名空間:
- 在導覽功能表中,按一下管理,然後按一下租用戶詳細資訊。
- 物件儲存體設定值段落中有物件儲存體命名空間
發送事件轉接至登錄
建立事件轉送並有適當的標記之後,就可以將它推送至 Oracle Cloud Infrastructure Registry。
- 您區域的 API 端點:例如
iad.ocir.io
。此值與您之前用來標記 Docker 映像檔的值相同。 - 租用戶命名空間:您租用戶之自動產生的物件儲存命名空間字串 (如「租用戶資訊」頁面所示)。
- 使用者名稱:您在 Oracle Cloud Infrastructure 中的使用者名稱。
- 認證記號:您先前在「計畫」區段中建立的記號。
建立 API 金鑰
產生金鑰組並將公開金鑰上傳至您的 Oracle Cloud Infrastructure 使用者設定檔。
您可以透過幾種方式執行此作業,但此處我們將使用 Cloud Shell,因為您可以直接將產生的金鑰安全地上傳至您的帳戶。
套用 Terraform 組態
從 GitHub 儲存區域下載 Terraform 組態、更新 Terraform 變數檔、然後套用組態。
terraform.tvars
檔案需要此資訊。
- 區域-區域的「區域識別碼」。您可以從 Oracle Cloud Infrastructure 主控台的 URL 擷取此項目。例如,如果 URL 是
https://console.us-ashburn-1.oraclecloud.com/compute/instances
,您的「區域 ID」就會是 us-ashburn-1。如果您的 URL 是https://cloud.oracle.com/compute/instances
,則必須在 https://docs.oracle.com/iaas/Content/General/Concepts/regions.htm 中查詢您的「區域 ID」 - 區間 OCID -包含專案資源之區間的 OCID。如果您遵循「計畫」區段中的指示,則需要 OBP_Events 區間的 OCID。
- 指紋-您先前產生並上傳至設定檔之公用 API 金鑰的指紋。
- 私密金鑰-您先前產生之私密 API 金鑰的完整路徑和檔案名稱。例如,
/home/opc/oci_api_key.pem
。請勿在路徑中使用~
。 - 使用者 OCID -您可以從「使用者詳細資訊」頁面取得。開啟主控台功能表,移至識別,然後按一下使用者。按一下清單中的您的使用者名稱。
- 租用戶 OCID -您可以從「租用戶詳細資訊」頁面取得此資訊。開啟主控台功能表,移至管理,然後按一下租用戶詳細資訊。
有資訊時,請下載並套用 Terraform 組態。
訂閱區塊鏈事件
註冊回呼 URL,讓 API 閘道能夠接收區塊鏈事件。
https://joh5rb...fuxy.apigateway.us-ashburn-1.oci.customer-oci.com/obpevents/callback
。您還需要 API 閘道部署端點,此端點會在 Terraform 處理作業完成時顯示為 use_to_extract_ssl_certificate。它的格式為 joh5rb...fuxy.apigateway.us-ashburn-1。oci.customer-oci.com:443
您也需要 Oracle Blockchain Platform REST API 端點,才能訂閱鏈碼事件。它的形式如下:
https://<rest_server_url:port/restproxy#>/bcsgw/rest/v1/event/subscribe
<<rest_server_url:port/restproxy#>
是 Oracle Blockchain Platform 主控台中所列 REST 代理主機的 URL。在主控台中,開啟「節點」頁面並尋找 REST 代理主機節點。路由資料欄中會列出一個 URL,包括連接埠和 REST 代理主機號碼。
訂閱區塊鏈事件:
建立並測試事件用戶
事件用戶使用 Kafka API 從 Oracle Cloud Infrastructure 串流處理認證和擷取區塊鏈訊息。
若要建立用戶,您需要下列字串的資訊:
- USER-NAME:您的使用者名稱。
- AUTH-TOKEN:這是您先前產生並複製的記號。
- TENANCY-NAME:您可以在 OCI 主控台的「租用戶詳細資訊」頁面中找到這個值。若要開啟「租用戶詳細資訊」頁面,請由主控台導覽功能表中選取管理,然後按一下租用戶詳細資訊。
- STREAM-POOL-OCID:這是執行 Terraform 命令檔時所建立之串流集區的 OCID。若要尋找這個值,請開啟主控台導覽功能表,移至管理,然後按一下串流。選取串流集區,然後在開啟的頁面中複製 OCID。
- 區域:"us-ashburn-1"。您的區域可能不同。
- EVENT-NAME:這與您先前註冊接收區塊鏈事件的回呼 URL 時所使用的事件名稱相同。
使用下列範例來測試並驗證系統是否正常運作。
import java.util.Properties;
import java.util.Arrays;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.ConsumerRecord;
public class Consumer {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.put("bootstrap.servers", "streaming.REGION.oci.oraclecloud.com:9092");
props.put("security.protocol", "SASL_SSL");
props.put("sasl.mechanism", "PLAIN");
props.put("sasl.jaas.config", "org.apache.kafka.common.security.plain.PlainLoginModule required username=\"TENANCY-NAME/USER-NAME/STREAM-POOL-OCID\" password=\"AUTH-TOKEN\";");
props.put("group.id", "group-0");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
// Create a consumer and subscribe to it
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("EVENT-NAME"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s\n",
record.offset(), record.key(), record.value());
}
}
}
當您啟動用戶時,它會使用任何已植入串流中的現有事件。
範例運作並示範解決方案運作之後,您就可以建立一或多個實際環境執行層次用戶應用程式。您可以使用 JavaScript、Python 或其他語言撰寫應用程式。