具有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,一经查实,立即删除!

相关文章

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

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

orm java_Java 8 Friday:不再需要ORM

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

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

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

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

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

input发送a.jax_JAX-RS 2.0:自定义内容处理

input发送a.jax我试图想到一个更好的标题,但未能拿出一个! 请多多包涵……。 JAX-RS 2.0规范允许我们无缝地将JAXB对象编组到HTTP请求/响应主体,或从HTTP请求/响应主体中解组。 简而言之,我们可以使用域对象,而不必担…

工业以太网交换机出现温度过高如何处理?

工业交换机由于其良好的通信性能、超强的抗磁抗干扰性被应用在工业环境下。我们都知道工业环境是很恶劣的,加上工业交换机要连续不间断的工作,很容易造成工业交换机过热的现象!因此除了产品本身采用宽温度范围的元器件之外,我们更…

如何将Java应用程序置于Apache HTTP服务器之后

在过去 ,将Apache HTTP服务器置于Java应用程序服务器或Java应用程序本身的前面是很常见的事情。 其背后的原因非常简单,可以以简单的方式添加缓存,还可以添加负载平衡,并且在此静态内容之上可以由Apache HTTP提供服务&#xff0c…

工业以太网交换机的概念及其主要功能介绍

随着互联网技术的快速发展,工业以太网在工业的通信领域也在大展身手,工业以太网交换机作为重要的通信设备,在整个工业通信行业中有着极其重要的功能!下面,飞畅科技的小编就来为大家详细介绍一下什么是工业以太网交换机…

Zigbee 电动智能窗帘系统 解决方案

随着社会经济结构、家庭人口结构以及信息技术的发展变化以及人类对家居环境的安全性、舒适性、效率性要求的提高,造成家居智能化的需求大大增加, 同时越来越多的家庭要求智能家居产品不仅要满足一些基本的需求,更要求智能家居系统在功能扩展、…

oracle utf8 varchar,Oracle中字符集的类型决定varchar2的字符长度

1.前几天往数据库表里面插入数据的报了一个这样的错误如下:SQL> insert into student values(中华人民共和,60);insert into student values(中华人民共和,60)*第 1 行出现错误:ORA-12899: 列 "SYSTEM"."STUDENT"."NAME" 的值太大…

为什么BAT这些大企业都喜欢用LoRa技术?

相信对于很多朋友来说LORA通讯协议还是比较陌生的,因为LORA这种通讯技术是在2016年开始才正式传入中国的。现在阿里、Google、腾讯等互联网巨头都已经加入了LORA联盟,最有意思的是亚马逊,它在今年西雅图举行的硬件大会上,发布了一…

蓝牙的原理,蓝牙耳机怎么连接手机

蓝牙技术是一种无线数据和语音通信的通信协议,它是一种基于低成本的近距离的无线连接,为固定和移动设备监理通信环境的一种近距离无线连接技术。 蓝牙的作用 蓝牙使今天的一些便携式移动设备和计算机是被能够不需要线路就能相互链接,并且可以…

物联网中的无线通信模块到底是什么

物联网市场的爆发式增长速度,离不开无线通信模块产品的强有力的拉动,无线通信模块也是物联网的核心,但是很多人只知道物联网却对于组成物联网的无线通信模块知之甚少,所以下面就让我们一起来了解一下,物联网中的无线通…

基于NB-IOT的智能烟感应用方案

据国家有关部门发布的2018年火灾数据统计,全国共发生火灾23.7万起,造成1407人死亡,伤798人。直接财产损失36.75亿元,其中居民住宅火灾10.7万起,超过全年火灾总数的45%,其原因与我国当前火灾预防基础设施建设…

带网管工业交换机跟不带网管交换机的差别

交换机是局域网的一种核心设备,可以自主工作的多个计算机系统连接在一起,实现局部的软硬件共享的网络。通常的交换机是利用第二层的MAC地址的进行工作的,所以一般的家庭交换机基本上都是二层交换机。交换机有带网管的也有不带网管的&#xff…

通讯模块板载天线设计方法

注:本文来自 成都亿佰特 蛇形板载天线是无线通讯模块应用最广泛的一种天线类型,应用在蓝牙、WiFi、ZigBee等对性能要求不高、但对空间要求比较高的领域。今天就让成都亿佰特小编给大家普及一下蛇形板载天线的相关知识吧~ 作为天线工程师,每…

物联网在水位监测中的应用

注:本文来自 成都亿佰特 基于E820-DTU(2I2-433L)和E90-DTU(433C30)的水位监测应用 水位资料与人类社会生活和生产关系密切。水利工程的规划、设计、施工和管理需要水位资料。桥梁、港口、航道、给排水等工程建设也需水位资料。防汛抗旱中,水位资料更为…

接入层工业交换机、汇聚层工业交换机与核心层工业交换机区别

了解工业交换机的人都知道,工业交换机被划分为接入层工业交换机、汇聚层工业交换机和核心层工业交换机,今天,飞畅科技的小编就来为大家详细说下这三种工业交换机,感兴趣的朋友就一起来看看吧! 首先,核心层工…

E820-DTU与昆仑通态组态软件联机

随着工业自动化水平的迅速提高,计算机在工业领域的广泛应用,人们对工业自动化的要求越来越高,种类繁多的控制设备和过程监控装置在工业领域的应用,使得传统的工业控制软件已无法满足用户的各种需求。 在开发传统的工业控制软件时&…

BLE蓝牙和传统蓝牙的区别

在移动设备上使用的蓝牙协议大多都是4.0,而蓝牙的4.0又有两个分支,经典4.0蓝牙和BLE4.0蓝牙,经典4.0就是传统的3.0蓝牙升级而成,向下兼容。而BLE4.0蓝牙是一个新的分支,不向下兼容。相较于传统的蓝牙,BLE蓝…