Serverless&Azure Functions

通过无服务器计算,开发者无需管理基础结构,从而可以更快构建应用程序。通过无服务器应用程序,将由云服务提供商自动预配、缩放和管理运行代码所需的基础结构。

要理解无服务器计算的定义,注意到服务器仍在运行代码很重要。服务器名称来源于这样一个事实:与基础结构预配和管理相关联的任务对开发者不可见。这种方式让开发者能够更多地专注于业务逻辑,向业务核心交付更多价值。无服务器计算可帮助团队提高生产力、更快将产品推向市场,并让组织可以更好地优化资源、保持专注于创新。

引用自Azure文档

以上文字引用自Azure,说的有点官方。说说我个人对Serverless的简单理解。所谓Serverless是相对于传统有应用的部署方案来说的。传统应用不管你是直接部署在主机或者容器化来部署,你的程序总是跑在一个完整的应用进程下。比如你只是想提供一个简单的A+C=C的Web Api,你往往需要启动一个完整的asp.net mvc项目或者sprintmvc项目来承载简单的代码。那么Serverless通过云服务把目标更加细化,通过它你可以只使用相关代码实现某个方法或函数,上传到云端后这个函数就可以跑了。这样子的话资源占用更加少,相对的资源付费也会更加有针对性,因为你无需为没用的资源所付费。Serverless可以说是对微服务的更加细化,使在云端运行的代码从application级别降低到了Function/method级别。

上面简单介绍了Serverless。而Azure的Serverless方案就是Azure Functions。

创建函数应用

Azure Function是个免费服务,在免费服务列表里找到它并点击创建。



给函数取个名称,发布选择“代码”。如果打算用.net来开发则运行时堆栈选择.NET Core版本选择3.1。跟其他资源一样区域选择东亚,因为它离你近。



因为Azure Function虽然是Serverless但是也些储存空间,所以需要配置存储账户。选择上次我们使用AzureBlob时候创建的存储账号。没有的话可以新建一个。

操作系统任意选择Linux或者Windows。

计划类型选择:消耗(无服务器)

Azure 函数提供1000000请求/月的免费额度

使用VSCode进行本地开发

在函数列表界面点击“本地开发”。会弹出本地开发指导。选择VSCode环境会出现VSCode的开发环境配置说明。



首先本地需要安装node跟npm。使用下面的命令自动安装Core Tools包:

npm install -g azure-functions-core-tools@3 --unsafe-perm true

注意:这个包还是很大的,由于网络的原因有可能拉不下来。如果长时间下不下来也可以直接搜索azure-functions-core-tools直接下载独立安装包。

使用npm安装完core tools后还有安装Azure Functions的VSCode插件。



打开VSCode插件菜单,搜索Azure Functions,找到Azure Functions插件后点击Install开始安装。这个插件一会就安装完了。

新建Function

我们按照完VSCode的插件后,切换到Azure Function菜单。



点击新建按钮会弹出Azure Function支持的触发器。触发器有很多有HttpTrigger,BlobTrigger,CosmosDbTrigger等等。这里选择最简单的HttpTriger触发器。接着会提示输入项目名称,输入名称后回车就可以生成本地项目了。

Function代码

我们简单演示下Azure Function,使用这个函数实现一个简单的两个数相加返回相加结果。

namespace Company.Function
{
public static class AzFnTest
{
[FunctionName("AzFnTest")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request."); string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody); int a = data.A;
int b = data.B; int c = a + b; return new OkObjectResult(c);
}
}
}

以C#为语言的Azure Function入口就是一个run方法。run方法的入参有2个,一个是HttpRequest,一个Ilogger。其中HttpRequest包含了http请求的信息,QueryString、body、headers等。这个类就是来自Microsoft.AspNetCore.Mvc命名空间。返回值是Task。那么本质上一个Function其实可以看做是标准MVC方案里的一个Action。只是缺乏了参数自动绑定。我们需要的参数都要从HttpRequest对象上提取。

上面的代码很简单,就是获取body内容反序列化成一个动态对象,获取参数A、B,然后相加得到C,通过OkObjectResult直接返回出去。

本地测试

在VSCode界面按F5启动调试。VSCode会启动一个本地实例,可以接受http请求。我们使用postman往这个地址post一个json数据过去。

{
"A" : 1 ,
"B" : 2
}



可以看到返回了结果3。

上传到Azure



在VSCode上点击上传按钮,会提示登录Azure。登录成功后会列出上面我们新建的Azure Function的资源。



选择azure-fn0,选中之后会开始上传,最后output窗口会提示成功。



回到portal网站刷新下,会看到我们的项目已经上传成功了。

运行函数

点击函数名称弹出明细界面。点击“获取函数URL”获取调用这个函数的真实URL。



有了这个地址我们就可以在全球范围内使用这个函数啦。让我们使用Postman再测试一下。



可以看到返回了正确的结果。

总结

以上我们使用C#代码实现了一个简单的Azure Functions并调用了它。Azure Functions还支持Java、Nodejs、Python等常用的编程语言。Azure Functions跟Azure生态紧密结合,除了支持HttpTrigger,还支持CosmosDb,Azure Blob,甚至是Iot边缘计算等场景。Azure Functions是Azure的Serverless解决方案,它具有无需基础结构管理、动态可伸缩性、加快上市、更高效地使用资源等优点,大家如果想体验Serverless可以尝试一下。

