具有Azure功能的无服务器API

在这篇文章中,我将研究一个非常简单的用例。 在执行部署管道时, FlexDeploy可能会产生一些应被批准或拒绝的人工任务。 例如,某人必须批准对生产环境的部署。 可以在FlexDeploy UI中或通过某些外部通信渠道来完成。 今天,我将重点介绍通过Slack批准/拒绝FlexDeploy人工任务的场景:

无服务器API


我想考虑一些要求和注意事项:

  • 我不想教FlexDeploySlack通信
  • 我不想向Slack提供FlexDeploy API的详细信息
  • 我不想向公众公开FlexDeploy API
  • 我确实希望能够轻松地将Slack更改为其他内容或添加其他通信工具,而无需接触FlexDeploy

基本上,我想使FlexDeploy与外部通信机制的细节脱钩。 因此,我将引入一个额外的层,即FlexDeploySlack之间的API 。 看起来无服务器范例是实现此API的一种非常有吸引力的方法。 今天,我将使用Azure Functions构建它因为……为什么不呢?

因此,从技术上讲,该解决方案的Poc版本如下所示:

无服务器API

一旦出现新的人工任务,FlexDeploy会通知无服务器API有关提供内部任务ID和任务描述的API。 有一个SaveTask函数,将提供的任务详细信息以及生成的令牌(只是一些uid)保存到Azure Table存储中 。 该令牌具有到期时间,这意味着应该在该时间之前使用它来批准/拒绝任务。

 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;  }; 

保存令牌后,将调用PostToSlack函数,将消息发布到Slack通道。 SaveTaskPostTo Slack函数被编排到一个持久函数 NotifyOnTask中 ,该函数实际上是由FlexDeploy调用的

 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中的消息包含两个按钮来批准和拒绝任务。

无服务器API

这些按钮指向指向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调用GetTaskId函数,通过给定令牌从存储中检索任务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._ } }  }; 

完成此操作后,它要么通过调用要么批准或拒绝任务
ApproveTaskRejectTask函数。 这些功能依次调用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,{ });  }; 

我可以开始直接在云中开发无服务器应用程序
Azure Portal ,但是我决定实现所有功能并在本地使用它,然后再移至云中。 我可以做到这一点,在本地开发和测试功能的事实实际上非常酷,并不是每个无服务器平台都为您提供该功能。 我在云中配置的唯一内容是
带有表的Azure Table存储帐户,用于存储我的令牌和任务详细信息。

在本地开始使用Azure Functions的便捷方法是使用
Visual Studio Code作为开发工具。 我在Mac上工作,因此我下载并安装了Mac OS X版本。VS Code就是关于扩展的,对于与您一起使用的每种技术,您都将安装一个或几个扩展。 关于Azure函数也是如此。 有一个扩展:

无服务器API

完成此操作后,您将获得一个新选项卡,您可以在其中创建新的功能应用程序并开始实现您的功能:

无服务器API

在配置新项目时,向导会要求您选择一种语言,您希望该语言用于实现以下功能:

无服务器API

尽管我喜欢Java,但仍选择JavaScript是因为我想在常规函数之上实现持久性函数,并且它们支持C#
F#JavaScript 。 在撰写本文时, JavaScript最接近我。

休息照常。 您可以创建函数,编写代码,调试,测试,修复,然后重新进行所有操作。 您只需单击F5,VS Code就可以在调试模式下启动整个应用程序:

无服务器API

首次启动该应用程序时,VS Code会建议您在计算机上安装函数运行时(如果该应用程序不存在)。 因此,基本上,假设您在笔记本电脑运行时上有了首选语言(Node.js),则只需要具有VS Code及其功能扩展即可开始使用Azure Functions 。 它将为您完成其余的安装。

因此,一旦应用程序启动,我就可以通过调用NotifyOnTask函数来对其进行测试,该函数将启动整个周期:

 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 

该应用程序的源代码可在GitHub上找到 。

好的,到目前为止, Azure Functions的总体观点是……这很好。 它只是工作。 到目前为止,在实施该解决方案时,我没有遇到任何烦人的问题(除了一些愚蠢的错误,因为我没有认真阅读本手册)。 我一定会继续在Azure Functions上进行发布和发布,以丰富该解决方案并将其迁移到云中,并可能实现一些不同的东西。

而已!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】 广东开放大学 21秋期末考试物业经营管理实务10123k2

1、对于房地产市场供给的特点,下列说法不正确的是( )。(2 分) A.房地产市场供给具有较大的供给弹性 B.房地产市场具有高度的垄断性 C.供给主体间的竞争不充分 D.市场供给具有非同质性 2、物业可…

mysql创建连接失败怎么办,MYSQL在Windows 2003上连接不上的解决方法

MYSQL在Windows 2003上连接不上的解决方法今天搭建mysql数据库,连接了半天,都提示10061错误,以为密码出了问题试了半天,压根连服务都连接不上,忙活了半个多小时,才发现是系统补丁打了之后出现的问题(kb967723)于是网上找了一下资料最近一个客户服务器的MYSQL频繁提示连接不上&a…

工业以太网交换机的安全问题详解

以太网交换机技术发展趋势近几年来,随着企业数据通信业务以及相关的融合业务的迅猛发展,以太网交换机作为不可或缺的要害设备不仅在数量上获得了极大的提高,而且在质量、性能等方面不断完善。而伴随着以太网交换机的迅速普及,它的…

【渝粤教育】21秋期末考试中国法律史10212k1

1、我国古代首次公布的成文法是在(3 分) A.纸上 B.竹简上 C.帛上 D.鼎上 2、在唐朝遇重大案件,常由大理寺卿会同刑部尚书、御史中丞共同审理,叫做(3 分) A&am…

