温故知新,学习笔记,Azure App Service幕后原理揭秘 | Global Azure 2023 China

背景

作为Azure上备受瞩目的PaaS服务,App Service提供了一站式的运行Web、API及移动应用的解决方案,为用户提供轻松构建业务的体验。而这背后,微软团队又是如何设计和构建这项全球规模、可扩展、易于使用的服务呢?本次技术分享,我们将深入了解Azure内部的秘密,探索App Service的幕后原理。

Global Azure 2023 China上海站在微软Reactor举办,几位各技术领域的微软最有价值专家、高级工程师,将围绕Azure、Azure App Service,以及Azure与GPT、OpenAI、图,以及低代码等话题带来分享,共话Azure。

Global Azure 2023,把握机会,把握时代!"Explore the Possibilities, Embrace the Future!"

image

最近Edi.Wang在Global Azure 2023 China做了一个分享,标题为《Azure App Service 幕后原理揭秘》,之前没来得及看直播,今天录播出来了,补补课。

分享人:汪宇杰(Edi.Wang)

  • 微软Azure最有价值专家(MVP)
  • 目前在某美资金融科技公司担任高级软件工程师、企业认证讲师。使用.NET等技术负责公司金融产品网站开发、教授ASP.NETCore实战系列课程。在社区作为微软Azure最有价值专家(MVP),通过博客、开源项目、线上及线下课程、产品反馈等无偿贡献全球技术社区。

Azure App Service

和传统IaaS虚拟机的区别

传统IaaS虚拟机,需要不停的打补丁;手工安装/升级运行环境;手工配置网站程序;手工连接CI/CD;手工配置IP、网络、负载均衡;发生故障时手工查阅服务器文件目录、抓Dump文件。

而Azure App Service是一种全托管的PaaS服务,支持快速构建、部署和缩放在任何平台上运行的企业级Web应用、移动应用和API应用。其使用完全托管的平台执行基础结构维护的同时,满足严苛的性能、可缩放性、安全性和符合性要求。

Azure Static Web Apps

Azure Static Web Apps是更适合纯静态网站的一种托管方式,它也是基于Azure App Service,成本更低。

image

Azure Functions

Azure Functions也是基于Azure App Service的一种业务抽象的无服务器解决方案,可以使用户减少代码编写、减少需要维护的基础结构并节省成本。无需担心部署和维护服务器,云基础结构提供保持应用程序运行所需的所有最新资源。

原理揭秘

基本构成

  • Scale Unit
  • Azure Resouce Manager
  • Geo-Master
  • Control Unit

image

创建Web App

从Azure的工作台,点击"创建资源"按钮。

image

这里直接从热门Azure服务就可以找到Web应用,选择它进入创建弹窗。

image

创建Web应用页面分为:基本、部署、网络、监视、标记、查看+创建几个子流程。

image

这里属于一个新的资源组名称,如果想复用已经有的就选择一下。

image

输入Web应用的名称,发布方式选用"代码";运行时堆栈选用最新的".Net 7 (STS)"

image

操作系统,选用Linux或者Windows都可以,区域建议选到"East Asia(东亚)",这样从大陆地区范围会顺畅一些。

image

定价计划这块,水就比较深了,但是也有一个"免费F1 0.00 USD/月"可用,我们暂时选它,后续有需要可以改。

image

image

下一步是选部署模式,这里它提供了一个Github Action的选项,默认是禁用状态,如果你的代码托管在微软旗下的Github的话,使用这种方式是比较好的。

image

接下来是设置网络策略,默认是开启公共访问,也就是外部所有流量都能进来,如果关闭,等于会只允许白名单之类的流量进来。

image

接下来是设置监视策略,默认是启用Application Insights的,这里我还是关闭它,不然会产生费用。

image

Azure Monitor Application Insights是面向开发人员和DevOps专业人员的应用程序性能管理(APM)服务。

image

标记可以直接跳过,最后一步,确认了下点击"创建"即可。

image

等待它一步步创建即可。

image

image

image

点击那个分配的默认域,就可以使用了。

image

image

创建服务的背后事件