使用Azure Function玩转Serverless的更多相关文章

  1. 使用ML.NET和Azure Function进行机器学习 - 第1部分

    介绍 一提到机器学习,总是让人望而生畏.幸运的是,Azure正在想方设法让开发人员更容易进入机器学习.ML.NET是Microsoft Research专为.NET开发人员开发的机器学习框架,因此您可 ...

  2. 使用ML.NET和Azure Function进行机器学习 - 第2部分

    本文是<使用ML.NET和AzureFunction进行机器学习 - 第1部分>的续篇. 像机器一样识别鸢尾花 回顾第1部分,您将使用Visual Studio创建一个新的Azure Fu ...

  3. 创建Azure Function

    azure function的用途在于运行一些逻辑简单的执行逻辑,比如batch job,定时任务,webhook等等.1. 创建azure function创建完毕后,进入app service,选 ...

  4. 【Azure Application Insights】在Azure Function中启用Application Insights后,如何配置不输出某些日志到AI 的Trace中

    问题描述 基于.NET Core的Function App如果配置了Application Insights之后,每有一个函数被执行,则在Application Insights中的Logs中的tra ...

  5. 【Azure 应用服务】App Service/Azure Function的出站连接过多而引起了SNAT端口耗尽,导致一些新的请求出现超时错误(Timeout)

    问题描述 当需要在应用中有大量的出站连接时候,就会涉及到SNAT(源地址网络转换)耗尽的问题.而通过Azure App Service/Function的默认监控指标图表中,却没有可以直接查看到SNA ...

  6. 【Azure 应用服务】Azure Function集成虚拟网络,设置被同在虚拟网络中的Storage Account触发,遇见Function无法触发的问题

    一切为了安全,所有的云上资源如支持内网资源访问,则都可以加入虚拟网络 问题描述 使用Azure Function处理Storage Account中Blob 新增,更新,删除等情况.Storage A ...

  7. 【Azure 应用服务】Azure Function App 执行PowerShell指令[Get-Azsubscription -TenantId $tenantID -DefaultProfile $cxt]错误

    问题描述 使用PowerShell脚本执行获取Azure订阅列表的指令(Get-Azsubscription -TenantId $tenantID -DefaultProfile $cxt).在本地 ...

  8. 【Azure 应用服务】Azure Function App使用SendGrid发送邮件遇见异常消息The operation was canceled,分析源码逐步最终源端

    问题描述 在使用Azure Function App的SendGrid Binging功能,调用SendGrid服务器发送邮件功能时,有时候遇见间歇性,偶发性异常.在重新触发SendGrid部分的Fu ...

  9. 【Azure 应用服务】Azure Function HTTP 触发后, 230秒就超时。而其他方式触发的Function, 执行5分钟后也超时,如何调整超时时间?

    问题描述 Azure Function HTTP 触发后, 230秒就超时,而其他方式触发的Function, 执行5分钟后也超时,如何调整超时时间? 问题分析 查阅官方文档,对函数应用超时持续时间有 ...

随机推荐

  1. Apache Hudi 0.6.0版本重磅发布

    1. 下载信息 源码:Apache Hudi 0.6.0 Source Release (asc, sha512) 二进制Jar包:nexus 2. 迁移指南 如果您从0.5.3以前的版本迁移至0.6 ...

  2. python爬虫之多线程、多进程+代码示例

    python爬虫之多线程.多进程 使用多进程.多线程编写爬虫的代码能有效的提高爬虫爬取目标网站的效率. 一.什么是进程和线程 引用廖雪峰的官方网站关于进程和线程的讲解: 进程:对于操作系统来说,一个任 ...

  3. 基于 GitBook 搭建个人博客

    目录 基于 GitBook 搭建个人博客 1.为什么要写博客? 2.为什么选择使用 GitBook 来搭建? 3.搭建方式 3.1 GitBook 线上直接搭建 3.2 由基于Node.js的命令工具 ...

  4. JS获取时间(当前-过去-未来)

    /** * 获取时间格式为:1970-01-01 00:00 * @param {参数} params * 属性 类型 默认值 必填 说明 * date Date new Date() 否 Date对 ...

  5. rust 模块组织结构

    rust有自己的规则和约定用来组织模块,比如一个包最多可以有一个库crate,任意多个二进制crate.导入文件夹内的模块的两种约定方式... 知道这些约定,就可以快速了解rust的模块系统. 先把一 ...

  6. Spring Security如何优雅的增加OAuth2协议授权模式

    一.什么是OAuth2协议? OAuth 2.0 是一个关于授权的开放的网络协议,是目前最流行的授权机制. 数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据.系统从而产生一个短期的进入令 ...

  7. qqmini

    QQ玩一玩最新调试方法 https://blog.csdn.net/zyw_java/article/details/83686645 LayaBox 接入QQ玩一玩 轻游戏流程 https://bl ...

  8. Kernel_task占CPU问题

    彻底解决高版本 mac Kernel_task占CPU问题 https://blog.csdn.net/liumx2007/article/details/77164795

  9. ios Standard Framework和Umbrella Framework

    Standard Framework:标准库,通过引用对应的header文件而不是引用master header 文件来引用类(也可以通过引用Master Header file来引用需要使用的类), ...

  10. 面试【JAVA基础】其他

    1.自定义注解 @target 说明了Annotation所修饰的对象范围: constructor.method.field.package.type等等. @retention 定义了该Annot ...