溫故知新,學習筆記,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

參考

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