技术博客:Azure Functions + Azure Storage 开发
Azure
GitHub wiki 同步发布 传送门
Azure Functions
通过 Functions(一个事件驱动型无服务器计算平台,还可以解决复杂的业务流程问题)更加高效地进行开发。在本地构建和调试,而无需额外的设置,在云中大规模部署和操作,并使用触发器和绑定集成服务。
——Azure Functions
Azure Storage
Azure 存储平台是适用于新式数据存储方案的 Microsoft 云存储解决方案。 核心存储服务为数据对象、适用于 Azure 虚拟机(Vm)的磁盘存储、适用于云的文件系统服务、用于可靠消息传送的消息存储和 NoSQL 存储提供高度可缩放的对象存储。
——Azure Storage
注:想要使用Azure,必须有visa卡才可以注册成功!
python开发Http服务
Azure Functions提供了Http触发器,在接收到Http请求的时候函数就会被触发执行。
Azure Python开发的好处是不需要自己解析Request的Header、body等等,可以通过Azure Functions现成的接口来获取需要的数据。
目前Azure Functions的开发支持VS Code和VS Studio,笔者愿意使用轻量级的编辑器,所以选择了VS Code开发,不过VS Studio应该差不了太多的。
似乎还有一个CLI版本,但是因为笔者不熟悉,感兴趣的可以自行探索——传送门
接下来用一个例子介绍:
喜欢英文可以直接阅读参考文档
环境配置
- Azure account: 使用visa卡注册,可以获得一年的免费使用权(一定程度上的,你懂的)以及价值200$的为期一个月的白嫖券!
- Node.js: Windows下npm需要——下载
- Python 3.8,Python 3.7,Python 3.6均可。但是笔者强烈建议使用Python 3.6,笔者在开发期间遇到了各种无法调试的Bug,原因大概是因为pylint以及python版本导致的谜之BUG,但是换成了3.6后暂时清爽。不过如果你使用较高版本没有问题,那么说明BUG已经被修复了,自然是最好的
- VS Code
- VS Code的Python extension插件
- VS Code的Azure Functions extension插件
- VS Code的Azure Storage extension插件 (仅限需要使用Azure Storage)
- Azure Storage Explorer (仅限需要使用Azure Storage)
可以看到需要配置的环境还是很多的,VS Studio可能就省心很多了,下载对应的包就可以
1. 创建项目
在VS Code的左边栏会有Azure的标志,点击即可创建,第一次需要登录Azure account
创建过程有很多选择:
- 语言——笔者选择
Python - 选择Python解释器: 这个解释器用来创建项目的虚环境
**.venv**,这里需要注意的是,Python解释器的版本决定虚环境Python的版本 - 选择模板——这里选择
Http trigger - 给函数命名
- 认证级别——选择
Anonymous(匿名)即可 - 选择怎么打开项目——选择
Add to workspace添加到工作区
2. 在本地运行
按
F5运行运行成功会会出现下面的图片

使用浏览器访问链接即可
3. 把代码推送到Azure上
在VS Code的Azure插件处登录,然后点击部署按钮:

在VS Code出现的提示中选择:
- 选择推送代码的文件夹
- 选择Azure Storage的订阅(需要先申请一个订阅)
- 选择Azure的Functions App,这里点击
+ create new Function App - 给Functions App起名字
- 选择运行时版本——云端运行代码版本,应与你开发代码的Python版本一致
- 选择部署的地区——这里直接选择东亚
East Aisa
等待部署成功后,点击view output即可看到云端部署的代码的链接,使用浏览器就可以访问函数!

4. Azure portal
代码部署后,可以通过Azure Portal来查看并且监视函数的运行情况,通常也可以用来进行DeBug。
注:代码部署后,如果出现浏览器无法访问,是因为Azure 环境没有对外部链接开放认证,在portal中自己的Functions App下的 CORS 下配置允许访问的来源即可,一个常用的配置是直接置为 *:

