日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

azure api 管理_具有Azure功能的无服务器API

發(fā)布時(shí)間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 azure api 管理_具有Azure功能的无服务器API 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

azure api 管理

在這篇文章中,我將研究一個(gè)非常簡(jiǎn)單的用例。 在執(zhí)行部署管道時(shí), FlexDeploy可能會(huì)產(chǎn)生一些應(yīng)被批準(zhǔn)或拒絕的人工任務(wù)。 例如,某人必須批準(zhǔn)對(duì)生產(chǎn)環(huán)境的部署。 可以在FlexDeploy UI中或通過某些外部通信渠道來完成。 今天,我將重點(diǎn)介紹通過Slack批準(zhǔn)/拒絕FlexDeploy人工任務(wù)的場(chǎng)景:


我想考慮一些要求和注意事項(xiàng):

  • 我不想教FlexDeploy與Slack通信
  • 我不想向Slack提供FlexDeploy API的詳細(xì)信息
  • 我不想向公眾公開FlexDeploy API
  • 我確實(shí)希望能夠在不接觸FlexDeploy的情況下輕松地將Slack更改為其他內(nèi)容或添加其他通信工具

基本上,我想使FlexDeploy與外部通信機(jī)制的細(xì)節(jié)脫鉤。 因此,我將引入一個(gè)額外的層,即FlexDeploy和Slack之間的API 。 看起來無服務(wù)器范例是實(shí)現(xiàn)此API的一種非常有吸引力的方法。 今天,我將使用Azure Functions構(gòu)建它,因?yàn)椤瓰槭裁床荒?#xff1f;

因此,從技術(shù)上講,該解決方案的Poc版本如下所示:

一旦出現(xiàn)新的人工任務(wù),FlexDeploy會(huì)通知無服務(wù)器API有關(guān)提供內(nèi)部任務(wù)ID和任務(wù)描述的API。 有一個(gè)SaveTask函數(shù),將提供的任務(wù)詳細(xì)信息以及生成的令牌(只是一些uid)保存到Azure Table存儲(chǔ)中 。 該令牌具有到期時(shí)間,這意味著應(yīng)該在該時(shí)間之前使用它來批準(zhǔn)/拒絕任務(wù)。

const azure = require( 'azure-storage' ); const uuidv1 = require( 'uuid/v1' ); module.exports = async function (context, taskid) { var tableSvc = azure.createTableService( 'my_account' , 'my_key' ); var entGen = azure.TableUtilities.entityGenerator; var token = uuidv1(); var tokenEntity = { PartitionKey: entGen.String( 'tokens' ), RowKey: entGen.String(token), TaskId: entGen.String(taskid), dueDate: entGen.DateTime( new Date(Date.now() + 24 * 60 * 60 * 1000 )) }; ??? ?tableSvc.insertEntity( 'tokens' ,tokenEntity, function (error, result, response) { }); return token; };

保存令牌后,將調(diào)用PostToSlack函數(shù),將消息發(fā)布到Slack通道。 SaveTask和PostTo Slack函數(shù)被編排到一個(gè)持久函數(shù) NotifyOnTask中 ,該函數(shù)實(shí)際上是由FlexDeploy調(diào)用的:

const df = require( "durable-functions" ); module.exports = df.orchestrator(function*(context){ var task = context.df.getInput() var token = yield context.df.callActivity( "SaveTask" , task.taskid) return yield context.df.callActivity( "PostToSlack" , { "token" : token, "description" : task.description}) });

Slack中的消息包含兩個(gè)按鈕來批準(zhǔn)和拒絕任務(wù)。

這些按鈕指向指向ActionOnToken持久功能的webhooks :

const df = require( "durable-functions" ); module.exports = df.orchestrator(function*(context){ var input = context.df.getInput() var taskId = yield context.df.callActivity( "GetTaskId" , input.token) if (input.action == 'approve' ) { yield context.df.callActivity( "ApproveTask" , taskId) } else if (input.action == 'reject' ) { yield context.df.callActivity( "RejectTask" , taskId) } });

ActionOnToken調(diào)用GetTaskId函數(shù),通過給定令牌從存儲(chǔ)中檢索任務(wù)ID:

const azure = require( 'azure-storage' ); module.exports = async function (context, token) { var tableSvc = azure.createTableService( 'my_account' , 'my_key' ); function queryTaskID(token) { return new Promise(function (resolve, reject) { tableSvc.retrieveEntity( 'tokens' , 'tokens' , token, function (error, result, response) { if (error) { reject(error) } else { resolve(result) } }); }); } var tokenEntity = await queryTaskID(token); if (tokenEntity) { var dueDate = tokenEntity.dueDate._ if (dueDate > Date.now()) { return tokenEntity.TaskId._ } } };

