.NET Core 编写 Azure Function 并连接 GitHub 持续部署


点击上方蓝字关注“汪宇杰博客”

640?wx_fmt=png

导语

Azure Function 是一个事件驱动型无服务器计算平台,可以解决复杂的业务流程问题,更加高效地进行开发。在本地构建和调试,而无需额外的设置,在云中大规模部署和操作,并使用触发器和绑定集成服务。对我来说,Function 能帮助我快速开发一些简单的API,我只需要编写业务代码,而无需构建完整的应用框架等基础代码。本文将会讲解如何使用.NET Core,C#语言,开发一个简单的 http 触发的 Function 应用,并完成 GitHub 的持续部署配置。

需求

我需要一个 API,用于返回客户端 IP 以及 User-Agent 字符串。但是我不想为了做这么一件简单的事,而创建一个完整的 ASP.NET Core Web API 项目。我只关心我要进行的业务逻辑,不想编写和管理配置文件、依赖注入、Controller、验证等基础代码。

准备开发环境

我们需要以下开发条件:

  • 卖血买到的 Azure 订阅

  • 丐版 Visual Studio 2019 Community 或豪版 Enterprise

  • Azure development workload

  • 免费开源的 .NET Core 2.1 / 2.2 SDK

640?wx_fmt=png

创建 Function 应用

在 VS2019 里,选择 Azure 分类下的 Azure Function,新建一个工程。如:Edi.AzureFunctions

640?wx_fmt=png

默认的.NET Core版本为2.1,我们可以手工改成2.2。编辑 Edi.AzureFunctions.csproj文件,将 TargetFramework 改成 netcoreapp2.2

同样,也可以将 Microsoft.NET.Sdk.Functions 升级到最新版。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>

    <TargetFramework>netcoreapp2.2</TargetFramework>

    <AzureFunctionsVersion>v2</AzureFunctionsVersion>

  </PropertyGroup>

  <ItemGroup>

    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.29" />

  </ItemGroup>

  <ItemGroup>

    <None Update="host.json">

      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

    </None>

    <None Update="local.settings.json">

      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

      <CopyToPublishDirectory>Never</CopyToPublishDirectory>

    </None>

  </ItemGroup>

</Project>

将默认类改名为 ClientInfoFuncion,完成我们的业务代码:取客户端IP及User-Agent

public static class ClientInfoFuncion

{

[FunctionName("IP")]

    public static IActionResult GetClientIp(

        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,

        ILogger log)

    {

        log.LogInformation("Requesting client IP.");

        var ip = req.HttpContext.Connection.RemoteIpAddress.ToString();

        return ip != null

            ? (ActionResult)new OkObjectResult($"{ip}")

            : new BadRequestObjectResult("ip is null");

    }


[FunctionName("UserAgent")]

    public static IActionResult GetClientUserAgent(

        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,

        ILogger log)

    {

        log.LogInformation("Requesting client User-Agent.");

        var ua = req.Headers["User-Agent"].ToString();

        return ua != null

            ? (ActionResult)new OkObjectResult($"{ua}")

            : new BadRequestObjectResult("user-agent is null");

    }

}

可以发现,Azure Function 的代码非常类似 ASP.NET Core MVC / Web API,返回类型正是 Microsoft.AspNetCore.Mvc.IActionResult,然而我们无需关心如何构建一个完整的ASP.NET Core Web API工程,也无需知道 Controller 的存在,只要编写业务逻辑即可。

FunctionName 可以理解为 ASP.NET Core 中的 Route,也就是最终用户调用 API 的 endpoint 地址。

[FunctionName("IP")] 也就最终对应:

https://你的function地址/api/IP

HttpTrigger 是 Azure Function 的一种触发器,表示通过HTTP请求,触发你写的业务逻辑。此处我允许匿名访问,并限定为 get / post 两种HTTP Verb。

ILogger 接口中的日志最终会输出到 Azure Function 的后台,用于调试。

按 F5 启动本地调试。会看见一个很炫酷的命令行窗口,里面启动的是本地的 Azure Function 模拟器。

640?wx_fmt=png

模拟器准备完成后,控制台会输出两个绿色的URL地址,用于本地测试。

640?wx_fmt=png

复制URL到浏览器,完成测试。

640?wx_fmt=png

从 VS 创建和部署 Azure Function

 Edi.AzureFunctions 点击右键,选择 Publish

点击 Start,选择 Azure Functions Consumption Plan,然后选择 Create New。如果你已经在 Azure 上创建过一个 Function 应用,则可选择 Select Existing。关于如何从 Azure portal 创建一个 Function 应用,在稍后讨论。

640?wx_fmt=png

根据需要填写参数

640?wx_fmt=png

最后点击 Publish 完成发布

640?wx_fmt=png

如果发布成功,你可以在 Azure portal 里找到这个 Function 应用,并能看见其 URL

640?wx_fmt=png

尝试在浏览器中访问两个API,分别是:

https://你的function名称.azurewebsites.net/api/ip

https://你的function名称.azurewebsites.net/api/useragent