Azure Storage使用
Azure Functions的功能从某种意义上说很强大,但是同时也有一定的不方便性。如果想要在函数中操作文件等必须借助Azure Storage,因此下面简单介绍一下
这里还有一个坑,笔者在后面会详细说明
Azure Storage是一个存储的云服务,通过订阅可以很方便的上传和下载文档。其中存储对象分为四个类别:容器、共享文件、表、队列。
每一个都有较为有趣的用法,大家可以自行探索一下,笔者只尝试过容器和队列,下面介绍一下:
队列
上面我们简单说过Azure Functions的Http trigger是一个触发器,在接收到Http请求的时候会执行函数。这里可以给函数绑定一个 队列 ,每一次函数触发执行时,都可以选择一部分信息传递给 队列 ,可以用来记录一些信息,常常是log信息。
当然,也可以在输入绑定一个 队列 ,在函数每一次被触发时,从Storage给函数一个固定的文件当作函数输入,用来固定读取某些必须的文件信息。
容器
容器可以保存二进制文件,是主要的存储工具。容器的下一层是Blob,分为三种Block Blob、Page Blob、Append Blob,这里主要说明Block Blob。
Azure Storage提供各种接口来上传和下载Blob,可以通过各种组合实现想要的逻辑,从笔者的使用感受来说,基本满足需求,但是有一些别扭倒是真的,可能也是微软独特的设计,笔者体会不太到。
因为最近一两天微软更新了 azure-storage-blob 的Python包的版本,而且禁止了之前旧版本的下载,同时API全部换了一套(导致笔者得重构,真)。
这里面最令笔者不理解的就是新版本对于Blob覆盖竟然没有支持,需要自己手动先删除再上传(还要注意文件不存在的异常),总之就是设计的很迷,不过上传和下载就到大大简化,而且类似Python的文件操作,比较容易上手。
踩坑日记
1. VS Code卡死
4月份使用的时候,Azure Core插件有很严重的Bug,在使用VS Code的调试功能时经常会卡死,往往是调试一次卡一次,体验极差,不过最近更新的版本好像解决了这一问题,笔者目前只遇到过一两次,体验渐佳!
2. VS Code更新导致Azure Functions插件的Json文件丢失而调试失败
Azure Functions在本地运行时需要加载远程的配置信息,所以Json文件的丢失导致找不到然后去更新插件,可能因为笔者网络不好,每一次都失败。
但是即使等待很长时间下载后安装也出现了问题。
这个问题,笔者的解决方案是,手动下载插件,把里面的Json文件备份,每一次VS Code更新都把Json文件复制到对应的位置,比较蠢的办法,但是好用。在Google也没有找到类似的解决办法,所以就凑活着用了。
3. 代码提醒
pylint真是个弟弟,哦,或许是他和VS Code在一起的时候是个弟弟,也或许是Azure Functions的原因
虽然因为Python语言本身的属性原因导致很多错误不会提醒,但是和pycharm的那种体验是不可比拟的。
同时Azure Functions独特的文件结构,在python中导入模块时是这样子的
from . import example #(explicit relative)
from ..shared_code import my_first_helper_function #(explicit relative)
以上会被pylint认为是错误的,但是其实在azure环境下可以处理。
所以,强迫症玩家请卸载pylint,虽然不建议就是了,因为忽略掉这些问题,pylint还是有一点点的作用的。也可能是笔者用不来吧。
4. 套接字问题
本地调试的时候下载storage文件,第二次会因为套接字被使用而直接中断,只能够重新调试。而且,每次下载后关闭调试后,得等一会才可以继续调试,否则也会出现套接字重用。
笔者分析这一问题时因为本地调试的时候配置的环境只有一个套接字(但是总感觉不应该)然后导致第二次就错误。
5. 版本更新
猝不及防,以至于突然重构,但是笔者也认识到,开发过程中需要对自己使用的主要模块进行关注,注意其更新动向,这样在一定程度上可以避免这种问题。
吐槽
- Google上的文档和相关参考较少,而且因为时效性的问题也往往无法解决问题
- 微软官方的文档也是气人
- 最新版的 azure-storage-blob 在python中甚至很多函数没有注释,得点进去自己看怎么用参数,属实
总之笔者已经被折磨的能用就行,不求甚解了!
望后来人不要轻易尝试,如果不可避免要入坑,那么希望这篇博客有一些作用吧(只求微软不会再次更新版本!)
技术博客:Azure Functions + Azure Storage 开发的更多相关文章
- 【好好编程-技术博客】微信小程序开发中前后端的交互
微信小程序开发中前后端的交互 微信小程序的开发有点类似与普通网页的开发,但是也不尽然相同.小程序的主要开发语言是JavaScript,开发同普通的网页开发有很大的相似性,对于前端开发者而言,从网页开发 ...
- IT技术博客收藏
1. coolshell.cn 特点: 每篇都是精品 2. 云风 特点: 3. 阮一峰的博客 特点:高精深 3. offbye涛声依旧-全端技术博客 特点: android的开发技术比较多,非常值得一 ...
- Mark Russinovich 的博客:Windows Azure 主机更新:原因、时间和方式
Mark Russinovich的技术博客涵盖 Windows故障排除.技术和安全等主题. Windows Azure主机更新:原因.时间和方式 Windows Azure的计算平台(其中包括 ...
- [技术博客]Android 开发 Bug Log
[技术博客] Android 开发 Bug Log 大大小小的bug,聪明的愚蠢的都有, 持续记录中...... java.lang.IllegalArgumentException: The sty ...
- [技术博客] 软工-Ruby on Rails 后端开发总结分享
[技术博客] 软工-Ruby on Rails 后端开发总结分享 在这次软件编写中,我们的后端使用了Ruby on Rails (RoR)框架. Rails框架是用Ruby编写的.这意味着当我们为Ru ...
- Azure Functions + Azure Batch实现MP3音频转码方案
客户需求 客户的环境是一个网络音乐播放系统,根据网络情况提供给手机用户收听各种码率的MP3歌曲,在客户没购买歌曲的情况下提供一个三十秒内的试听版本.这样一个系统非常明确地一个需求就是会定期需要将一批从 ...
- [技术博客] Django中文件的保存与访问
[技术博客] Django中文件的保存与访问 在TextMarking项目开发中,数据库需要保存用户上传的文本文档. 原型设计:用户点击上传文本->保存文本->文本发送到后端保存为文件. ...
- 【转】【技术博客】Spark性能优化指南——高级篇
http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...
- [转]有哪些值得关注的技术博客(Java篇)
有哪些值得关注的技术博客(Java篇) 大部分程序员在自学的道路上不知道走了多少坑,这个视频那个网站搞得自己晕头转向.对我个人来说我平常在学习的过程中喜欢看一些教程式的博客.这些博客的特点: 1. ...
随机推荐
- Object类中的常用方法
1.getClass方法 源码: 功能: 返回此Object的运行时类. 什么是运行时类? 如上图所示,类从被加载到虚拟机内存开始,到卸载出内存为止,他的生命周期一共包含7个阶段.其中加载阶段虚拟机需 ...
- iNeuOS工业互联平台,生产过程业务联动控制
1.概述 工业物联网也好.工业互联网也好或是其他生产系统,反向控制始终无法回避.搞工业最直接.最体现效果的两个方面是采集各种数据和生产过程业务控制,所谓大数据预测和分析,那是仁者见仁.智者见智,下一篇 ...
- 推荐模型NeuralCF:原理介绍与TensorFlow2.0实现
1. 简介 NCF是协同过滤在神经网络上的实现--神经网络协同过滤.由新加坡国立大学与2017年提出. 我们知道,在协同过滤的基础上发展来的矩阵分解取得了巨大的成就,但是矩阵分解得到低维隐向量求内积是 ...
- 使用docker搭建sonarqube
sonarqube是一款代码质量检查工具,使用sonar扫描我们写过的代码,可以有助于检查出代码的bug.规范性和健壮性,有助于提高我们的代码质量. 一.安装docker 安装完成之后,命令行输入 d ...
- 走进springboot
SpringBoot基础 核心思想---自动装配---约定大于配置 开发环境:jdk1.8.maven.springboot.idea 一.快速构建一个springboot项目 1.1.进入sprin ...
- CodeForces CF875C题解
题解 非常有意思的\(2-SAT\)的题. 听学长讲完之后感觉确实容易想到\(2-SAT\),顺理成章. 显然,对于两个串,对咱们来说有意义的显然是两个串中第一个不同的数字.那么,我们假设两个串分别是 ...
- day-03-基础数据类型
基础数类型总览 10203 123 3340 int +- * / 等等 '今天吃了没?' str 存储少量的数据,+ *int 切片, 其他操作方法 True False bool 判断真假 [12 ...
- Warm_up(HCTF_2018)
Warm up 考察知识点: 文件包含漏洞 代码审计 解题步骤 首先我们进来看到了一个滑稽的表情,没啥别的东西,先看看源码 源码中发现有注释 source.php 我们访问source.php,得到代 ...
- Tree UVA - 548
You are to determine the value of the leaf node in a given binary tree that is the terminal node o ...
- logstash收集springboot日志
logstash收集springboot日志 maven依赖 <dependency> <groupId>net.logstash.logback</groupId> ...