image

作为一个用户,首先通过这个面板向"Azure Resource Manager"发起一个请求,Geo-Master收到了这个请求,Geo-Master拥有全球区域的资源信息,推荐最近的一个区域节点或者根据用户的指定区域节点,它会去这个区域节点的Control Unit来转达用户的创建请求,这个Control Unit会选择一个Scale Unit来创建最终的资源。

当资源创建完成之后,Geo-Master会向Azure Resource Manager来报告创建的结果。

image

在Geo-Master和Scale Unit之前其实是存在一个Api Controller层,它不直接参与具体资源的创建,它只是一个代理的作用,但是在Api Controller里面它知道创建一个资源对应需要执行哪些步骤。

image

在Scale Unit里面是分为Web Worker和Support Services(Role),大部分服务器都属于Web Worker。

image

我们来看下Web Worker,通过App Service Plan来定义一组功能和计费方案。

当Azure Service App出现的时候,Docker还没出来,它怎么做Scale呢?实际上,它就是提前把所有的Scale Unit都预热好了,并且是运行状态,当需要Scale的时候,它只需要把你的服务文件拷贝到另外一个Unit即可,所以速度也很快。

Web Worker

如何查看Web Worker的信息呢?在左侧菜单中,找到开发工具下面的Console

image

敲入ver命令,可以查看到当前环境Windows版本。

image

通过代码读取注册表也可以拿到这个版本信息。

image

这里可以看到当前用的是Windows Server 2016 Datacenter 10.0.14393.5648(64-bit),后面会升级到2022,这样可以支持TLS 1.3。

另外,大家都会发现Azure的Scale Unit里面服务器都是以RD开头的。

image

这个RD不是大家想的那种缩写,也不是西雅图的意思,Azure最早开发代号叫Red Dog。

Azure的最初代号为“Red Dog”,这只“红狗”的原始设计思路单纯是立足云端构建Windows NT扩展方案。曾负责Windows NT开发的微软公司杰出工程师Dave Cutler执掌帅印,他的任务是设计出一种新型操作系统,借以充当微软云体系的系统基础。Windows Azure由此而生,后又被更名为微软Azure。

Windows Azure的基本定位,相当于Amazon EC2以及Google App Engine的直接竞争对手。顺带一提,Amazon EC2是亚马逊公司打造的基础设施即服务(IaaS),当时虽然尚处于测试阶段,但已经开始引起众多开发人员的关注。而2008年发布的Google App Engine则是业界首款平台即服务(PaaS)产品。考虑到自身在开发者平台与工具领域的深厚历史底蕴,微软方面决定将Azure也打造为PaaS产品。

接下来切换到应用服务计划的纵向扩展(Scale Up)这里看一下,这里可以看到有多种套餐可选。

image

我们可以看到,免费版本是有一个每天最多60分钟的CPU时间限制,如果超出了会返回403。

image

Scale Up在这里的意思是提升或者改变单台服务器的配置。而Scale Out的意思是在不改变单台配置的情况下,增加服务器的数量。

image

Support Services

image

有一种Support Services叫Front-End Role,它其实就是一个前置代理,所有要进入Web Worker的流量都是先到Front-End Role这里,在分配到背后的一个或者多个Web Worker中,它默认是七层负载均衡。

早期Front-End Role就是通过IIS来做的,但是随着客户对GRPC的需求增加,他们正在推进使用YARP来替代IIS做这个前端流量代理的工作,这样也可以支持GPRC了。

File Server

image

在Web Worker中所有的文件,都是通过File Server来处理,实际上它本质上将文件存在到Azure上另外一个叫Azure Storage Blob对象存储的服务上了,File Server并不会让你感觉到它背后的这个服务的存在,而是让你以Network Drive方式映射到Web Worker,让我们觉得这是在操作本地磁盘。

这样有个好处,当需要Scale Out的时候,这些文件就可以不用发生实质拷贝,只需要修改下映射就可以了。

如何查看这些文件呢,我们可以从左侧开发工具下面找到高级工具,点进去,它实际上是微软开源的一个工具叫Kudu。

image