Java:ChronicleMap第3部分,快速微服务

标准Java地图需要在启动时进行初始化。 了解如何利用可从文件初始化的ChronicleMaps并显着减少微服务启动时间,以及如何在JVM之间共享Maps。 内置的Map实现(例如HashMap和ConcurrentHashMap速度很快,但是必须先使用映射进行初始化&#xff0…

工业交换机的背板带宽是怎么计算的?

工业交换机的背板带宽,是工业交换机插口CPU或接口卡和系统总线间能够吞吐量的较大信息量。背板带宽标示了工业交换机总的数据传输工作能力,单位为Gbps,也叫互换网络带宽,一般的工业交换机的背板带宽从几Gbps到几百Gbps不一。一台工…

【渝粤教育】21秋期末考试工程经济10202k2

1、某设备原始价值16,000元,残值为零,折旧年限为5年,用双倍余额递减法计算的第4年折旧额为( )元。(2.5 分) A.1,728 B.1,382.4 C.2,304 D.3,840 2…

matlab 性能分析方法,DPCM,PSK系统的MATLAB实现及性能分析

DPCM/PSK系统的MATLAB实现及性能分析学生姓名:指导老师:摘要:本课程设计主要是为了进一步理解DPCM编码解码和PSK调制解调原理,并能通过MATLAB系统软件来实现对DPCM编码解码和PSK调制解调,且通过对各个元件的参数进行不同的设置&am…

【渝粤教育】21秋期末考试计量经济学10551k1

1、下面说法正确的是( )(2 分) A.先决变量是随机变量 B.外生变量是非随机变量 C.外生变量是随机变量 D.内生变量是非随机变量 2、平稳时间序列的均值和方差是固定不变的,…

orm java_Java 8 Friday:不再需要ORM

orm java在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 Java 8星期五 每个星期五,我们都会向您展示一些不错的教程风格的Java 8新功…

工业交换机的端口号结构特征

假如按工业交换机的端口号构造来分,工业交换机大概可分成:固定不动端口号工业交换机和模块化设计工业交换机二种不一样的构造。实际上也有一种是二者兼具,那便是在出示基础固定不动端口号的基本以上再配置一定的拓展扩展槽或控制模块。今天&a…

python3 ftp.mlsd,python3中的ftp目录

我在Python3.3中有以下代码:ftpHost"myhost"linkftplib.FTP(ftpHost)link.login(user"me",passwd"alsome")tlink.nlst()link.quit()print(t)我得到的输出是^{pr2}$在python3文档中,写到FTP.nlst文件“自3.3版起已弃用&…

lora技术和zigbee技术那个好,两者有啥优势

ZigBee是基于IEEE802.15.4标准的低功耗局域网协议,LoRa是LPWAN通信技术中的一种,那么lora技术和ZigBee技术哪个好呢?今天我们就来看看具体的介绍。 LoRa是LPWAN通信技术中的一种,是美国Semtech公司采用和推广的一种基于扩频技术的超远距离无…

【渝粤教育】国家开放大学2018年春季 0062-22T港台文学专题讲座 参考试题

试卷编号:0062 座位号 2017——2018学年度第二学期期末考试 中国当代文学专题 试题(开) 2018年7月 《鹿鼎记》和金庸以前的武侠小说的主要差别是什么?1.通过《红高粱》讲述的“我爷爷”余占鳌和“我奶奶”戴凤莲的故…

【渝粤教育】国家开放大学2018年春季 0149-22T现代汉语 参考试题

试卷编号:0149 座位号 2017——2018学年度第二学期期末考试 现代汉语试题 2018年7月 1.新词 2.北方方言3.形旁4.定位语素 5.派生义 1.声母z和zh的区别是________不同。 2._____的…

物联网智慧城市为降低城市能源消耗做出贡献

我们居住的世界正在不断的趋于城市化 我们生活在一个不断城市化的世界里,世界上一半以上的人都居住在城市里。在全球范围内,城市化的速度正在不断的推进中:据推算,每周约有300万的人口迁入城市。按照这个速度,预计等到…

Java Stream:计数始终是计数吗?

它可能会出现明显的是,在计数的元素Stream需要较长时间的多个元素中有Stream 。 但实际上, Stream::count有时可以在一个操作中完成,无论您有多少元素。 阅读本文并了解操作方法。 计数复杂度 Stream::count终端操作对a中的元素数进行计数 …

【渝粤教育】国家开放大学2018年春季 0269-22T文学概论 参考试题

试卷代号:0269 2017-2018年度第二学期考试 文学概论试题 2018年7月 一、选择题(请在下面的答题框内写上正确答案的序号)(每小题3分,共30分) 1.在魏晋时期,南朝宋文帝建立“四学”即…

工业以太网的冗余功能有哪些?

由于工业环境对工业控制网络可靠性能的超高要求,工业以太网的冗余功能应运而生。从快速生成树冗余(RSTP)、环网冗余(RapidRing)到主干冗余(Trunking),都有各自不同的优势和特点,控制工程师们可以…

支付宝回调地址index.php,支付宝支付成功回调地址怎么不改变当前页面?

手机端支付宝支付成功后 会有一个回调地址"http://pay.xxx.com/channel/alipayWap/return_url.php?is_successT&notify_idRqPnCoPT3K9%252Fvwbh3Ih20EPHd%252B9cnawdN%252Bu%252FVdQAMTpw%252FtTBJga49sLEne6jOnYt2mSr&notify_time2017-08-0814%3A41%3A49&no…