640?wx_fmt=png

你也可以在 Functions 下进入具体的 HttpTrigger,并在 Azure Portal 里完成测试。这会输出更详细的日志信息。

640?wx_fmt=png

在 Azure Portal 创建 Function

刚才的例子里,我们通过 VS2019 一条龙开发和部署了一个Azure Function,而在实际应用中,通常不会这样操作。因为 Azure Portal 给我们提供了更细致的参数选项,以便根据自己的需求调整。要从 Azure Portal 创建一个空的Function 应用也十分简单,点击 Function App / Add 

640?wx_fmt=png

输入 App name,它将作为该function默认域名使用。

其他参数根据自己需要设置。我建议大家重用既有的 App Service Plan,这样可以省钱。

Runtime Stack 选择 .NET Core

640?wx_fmt=png

从 GitHub 仓库持续部署

我在之前的博客文章中介绍过了 Azure DevOps 的CI/CD流程,非常强大。但是本文给大家介绍一个更简单,但是略为基础的发布方式。

实际上 Function 的本质是对 App Service 的进一步包装,所以包括部署在内的大部分 App Service 的功能这里也能用。在 Platform features 里进入 Deployment Center

640?wx_fmt=png

代码来源选择 GitHub

640?wx_fmt=png

选择 Kudu 编译

640?wx_fmt=png

我已将本文的代码上传到 https://github.com/EdiWang/Edi.AzureFunctions

在 Azure 里选择对应的仓库以及分支,并完成配置。

640?wx_fmt=png

完成配置后,会立即触发一次部署,可以看到详细日志。

640?wx_fmt=png

部署成功后,刷新左边的 Functions 就能看见我们的两个 API 了

640?wx_fmt=png

如果你是个土豪,有自己的域名和证书,也可以绑定自定义域名。就像我这样:

640?wx_fmt=png640?wx_fmt=png

最后,就能优雅的通过自己的域名访问 Function 了!

640?wx_fmt=png640?wx_fmt=gif

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

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

相关文章

「数据ETL」从数据民工到数据白领蜕变之旅(五)-使用dotNET脚本实现SSIS无限扩展...

在前面一文中&#xff0c;正式引出了SSIS专业数据ETL工具&#xff0c;笔者仅能作引路作用&#xff0c;未能使用文章的方式给大家写出更多的入门级的文章&#xff0c;希望读者们可以自行根据分享的学习资源自行完成入门及进阶的学习。同时也想给大家分享到SSIS的能力边界性&…

数据结构为什么那么难?

来源 | 异步 | 文末赠书2017年8月&#xff0c;本着让更多的人轻松学习算法的初心&#xff0c;我写作了第一本书《趣学算法》&#xff0c;该书在出版后受到广大读者一致好评&#xff0c;在一年内重印了10次&#xff0c;并输出了繁体版的版权。一位读者对我说&#xff0c;读这本书…

书籍推荐:《C#7.0本质论》

在dotNet平台中有多种开发语言可以使用&#xff0c;C#无疑是其中应用得最为广泛的。学习一门编程语言最好的方式就是找一本好书系统地学习&#xff0c;我读过的关于C#的书籍中&#xff0c;我认为下面三本最为经典&#xff1a;《C#本质论》&#xff1a;入门类&#xff0c;目前最…

gRPC的简单使用

前言八月初的时候&#xff0c;在公司内部做了一个主题为《gRPC的简单使用》的分享&#xff0c;其实就是和小伙伴们扯扯淡&#xff0c;现在抽空回忆一下&#xff0c;也算是一个小小的总结吧。现在市面上耳熟能详的RPC框架也很多&#xff0c;下面列举几个遇到比较多的。谷歌的gRP…

生命周期结束,Spring Boot 1.x退役

一年前 Spring 官方宣布 Spring Boot 1.x 生命周期将于今年 8 月 1 日结束&#xff0c;如今时间已到&#xff0c;在发布 Spring Boot 1.5.22 的同时&#xff0c;Spring 确认将不再为 1.x 系列发布维护版本。官方希望用户尽快迁移到 Spring Boot 2.x 上&#xff0c;为此还制作了…

Apollo 配置中心:分布式部署

Apollo&#xff08;阿波罗&#xff09;是携程框架部门研发的分布式配置中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端&#xff0c;并且具备规范的权限、流程治理等特性&#xff0c;适用于微服务配置管理场景。服务端…

使用Redis实现最近N条数据的决策

前言很多时候&#xff0c;我们会根据用户最近一段时间的行为&#xff0c;做出一些相应的策略&#xff0c;从而改变系统的运动轨迹。举个简单的例子来说明一下&#xff1a;假设A公司现在有两个合作伙伴(B和C)&#xff0c;B和C都是提供天气数据的&#xff0c;现在A公司做了一个聚…

为什么我不喜欢数据库三范式

插曲最近&#xff0c;一个远房亲戚的小表弟准备选修专业找到我问&#xff1a;"哥&#xff0c;现在学数据库有没有前途阿?""当然有啊&#xff0c;前途大大的呢""那我现在开始学数据库&#xff0c;需要先从什么开始呢?""学课程的话&#xf…