image

找到Debug console菜单下的PowerShell,就可以看到所有的文件了。

image

image

image

还有一种方式就可以通过"应用服务编辑器"来查看网站下的文件,它有个特点就是可以直接编辑修改,即时生效。

image

image

看起来像一个Visual Studio Code,如果要临时改个文件,这种方式很快。

Publisher

image

发布支持几种方式,最传统的是FTP,但是几乎没人用了。

如果你是用Visual Studio,它支持Web Deploy。

如果你使用Github,它有个Github Action可以用,可以直接部署到Azure App Service。

还有一种方式叫Zip Deploy,部署的是一个压缩包,运行的时候,会把压缩包解压释放出来,它会保留老的zip,这样有利于回滚。

image

Data Role

我们的网站是什么类型、相关信息,这些都需要有个地方存储,Azure会通过Azure SQL Database来存储这些数据。

image

其实应用运行时的日志、占用多少CPU那些都记录在这里。

Networking

当我们使用nslookup去查询Azure的这个默认域时会发现,它都会返回一个非权威应答。

image

其中Address就是当前Scale Unit的IP地址,Aliases是当前Scale Unit的绑定域名。

我们会发现,默认域名叫waws-prod-hk1-013.sip.azurewebsites.windows.net

这里有个典故就是,这里都是以waws开头的,因为最早这里就是Windows Azure Web Site这个的缩写。

其实Azure对我们应用对外的连接数是有限制的,限制情况如图所示:

image

image

在设置下的网络中出站流量这里也是可以看出来的。

彩蛋

通过Azure App Service快速部署私有的ChatGPT

有了它很多时间就变成很简单了,我们都知道ChatGPT其实不是完全免费的,哪怕你是一个免费账号,也只有很小的额度,所以你肯定不想把这个key分享给别人,希望搭建一个只有自己能用的私有ChatGPT对不对。

有个Github主yidadaa倒是已经开源和分享了一套不错的Web UI,叫ChatGPT-Next-Web,我们只需要将他写好的部署下就行了,用上自己的Key。

image

和前面步骤一样,我们创建一个Azure App Service,这次我们发布这里我们选Docker容器。

image

在Docker设置这里,我们映像源设置为Docker Hub,然后映像和标记填写yidadaa/chatgpt-next-web:latest即可

image

其他的和普通的创建一致。

image

弄完之后,我发现,如果是F1的免费计价,嘿嘿,Azure直接都不让你用,服务直接就打不开,这里至少切换到Basic级别,太贵。

image

接下来,默认部署完,那肯定没带授权,我们需要将自己注册好的Open API账号下的API Key复制下。

在设置-应用程序设置,里面添加OPENAI_API_KEY,把这个API Key添加进来。

image

还需要添加一个PORT,填写443就行了。

image

然后前往常规设置那里把Http版本选到2.0

image

此时,不出意外,访问默认域,就可以看到界面了。

image

如果你和我一样,遇到了错误提示:You exceeded your current quota, please check your plan and billing details

那很不好意思,这个代表,免费账号的API请求受限了,只能升级到Plus账号了。

image

如果只希望自己能访问,我们还可以设置身份验证,很方便的,点进去,可以验证很多类型。

image

这样就可以限制,只有满足我们设定的这个授权的用户才能访问了。

image

通过Docker Desktop一键部署私有ChatGPT

如果你已经装好了Docker Desktop,那么要基于yidadaa/chatgpt-next-web部署一个私有ChatGPT真是太简单了。

直接在Docker Desktop的顶部搜索栏搜索关键词chatgpt-next-web,切换到Images分类,排第一个就是我们的要的镜像,点击Run就行。

image

耐心等待它下载完,它正在帮我们拉取这个镜像下来。

image

下载完毕之后,它会弹出一个窗口,让我们输入Docker实例的名称、对外端口,同时这里我们还需要补充一个环境变量:OPENAI_API_KEY,它的值就是我们Open AI的API Key了。

image

最后点击Run就行,一个实例就跑起来了。

image

这时候我们访问地址:http://localhost:3000 就行了。

image

参考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章