带有Oracle Digital Assistant和Fn Project的会话式UI。 第三部分,迁移到云

在本文中,我将继续讲述在Oracle Digital AssistantOracle Digital Assistant的 基础上为FlexDeploy实现对话式UI的故事。
Fn项目 。 今天,我将围绕聊天机器人工作的无服务器API移到云中,因此整个解决方案都在云中工作:

对话式使用者介面

该API是作为收集到Fn应用程序中的Fn函数集来实现的。 Fn的优点在于,它只是一堆Docker容器,它们可以同样在本地Docker引擎和云中某个位置的笔记本电脑上运行。 话虽如此,我可以从任何云提供商,因为它描述的运行K8S集群上我的FN应用在这里 。 但是今天不是那天。 今天,我将在基于Fn的全新云服务Oracle Functions上运行我的无服务器API。 该服务尚不通用,但是我参与了“有限可用性”计划,因此我可以对其进行试用,可以使用它并在其上发布博客。 在此解决方案中,我必须摆脱这里实现的Fn Flow 并回到我原来的实现,因为Oracle Functions还不支持Fn Flow。 我希望很快,因为这实际上是最好的部分。

因此,配置好我们的OCI环境并启动并运行Oracle Functions服务(我不会在此处重新发布Oracle教程),我们需要配置Fn CLI以便能够与该服务通信:

fn create context oracle_fn --provider oracle 
fn use context oracle_fn
fn update context oracle.compartment-id MY_COMPARTMENT_ID
fn update context api-url https://functions.us-phoenix-1.oraclecloud.com
fn update context registry phx.ocir.io/flexagonoraclecloud/flexagon-repo
fn update context oracle.profile oracle_fn

好的,现在我们的Fn命令行界面正在与Oracle Functions对话。 下一步是在Oracle Functions控制台中创建一个应用程序:

对话式使用者介面

现在我们可以将Fn应用程序部署到Oracle Functions

Eugenes-MacBook-Pro-3:fn fedor$ ls -l
total 8
-rw-r--r--@ 1 fedor  staff   12 Dec  4 15:41 app.yaml
drwxr-xr-x  5 fedor  staff  160 Feb  9 15:24 createsnapshotfn
drwxr-xr-x  6 fedor  staff  192 Feb  9 15:25 receiveFromBotFn
drwxr-xr-x  6 fedor  staff  192 Feb  9 15:25 sendToBotFn
Eugenes-MacBook-Pro-3:fn fedor$ 
Eugenes-MacBook-Pro-3:fn fedor$ 
Eugenes-MacBook-Pro-3:fn fedor$ fn deploy --all

完成后,我们可以在Oracle Functions控制台中观察该应用程序:

对话式使用者介面

下一步是更新聊天机器人和笔记本电脑中的API网址,以便调用云中的功能,而不是先前的本地实现。 可以使用以下命令检索URL:

fn list triggers odaapp

到目前为止,从我的笔记本电脑到Oracle Functions的迁移一直看起来非常简单。 但是这里有点痛苦。 为了使用http请求调用Oracle Functions中托管的函数 ,应该对请求进行签名,以便它们可以通过身份验证。 调用签名函数调用的node.js实现如下所示:

var fs = require('fs');
var https = require('https');
var os = require('os');
var httpSignature = require('http-signature');
var jsSHA = require("jssha");

var tenancyId = "ocid1.tenancy.oc1..aaaaaaaayonz5yhpr4vxqpbdof5rn7x5pfrlgjwjycwxasf4dkexiq";
var authUserId = "ocid1.user.oc1..aaaaaaaava2e3wd3cu6lew2sktd6by5hnz3d7prpgjho4oambterba";
var keyFingerprint = "88:3e:71:bb:a5:ea:68:b7:56:fa:3e:5d:ea:45:60:10";
var privateKeyPath = "/Users/fedor/.oci/functions_open.pem";
var privateKey = fs.readFileSync(privateKeyPath, 'ascii');
var identityDomain = "identity.us-ashburn-1.oraclecloud.com";


function sign(request, options) {
    var apiKeyId = options.tenancyId + "/" + options.userId + "/" + options.keyFingerprint;

    var headersToSign = [
        "host",
        "date",
        "(request-target)"
    ];

    var methodsThatRequireExtraHeaders = ["POST", "PUT"];

    if(methodsThatRequireExtraHeaders.indexOf(request.method.toUpperCase()) !== -1) {
        options.body = options.body || "";
        var shaObj = new jsSHA("SHA-256", "TEXT");
        shaObj.update(options.body);

        request.setHeader("Content-Length", options.body.length);
        request.setHeader("x-content-sha256", shaObj.getHash('B64'));

        headersToSign = headersToSign.concat([
            "content-type",
            "content-length",
            "x-content-sha256"
        ]);
    }


    httpSignature.sign(request, {
        key: options.privateKey,
        keyId: apiKeyId,
        headers: headersToSign
    });

    var newAuthHeaderValue = request.getHeader("Authorization").replace("Signature ", "Signature version=\"1\",");
    request.setHeader("Authorization", newAuthHeaderValue);
}


function handleRequest(callback) {

    return function(response) {
        var responseBody = "";
        response.on('data', function(chunk) {
        responseBody += chunk;
    });


        response.on('end', function() {
            callback(JSON.parse(responseBody));
        });
    }
}


function createSnapshot(release) {

    var body = release;

    var options = {
        host: 'af4qyj7yhva.us-phoenix-1.functions.oci.oraclecloud.com',
        path: '/t/createsnapshotfn',
        method: 'POST',
        headers: {
            "Content-Type": "application/text",
        }
    };


    var request = https.request(options, handleRequest(function(data) {
        console.log(data);
    }));


    sign(request, {
        body: body,
        privateKey: privateKey,
        keyFingerprint: keyFingerprint,
        tenancyId: tenancyId,
        userId: authUserId
    });

    request.end(body);
};

调用Oracle Functions中托管的无服务器API时, Oracle Digital Assistant定制组件和便携式计算机上的侦听器组件应使用此方法。

而已!

翻译自: https://www.javacodegeeks.com/2019/02/conversational-oracle-assistant-fn.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值