背景
說起當前最火一個技術, 不可避免地討論到一個概念: Serverless,作為一種新型的應用架構,Serverless 讓我們擺脫了維護基礎設施的繁瑣,只需要上傳代碼包或者鏡像, 即可得到一個彈性、高可用、免運維、低成本的服務,
?
聽上去很美的 Serverless 在實際落地開發程序中,卻確存在一些痛點,比如您在使用 Serverless 的程序中,肯定有如下的困擾:
?
- 使用函式計算 Custom Runtime/Container 想要一鍵平遷原有 SpringBoot,Python Flask,ThinkPHP 等各種語言框架的應用,實體啟動程序中需要訪問云端環境中的其他服務(如資料庫或者注冊中心),遇到應用啟動不起來時,該怎么排查原因?
- 應用采用微服務架構,涉及到多個服務,能否在本地代碼開發完成后快速進行端對端測驗?
- 事件驅動的應用,通過事件源觸發函式,環節多,鏈路長,能不能在本地快速測驗整個鏈路?
- ……
業界的調研報告(hacknoon serverless report)也體現除錯是 Serverless 落地最大的障礙, 目前業界已有的 Serverless 應用除錯手段,主要是在本地模擬云端執行環境進行本地除錯;而遠端環境中運行的應用則主要靠日志,由于在本地無法模擬真實的云端環境,因此本地除錯無法解決上述問題,為此我們推出了業界創新的端云聯調功能,解決 Serverless 應用除錯的難題,
端云聯調
Serverless Devs 的端云聯調功能,核心思路是要讓本地開發環境突破網路的限制,和云端環境融為一體,開發者通過端云聯調能在本地啟動實體,和云端環境無縫連通,快速進行測驗和問題除錯,端云聯調能幫助開發者:
- 變更代碼,實時查看結果,除錯迭代的倍訓最短,例如要開發的服務被其他服務依賴,當本地代碼開發完成后,最好能發起端對端的測驗,看看改動有沒有 break 呼叫方服務,如果采用傳統方式,需要把代碼部署到遠端,發起測驗才可以,流程很冗長,
- 能夠復用本地豐富的開發除錯工具,效率最高,例如調查遠端環境中的測驗用例失敗,以往只能靠日志,如果能把生產流量匯入到本地環境的實體上,使用本地環境上各種 IDE 進行除錯,是不是很爽?
如下圖所示,端云聯調在本地開發機和云端應用的 VPC 環境間建立一條安全的隧道連接,訪問云端應用的流量將自動轉發到本地開發機上;同時本地實體對外訪問的網路流量也被自動轉發到云端應用的 VPC 環境中,比如在本地實體訪問云端的 RDS 資料庫實體,傳統方式開發者如果在本地進行除錯開發的話, 只能放開 RDS 實體的公網訪問或者購買 VPN 服務實作本地訪問線上 VPC,而使用端云聯調,不需要任何配置的改變,可以直接以內網的方式訪問 RDS 實體,
?

