昨天,棧長應騰訊云小伙伴邀請參加了Techo Day 技術開放日的線上活動,這一期的主題是”輕量級云開發(fā)與云應用“,包括輕量級應用服務器、容器和中間件、云開發(fā)、微服務、大數(shù)據(jù)、安全等領域的應用和原理等。
這其中有一項技術講解——Serverless讓我感觸比較深。這門課打破了我對軟件開發(fā)領域的定義。
在現(xiàn)代越來越強大的云計算加持下,我們大量運用了一些云組件,比如:
- IaaS(基礎設施即服務)
- PaaS(平臺即服務)
- SaaS(軟件即服務)
沒錯,即使云服務應用再多,我們也僅限在 “SaaS(軟件即服務)” 層面的應用。
但這門課程提到的,是傳統(tǒng)的 “SaaS(軟件即服務)” 不再是顆粒度最小的云服務器了,取而代之的是,你可以理解為 “方法級別” 的云服務,即可以以方法作為獨立載體被部署在云上,顆粒度更小、靈活性更強,可以獲得盡可能大的彈性。
大部分人看到 Serverless 仍是一知半解,所以我想有必要給大家做個專題分享,包括 Serverless 的正確理解及實現(xiàn)方案,以及騰訊云的 Serverless 是如何應用的。
Serverless 到底是什么?
Serverless 介紹
現(xiàn)在 Serverless 很火啊,到處都是人,包括 Spring 都已經(jīng)支持 Serverless 適配了,棧長當初看到這個名詞的時候以為是指 “無服務器”,相信很多人也會這樣以為,不過不要理解錯了,棧長在這里掃個盲。
Serverless 是指 “無服務器架構”,這里的 “無服務器” 并不是指程序不需要服務器運行,而是指我們的開發(fā)工作不需要關注服務器底層的資源,比如我們部署應用時,經(jīng)常遇到以下一些服務器及基礎設施的相關工作:
- 應用需要用多少臺服務器?
- 應用需要用多少帶寬?
- 應用需要用什么操作系統(tǒng)?
- 應用需要運行多少個實例?
- 應用需要用到什么容器,怎么調度?
- 等等……
這些工作在傳統(tǒng)的業(yè)務中需要運維人員和開發(fā)人員一起協(xié)調完成,而 Serverless 的到來,我們通通都不用管了,Serverless 幫我們去完成這些,程序員只需要關注業(yè)務邏輯本身即可。
來看 Spring Serverless 第一張圖就明白了:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
Serverless 只需要關注一件事:函數(shù)!!
這里的 FaaS 就是 Serverless 最基本的一種表現(xiàn)形式。
Serverless 優(yōu)勢
Serverless 具有資源編排、自動伸縮、事件驅動等能力,覆蓋編碼-調試-測試-部署等全生命周期,減少維護基礎設施的成本和風險,利用云的能力可以更迅速的擴展。
我們來看下面這張圖:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
我們可以看到,Serverless 始終能滿足日益增長的需求,并能對資源做到靈活動態(tài)調整,一方面能在閑時減少資源以避免浪費,另一方面,即使流量溢出也能應對。
這里總結下 Serverless 的優(yōu)勢:
高可用: 如多活、容災、擴容、備份等能力,這些都不在話下;
高彈性: 以方法為部署載體,比微服務更微,獲得極致彈性;
輕運維: 免去大量的運維工作,專注核心開發(fā)業(yè)務,大大節(jié)省工作量;
等等……
Serverless 實現(xiàn)方案
Serverless 經(jīng)常不會單獨出現(xiàn),還有以下兩個衍生概念,也是目前最常見的 Serverless 實現(xiàn)方案:
FaaS(函數(shù)即服務) + BaaS(后端即服務)
Function as a Service (FaaS)
Function as a Service(FaaS)函數(shù)即服務,這也是 Serverless 的基石,它是比 SaaS(軟件即服務)/ BaaS(后端即服務) 更小的載體,每一個函數(shù)就是一個服務,函數(shù)之間相互獨立。
我們來看一張基于 FaaS 的架構圖:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
基于 FaaS 服務器底層的關系從下到上依次是這樣的:
物理服務器(IaaS) > 虛擬機(PaaS) > 容器(PaaS) > 函數(shù)(FaaS)
函數(shù)(也可以說方法)顆粒度更小,可以幫助應用獲得極致彈性。
Backend as Service(BaaS)
Backend as a Service(Baas)后端即服務,即為應用提供后端云服務,可以理解為 PaaS 和 SaaS 之間的一種服務,它也是 Serverless 架構中的一種表現(xiàn)形式,大量開箱即用的后端云上功能提升研發(fā)效能。
后端服務 BaaS 并不是必須的,F(xiàn)aaS 和 BaaS 都屬于 Serverless 架構不同的表現(xiàn)形式,也可以說是 FaaS 和 BaaS 是 Serverless 架構,它們是相輔相成的。
騰訊云 Serverless
基本介紹
騰訊云中的 Serverless 是指 Serverless Cloud Function,簡稱:SCF,也可以叫 “云函數(shù)”,是騰訊云提供的 Serverless 服務,騰訊云用戶無需購買云服務器和虛擬機,代碼即可在騰訊云基礎設施上彈性、安全地運行,支持所有主流的編程語言。
官方文檔:
https://cloud.tencent.com/document/product/583
騰訊云函數(shù)的魅力如下:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
棧長了解到的情況如下:
- 按量付費: 沒有用戶訪問時不花錢,可節(jié)約服務器開銷 30%;
- 超低運維成本: 無需學習服務器知識,大幅度降低運維成本;
- 彈性伸縮: 自動彈性伸縮,上不封頂,下可到 0;
- 超高并發(fā): 每秒最高支持 10 萬并發(fā)請求數(shù);
整個請求邏輯如下:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
雖然我們只需要寫云函數(shù),但前面會有一道 API 網(wǎng)關,是云函數(shù)的主要入口,它提供 HTTP 接口、參數(shù)校驗、鑒權、限流、自定義域名、自動化文檔等功能,這也是對云函數(shù)的強大支撐。
解決方案
通用解決方案
結合 API 網(wǎng)關,騰訊云函數(shù)提供基于小程序,H5,WEB 服務,微服務,REST API 等通用 HTTP 解決方案:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
云函數(shù)無處不在,支持常用的、主流的客戶端載體,現(xiàn)在都支持上了云函數(shù)。
這也讓我聯(lián)想到的一個云函數(shù)的優(yōu)勢:
比如我們寫個 JavaScript 函數(shù)部署到了云端,然后客戶端再調用該云函數(shù),而不是像傳統(tǒng)軟件開發(fā)將函數(shù)直接內嵌在客戶端代碼中,這樣在安全方面也能杜絕前端代碼被破譯的可能。
所以,用上云函數(shù)真香!
Serverless 應用中心:
https://cloud.tencent.com/product/sls
彈性微服務 TEM
隨著團隊和業(yè)務規(guī)模的發(fā)展,后端服務逐漸從單體架構演變成微服務架構,微服務架構提供敏捷開發(fā)、靈活部署和高擴展性的同時,也增加了服務治理和運維的復雜度,提高了技術門檻。
彈性微服務(Tencent Cloud Elastic Microservice,TEM)是面向微服務應用的 Serverless 平臺,實現(xiàn) Serverless 與微服務的完美結合,提供開箱即用的微服務解決方案,提供應用托管、服務注冊發(fā)現(xiàn)、微服務治理、多維度監(jiān)控等能力,支持 Zookeeper、Nacos、Consul 等注冊中心。
產(chǎn)品地址:
https://cloud.tencent.com/product/tem
我們來看官網(wǎng)的架構圖:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
通過它我們可以快速構建微服務應用,只需要實現(xiàn)我們自己的微服務即可(灰色區(qū)域),這樣就能大幅提升運維效率,降低服務治理的復雜度與技術門檻,有更多的時間去聚焦核心業(yè)務本身。
騰訊云函數(shù)初體驗
棧長也第一時間拿到了騰訊云小伙伴給我的實驗資格,終于體驗了一把 Serverless 的魅力!
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
安裝 TCCLI
TCCLI 是管理騰訊云資源的統(tǒng)一工具,可以快速調用騰訊云 API 來管理您的騰訊云資源。
官方文檔:
https://cloud.tencent.com/document/product/440/6176
需要安裝 Python 環(huán)境和 pip 工具,Python 版本必須為 2.7 及以上版本。
這里我們使用使用yum安裝Python3:
yum install python3 -y
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
安裝 Python3 會同時安裝一些相關的依賴包,比如 pip。
再執(zhí)行下面的命令安裝 TCCLI:
sudo pip3 install tccli
安裝完成之后,執(zhí)行以下命令,檢測是否安裝成功:
tccli –version
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
TCCLI 安裝成功了。
啟用命令自動補全
TCCLI 提供了一個自動補全的功能,可以使用下面的命令進行啟用:
echo “$(which tccli_completer)” && complete -C “$(which tccli_completer)” tccli
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
開通云函數(shù)
點擊登錄騰訊云控制臺,開通云函數(shù)服務:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
完成以后,自動進入概覽控制面板,這里可以看到各種 SCF 應用的調用統(tǒng)計信息:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
配置 TCCLI
首先要獲取訪問密鑰,訪問密鑰是構建騰訊云 API 請求的重要憑證,調用任何一個騰訊云 API 都需要提供訪問密鑰,一對完整的訪問密鑰包括 SecretId 和 SecretKey 兩部分。
進入訪問管理控制臺,找到【訪問密鑰】- 【API密鑰管理】,并在其中新建一個訪問密鑰:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
再進行 TCCLI 初始化配置,使其完成使用云 API 的必要前提條件:
tccli configure
進入交互模式,TCCLI 會要求提供 SecretId 和 SecretKey 等信息,配置完成后,可測試下使用 CLI 拉取云主機列表:
tccli cvm DescribeInstances
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
OK,配置成功了。
創(chuàng)建云函數(shù)
下面我們來創(chuàng)建一個無服務器云函數(shù),并且調用它。
mkdir -p /data/hello && touch /data/hello/hello.py
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
這里實驗默認用的是 Python,云函數(shù)支持所有主流編程語言。
部署云函數(shù)
現(xiàn)在開始部署上面的云函數(shù):
tccli scf CreateFunction –FunctionName “hello” –Code ‘{“ZipFile”:”‘$(cd /data/hello && zip -r – * | base64 | tr -d “”)'”}’ –Handler “hello.main_handler” –Description “My first scf”
部署成功后,會有 Success 的返回。
管理云函數(shù)
再次進入控制臺,可以看到剛部署好的云函數(shù):
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
點擊該函數(shù)進入函數(shù)管理頁面:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
其實在這個控制臺頁面也可以新建、編輯、上傳、部署云函數(shù)。
測試云函數(shù)
新建一個測試模板發(fā)起測試:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
點擊測試按鈕:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
成功返回了,日志也輸出了,到這里我就全程體驗了一把云函數(shù)。
回到實驗頁面,退出實驗。
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
騰訊云函數(shù)再體驗(Java)
創(chuàng)建云函數(shù)
實驗默認使用的是 Python,并且會要安裝、配置很多東西,那是實驗臺,而在真實控制臺是不需要這么麻煩的流程的,我們到控制臺來創(chuàng)建一個 Java 云函數(shù)試試。
在函數(shù)服務中點擊新建按鈕,官方有很多內置的 Java 云函數(shù)模板,我們選擇一個 Java 8 相關的模板進行快速創(chuàng)建,當然也可以從 0 開始。
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
創(chuàng)建成功了。
部署云函數(shù)
現(xiàn)在進去部署吧:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
下載示例代碼,然后上傳部署即可。
Java 云函數(shù)的核心代碼其實就是一個基于 Spring Boot 的接口:
@RestController@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @GetMapping(“/hello”) public String hello(@RequestParam(value = “name”, defaultValue = “World”) String name) { return String.format(“Hello %s!”, name); }}
測試云函數(shù)
部署成功后,現(xiàn)在發(fā)起測試:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
Java 云函數(shù)也成功了!
云函數(shù)的魅力
棧長體驗了兩把云函數(shù),最大的感受就是不需要自己運維服務器了,包括環(huán)境配置、JDK 安裝配置、權限、開放端口、日志、網(wǎng)絡等設置全都內置或者有自定義配置。
下面我們來看幾個配置頁面。
各種函數(shù)的配置管理:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
流量設置,可以做灰度發(fā)布:
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
并發(fā)配額,可以設置函數(shù)獨占配額、函數(shù)預置并發(fā)數(shù):
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
實操教學 用Serverless 分分鐘部署一個 Spring Boot 應用,真香!
還有更多配置,這里就不一一介紹了。
總結
看到這里,想必大家對 Serverless 有了一定程序的認識了,總之,程序員要做的只是上傳函數(shù)代碼而已,其他一切底層資源都可以在云上管理,并且是函數(shù)級別的資源管理,再結合騰訊云的各種云能力,簡直不要太香了。
當然,這也會產(chǎn)生一定的費用,但都是按量付費的,并且可以按需要自動彈性調整,肯定要比自己全套搞要劃算,畢竟連運維和服務器都省了,最重要的是省心、省時間。
>來源公眾號:Java技術棧