硬货 - 技术人也能轻松玩转公众号?正确姿势竟然是...

最近在知乎上看到关于「公众号是否有“前”途」的相关问题... 问题下面有些精华回答~微信公众号还有“前”途吗&#xff1f; - 知乎https://www.zhihu.com/question/324575670很好的问题&#xff01;作为一个技术人&#xff0c;我决定将此问题和自身情况结合起来&#xff0c;于…

你必须知道的Dockerfile

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。本文预计阅读时间为5分钟。01—关于Dockerfile在Docker中创建镜像最常用的方式&#xff0c;就是使用Dockerfile。Dockerfile是一个Docker镜像的描述文件&#xff0c;我…

RabbitMQ 死信/死信队列

一、RabbitMQ 死信/死信队列1、DLXDead Letter Exchange 的缩写DLX&#xff08;Dead Letter Exchanges&#xff09;死信交换&#xff0c;死信队列本身也是一个普通的消息队列&#xff0c;在创建队列的时候&#xff0c;通过设置一些关键参数&#xff0c;可以将一个普通的消息队列…

centos7 rabbitmq安装/配置

一、RabbitMQ简单介绍RabbitMQ就是当前最主流的消息中间件之一。RabbitMQ是一个开源的AMQP实现&#xff0c;服务器端用Erlang语言编写&#xff0c;支持多种客户端&#xff0c;如&#xff1a;Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等&#xff0c;支…

Hyper-V + CentOS7 安装视频教程

一、前言本文使用图文视频的方式展示安装Centos7&#xff0c;【喜欢看视频学习的童靴请拖至文尾观看视频】二、虚拟机配置指定虚拟机名称&安装位置选择虚拟机代数 第一代虚拟机&#xff08;例如Server 2008等平台技术&#xff0c;支持Vista、Win7&#xff09; 第二代虚拟机…

程序员修神之路--用NOSql给高并发系统加速

领取福利记得长按&#xff0c;领取技术书籍哦随着互联网大潮的到来&#xff0c;越来越多网站&#xff0c;应用系统需要海量数据的支撑&#xff0c;高并发、低延迟、高可用、高扩展等要求在传统的关系型数据库中已经得不到满足&#xff0c;或者说关系型数据库应对这些需求已经显…

限时团购,6.5折:《C# 7.0 核心技术指南》

大家好&#xff0c;经过近两年的翻译&#xff0c;《C# 7.0 核心技术指南》终于和大家见面了。全书由 ThoughtWorks 高级咨询师&#xff0c;资深 .NET 专家刘夏翻译。作为一本第七次再版的图书&#xff0c;此次翻译对书中的字句进行了重新整理。期间和图书的原作者 Joe Albahari…

Azure 命令行工具大混战,都是什么,该选哪个?

点击上方蓝字关注“汪宇杰博客”导语最近在学习 Azure 的命令行玩法&#xff0c;发现官方有不止一种命令行工具&#xff0c;容易对新手产生混淆&#xff0c;本文将介绍各种工具都是干啥的&#xff0c;以及如何选择。目前&#xff0c;微软官方有3个Azure命令行工具&#xff0c;分…

揭秘鸿蒙生态背后的DevOps实践

&#xff08;图片来源于网络&#xff09;8月9日&#xff0c;华为发布了鸿蒙操作系统&#xff0c;在发布会上我们看到了鸿蒙系统的研发历程&#xff1a;2017年&#xff0c;鸿蒙内核1.0完成技术验证&#xff1b;2018年&#xff0c;鸿蒙内核2.0用于终端TEE&#xff1b;2019年&…

AT3557 Four Coloring 切比雪夫距离 + 四色构造

传送门 由于曼哈顿距离在图上显示的是一个棱形&#xff0c;并不是很好看&#xff0c;所以我们将其旋转454545&#xff0c;转换成切比雪夫距离&#xff0c;这样就变成了一个正方形&#xff0c;正方形内部的点距离都不超过ddd&#xff0c;此时可以将正方形内部的点看成一个整体&a…

SonarQube系列一、Linux安装与部署

来源&#xff1a;https://www.cnblogs.com/7tiny/p/11269774.html【前言】随着项目团队规模日益壮大&#xff0c;项目代码量也越来越多。且不说团队成员编码水平层次不齐&#xff0c;即便是老手&#xff0c;也难免因为代码量的增加和任务的繁重而忽略代码的质量&#xff0c;最终…

P2906 [USACO08OPEN]Cow Neighborhoods G 切比雪夫距离 + 并查集 + set

传送门 考虑将曼哈顿距离转换成切比雪夫距离&#xff0c;这样问题就变成了max(∣x1−x2∣,∣y1−y2∣)≤dmax(|x_1-x_2|,|y_1-y_2|)\le dmax(∣x1​−x2​∣,∣y1​−y2​∣)≤d&#xff0c;这个式子就很好看了&#xff0c;我们首先按照(x,y)(x,y)(x,y)排序&#xff0c;让后我…