?
開啟端云聯調
?
用戶只要在 s.yaml 的目錄下, 執行 s proxied setup, 這個命令做了如下事情:
- 根據您 s.yaml 的 vpc 配置等資訊創建一個輔助的 Service/Function, 并對輔助函式預留1個實體,該輔助函式的作用是作為代理服務,本地實體所有進出流量都會通過該代理服務,
- 啟動本地環境的代理容器實體, 通過通道服務, 和 1 中的 FC 網路代理容器實體建立一條雙向通信 TCP 隧道,
- 啟動本地的函式容器實體, 比如您是 Custom Runtime 直接跑 SpringBoot 應用, 啟動 SpringBoot 的本地函式容器實體和 2 中的代理容器實體共享網路, springboot 應用已經能內網訪問線上 VPC 資源,
- 本地函式容器實體啟動成功, 即可以開始除錯,直接使用 s proxied invoke 或者 curl 自定義域名呼叫輔助的 Service/Function, 流量會通過代理服務打回到本地函式容器實體, 開啟本地 IDE 對實體內的應用進行斷點除錯,
關閉端云聯調
?
因為會有一個輔助函式預留1個實體, 所以除錯結束后, 您可以手動清理資源, 以免產生不必要的費用
- 在開啟端云聯調的終端, 直接 CTRL + C 中斷
- 或者在另外一個終端,在相同的目錄下執行 s proxied cleanup
使用上面 1 或者 2 其中一個方法即可, 如果您不放心, 可以多次執行 s proxied cleanup
即使您忘記清理, 如果本地開發機關機或者斷網, 通道 session 會自動關閉, 預留的資源也會自動清理,
實戰場景舉例
以阿里云函式計算一個真實的企業客戶為例:小王是一個業務驅動型的公司的開發, 公司為了提高業務迭代效率, 技術架構向全面云原生化演進, 減少基本設施的管理和運維, 架構大致如下:
?

小王將迭代最頻繁的對外的前后端分離的專案都一鍵遷移到函式計算的 Custom Runtime,在其中 SpringBoot 的專案需要能使用各種 VPC 內網地址訪問下游服務(比如注冊中心或者其他微服務介面), 這個時候Serverless Devs 提供的端云聯調 就可以派上用場了, 只需要在 s.yaml (s.yaml 中定義了函式的 VPC 配置) 所在目錄下執行:
?
$ s proxied setup
?
該命令會和云端 VPC 環境建立安全的網路通道,并在本地啟動應用實體,此時本地實體可以無縫訪問云端 VPC 環境內的資源,比如使用內網地址訪問注冊中心、RDS、 Kafka 等,這意味著您的應用配置不需要任何改變,就可以在本地和云端環境內的資源互動,
?
與此同時,直接使用這個SpringBoot后端專案對應在函式計算 FC 上的自定義域名,流量將被路由到本地應用實體上,比如,您的前端專案部署到 FC 的函式名字是 frontend, 對應的自定義域名是 frontend.abc.com,前端依賴的后端服務部署在 FC 上的函式名字是 backend,對應的自定義域名是 backend.abc.com,這個時候,您直接瀏覽器打開 fronted.abc.com,進行有后端請求的操作,流量就自動從線上路由到本地的 SpringBoot 實體,同時 SpringBoot 的日志在終端實時顯示,甚至您也可以使用斷點除錯來自線上的流量,
假設本地啟動 SpringBoot 后端專案的實體失敗,可能的原因包括函式計算的 VPC 配置不對, 對應的下游服務有白名單限制等等,此時您在本地就可以重現和云端環境實體相同的啟動程序,這對排查實體啟動方面的問題極其有幫助,如下圖所示:

我們從本地實體的啟動程序資訊就可以明確定位到原因是 Nacos 訪問不通,我們需要查看函式是否正確配置了 Nacos 所在的 VPC 資訊,或者 Nacos 是否有白名單限制等等,
總結
最后我們簡單用一張表格總結本地除錯和端云聯調的差異:

?
Serverless 作為云計算下一年十年默認的計算范式, 目前除錯在 Serverless 最大的挑戰之一, 相比其他友商只提供本地除錯的能力,阿里云函式計算創新性地提出了端云聯調, 并通過工具實作了很好的開發者體驗, 大大提升了Serverless 應用的開發者的開發效率和幸福感, 人生苦短, 我用 Serverless!
參考
- hacknoon serverless report
- Serverless Devs
- Spring Boot Serverless 實戰 | Serverless 應用的監控與除錯
更多內容關注 Serverless 微信公眾號(ID:serverlessdevs),匯集 Serverless 技術最全內容,定期舉辦 Serverless 活動、直播,用戶最佳實踐,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423584.html
標籤:其他
下一篇:正則運算式 - 密碼格式驗證大全