完成后,它可以通過調(diào)用任一方法來批準(zhǔn)或拒絕任務(wù)
ApproveTask或RejectTask函數(shù)。 這些功能依次調(diào)用FlexDeploy REST API。

const request = require( 'sync-request' ); const fd_url = ' http://dkrlp01.flexagon:8000 ' ; module.exports = async function (context, taskid) { var taskid = taskid; var res = request( 'PUT' , fd_url+ '/flexdeploy/rest/v1/tasks/approval/approve/' +taskid,{ }); };

我可以直接在云端開始開發(fā)無服務(wù)器應(yīng)用程序
Azure Portal ,但是我決定實(shí)現(xiàn)所有功能并在本地使用它,然后再遷移到云中。 我可以做到這一點(diǎn),在本地開發(fā)和測(cè)試我的功能這一事實(shí)實(shí)際上非???#xff0c;并不是每個(gè)無服務(wù)器平臺(tái)都為您提供該功能。 我在云中配置的唯一內(nèi)容是
帶有表的Azure Table存儲(chǔ)帳戶,用于存儲(chǔ)我的令牌和任務(wù)詳細(xì)信息。

在本地開始使用Azure Functions的便捷方法是使用
Visual Studio Code作為開發(fā)工具。 我在Mac上工作,因此我下載并安裝了Mac OS X版本。VS Code就是有關(guān)擴(kuò)展的,對(duì)于您正在使用的每種技術(shù),您都將安裝一個(gè)或幾個(gè)擴(kuò)展。 關(guān)于Azure函數(shù)也是如此。 有一個(gè)擴(kuò)展:

完成此操作后,您將獲得一個(gè)新選項(xiàng)卡,您可以在其中創(chuàng)建新的功能應(yīng)用程序并開始實(shí)現(xiàn)您的功能:

在配置新項(xiàng)目時(shí),向?qū)?huì)要求您選擇一種語言,您希望該語言用于實(shí)現(xiàn)以下功能:

盡管我喜歡Java,但仍選擇JavaScript是因?yàn)槲蚁朐诔R?guī)函數(shù)之上實(shí)現(xiàn)持久函數(shù),并且它們支持C# ,
僅F#和JavaScript 。 在撰寫本文時(shí), JavaScript最接近我。

休息照常。 您可以創(chuàng)建函數(shù),編寫代碼,調(diào)試,測(cè)試,修復(fù),然后重新進(jìn)行所有操作。 您只需單擊F5,VS Code就可以在調(diào)試模式下啟動(dòng)整個(gè)應(yīng)用程序:

首次啟動(dòng)該應(yīng)用程序時(shí),VS Code會(huì)建議您在計(jì)算機(jī)上安裝函數(shù)運(yùn)行時(shí)(如果沒有)。 因此,基本上,假設(shè)您在筆記本電腦運(yùn)行時(shí)中使用了首選語言(Node.js),則只需要具有VS Code及其功能擴(kuò)展即可開始使用Azure Functions 。 它將為您完成其余的安裝。

因此,一旦應(yīng)用程序啟動(dòng),我就可以通過調(diào)用啟動(dòng)整個(gè)周期的NotifyOnTask函數(shù)對(duì)其進(jìn)行測(cè)試:

curl -X POST --data '{"taskid":"8900","description":"DiPocket v.1.0.0.1 is about to be deployed to PROD"}' -H "Content-type: application/json" http: //localhost:7071/api/orchestrators/NotifyOnTask

該應(yīng)用程序的源代碼可在GitHub上找到 。

好了,到目前為止, Azure Functions的總體觀點(diǎn)是……這很好。 它只是工作。 到目前為止,在實(shí)施該解決方案時(shí),我沒有遇到任何煩人的問題(除了我犯了一些愚蠢的錯(cuò)誤,因?yàn)槲覜]有仔細(xì)閱讀本手冊(cè))。 我一定會(huì)繼續(xù)在Azure Functions上進(jìn)行發(fā)布和發(fā)布,以豐富該解決方案并將其遷移到云中,并可能實(shí)現(xiàn)一些不同的東西。

而已!

翻譯自: https://www.javacodegeeks.com/2019/03/serverless-api-azure-functions.html

azure api 管理

總結(jié)

以上是生活随笔為你收集整理的azure api 管理_具有Azure功能的无服务器API的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。