本篇文章為大家展示了Serverless架構(gòu)的編程學(xué)習(xí)小工具有哪些,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
成都創(chuàng)新互聯(lián)主營(yíng)朗縣網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都APP應(yīng)用開發(fā),朗縣h5重慶小程序開發(fā)搭建,朗縣網(wǎng)站營(yíng)銷推廣歡迎朗縣等地區(qū)企業(yè)咨詢
之前我做過一個(gè)在線編程的軟件,目前用戶量大概有幾十萬,通過這個(gè) App 不僅僅可以進(jìn)行代碼的編寫、運(yùn)行還可以進(jìn)行編程的學(xué)習(xí)。自己一直對(duì) Serverless 架構(gòu)情有獨(dú)鐘,恰好趕到我的這個(gè) App 學(xué)習(xí)板塊被很多人吐槽難用,索性就對(duì)這個(gè)學(xué)習(xí)板塊進(jìn)行重構(gòu),并且打算在重構(gòu)的時(shí)候,直接將這個(gè)學(xué)習(xí)板塊搬上 Serverless 架構(gòu)。
基于 Serverless 架構(gòu)重構(gòu)是出于兩個(gè)方面考慮 —— 一是 Serverless 架構(gòu)能讓個(gè)人開發(fā)者的運(yùn)維工作變得簡(jiǎn)單,尤其是不用操心服務(wù)器,也不用關(guān)心流量洪峰(當(dāng)然,對(duì)于我的個(gè)人項(xiàng)目而言,也沒太多的洪峰),二是 Serverless 架構(gòu)的按量付費(fèi),極大節(jié)約了成本。
這個(gè)部分在之前是若干個(gè)大模塊,現(xiàn)在統(tǒng)一整理到一個(gè)模塊中進(jìn)行項(xiàng)目重構(gòu),所以這里繼續(xù)復(fù)用之前的數(shù)據(jù)庫:
在這個(gè)數(shù)據(jù)庫中,四個(gè)模塊分別是:新聞文章、開發(fā)文檔、基礎(chǔ)教程以及圖書資源。其中開發(fā)文檔包括大分類,子列表以及正文等內(nèi)容,這里表關(guān)聯(lián)并沒有使用外鍵,而是直接用的 ID 進(jìn)行表之間的關(guān)聯(lián)。
說實(shí)話,這個(gè)數(shù)據(jù)庫設(shè)計(jì)的并不是很好,原因是因?yàn)槌醮螛?gòu)建這個(gè)數(shù)據(jù)部分,絕大部分?jǐn)?shù)據(jù)都是在其他站點(diǎn)采集而來,當(dāng)時(shí)由于模塊快速上線,便直接按照原有格式存儲(chǔ),所以可以認(rèn)為這個(gè)數(shù)據(jù)庫中有很多表的字段其實(shí)是無效的,或者針對(duì)這個(gè)項(xiàng)目是未被使用的。
后端將會(huì)整體部署到一個(gè)函數(shù)上,功能整體結(jié)構(gòu):
整體功能就是云函數(shù) SCF 綁定 API 網(wǎng)關(guān)觸發(fā)器,用戶訪問 API 網(wǎng)關(guān)指定的地址,觸發(fā)云函數(shù),然后函數(shù)在入口處進(jìn)行功能拆分,請(qǐng)求不同的方法獲得對(duì)應(yīng)的數(shù)據(jù)。
這里要額外說明一下,后端整體接口部署在一個(gè)函數(shù)的原因,是因?yàn)槲疫@個(gè)模塊的使用量并不是非常頻繁,所以部署到一個(gè)函數(shù)上也不會(huì)出現(xiàn)超過最大實(shí)例的限制,如果超出限制是可以申請(qǐng)擴(kuò)容的;
其次,所有的接口都是對(duì)數(shù)據(jù)庫增刪改查,放入到一個(gè)函數(shù)中,在一定程度上可以保證容器的活性,降低部分冷啟動(dòng)帶來的問題,同時(shí)容器的復(fù)用,也可以在一定程度上降低后臺(tái)數(shù)據(jù)庫鏈接池的壓力;除此之外,所有的接口功能,都是只需要最少的內(nèi)存(64M)即可完整運(yùn)行,不會(huì)因?yàn)閭€(gè)別接口的預(yù)估內(nèi)存較大,進(jìn)而影響影響整體的成本。
所以這里評(píng)估之后,是可以將多個(gè)接口,放入到一個(gè)函數(shù)中,對(duì)外提供對(duì)應(yīng)的服務(wù)。
前端設(shè)計(jì),預(yù)計(jì)在學(xué)習(xí)資源部分需要有 8 個(gè)頁面,主要就是科技類新聞、教程、文檔、圖書等相關(guān)功能,通過墨刀繪制的原型圖如下:
前端項(xiàng)目開發(fā)將會(huì)采用 Vue.js,并且將其部署到對(duì)象存儲(chǔ)中,通過騰訊云對(duì)象存儲(chǔ)的靜態(tài)網(wǎng)站功能對(duì)外提供服務(wù)。
后端函數(shù)開發(fā)主要包括三部分
部分資源的初始化,部分資源初始化,需要在函數(shù)外進(jìn)行,這樣可以保證復(fù)用實(shí)例的時(shí)候不會(huì)再次建立鏈接,防止數(shù)據(jù)庫連接池出現(xiàn)問題:
def getConnection(dbName): conn = pyMySQL.connect(host="", user="root", password="", port=3306, db=dbName, charset='utf8', cursorclass=pymysql.cursors.DictCursor, ) conn.autocommit(1) return conn connectionArticle = getConnection("anycodes_article")
數(shù)據(jù)庫查詢操作
這一部分主要就是針對(duì)不同接口查詢數(shù)據(jù)庫,例如獲取文章分類:
def getArticleCategory(): connectionArticle.ping(reconnect=True) cursor = connectionArticle.cursor() search_stmt = ('SELECT * FROM `category` ORDER BY `sort`') cursor.execute(search_stmt, ()) data = cursor.fetchall() cursor.close() result = {} for eve_data in data: if eve_data['pre_name'] not in result: result[eve_data['pre_name']] = [] result[eve_data['pre_name']].append({ "id": eve_data["sort"], "name": eve_data["name"] }) return result
例如獲取文章列表:
def getArticleList(cid): connectionArticle.ping(reconnect=True) cursor = connectionArticle.cursor() search_stmt = ('SELECT * FROM `article` WHERE `category` = %s ORDER BY `sort`') cursor.execute(search_stmt, (cid,)) data = cursor.fetchall() cursor.close() result = [{ "id": eve_data["aid"], "title": eve_data["title"] } for eve_data in data] return result
最后一部分就是函數(shù)的入口,函數(shù)入口部分就是做功能分發(fā)和接口識(shí)別:
def main_handler(event, context): try: result_data = { "error": False } req_type = event["pathParameters"]["type"] if req_type == "get_book_list": result_data["data"] = getBookList() elif req_type == "get_book_info": result_data["data"] = getBookContent(event["queryString"]["id"]) elif req_type == "get_daily_content": result_data["data"] = getDailyContent(event["queryString"]["id"]) elif req_type == "get_daily_list": result_data["data"] = getDailyList(event["queryString"]["category"]) elif req_type == "get_dictionary_result": result_data["data"] = getDictionaryResult(event["queryString"]["word"]) elif req_type == "get_dev_content": result_data["data"] = getDevContent(event["queryString"]["id"]) elif req_type == "get_dev_section": result_data["data"] = getDevSection(event["queryString"]["id"]) elif req_type == "get_dev_chapter": result_data["data"] = getDevChapter(event["queryString"]["id"]) elif req_type == "get_dev_list": result_data["data"] = getDevList() elif req_type == "get_article_content": result_data["data"] = getArticle(event["queryString"]["id"]) elif req_type == "get_article_list": result_data["data"] = getArticleList(event["queryString"]["id"]) elif req_type == "get_article_category": result_data["data"] = getArticleCategory() return result_data except Exception as e: print(e) return {"error": True}
函數(shù)部分完成之后,可以配置 API 網(wǎng)關(guān)部分:
在整個(gè)后端接口開發(fā)過程中,其實(shí)并沒有遇到什么太大的問題,因?yàn)檫@個(gè)學(xué)習(xí)功能的模塊基本上就是對(duì)數(shù)據(jù)庫進(jìn)行查詢的操作,所以相對(duì)來說非常順利。
整體預(yù)覽結(jié)果:一共包括十幾個(gè)頁面,這里取其中8個(gè)主要的頁面進(jìn)行效果展示:
整個(gè)頁面基本上是還原了設(shè)計(jì)稿的樣子,并且和原有項(xiàng)目進(jìn)行了部分的整合,無論是列表頁面還是圖書頁面等,數(shù)據(jù)加載速度表現(xiàn)良好。
通過 PostMan 進(jìn)行基本測(cè)試:
對(duì)接口進(jìn)行 1000 次訪問測(cè)試:
可以看到,接口表現(xiàn)良好,并未出現(xiàn)失敗的情況,對(duì)該測(cè)試結(jié)果進(jìn)行耗時(shí)的可視化:
其中最大的時(shí)間消耗是 219 毫秒,最小是 27 毫秒,平均值 35 毫秒,可以看到整體的效果還是非常不錯(cuò)。
這樣一個(gè)項(xiàng)目開發(fā)完成,上線之后,前端部分被放到對(duì)象存儲(chǔ) COS 中,后端業(yè)務(wù)被放到云函數(shù) SCF 中,觸發(fā)器使用的是 API 網(wǎng)關(guān),在監(jiān)控層面,函數(shù)計(jì)算有著比較不錯(cuò)的監(jiān)控緯度:
同時(shí)函數(shù)并發(fā),彈性伸縮等問題都由云廠商來解決,可以這樣說,自從這個(gè)組件部署到了 Serverless 架構(gòu)上,我所做的操作就是如果業(yè)務(wù)代碼有問題,進(jìn)行簡(jiǎn)單修復(fù)和簡(jiǎn)單維護(hù)。講真,整個(gè)效果還是不錯(cuò)的。
通過按量付費(fèi),可以看到我后端服務(wù)產(chǎn)生的費(fèi)用:
由于云函數(shù)沒辦法看到單個(gè)資源的費(fèi)用,所以整個(gè)函數(shù)我有幾十個(gè),一共花費(fèi)的費(fèi)用也遠(yuǎn)遠(yuǎn)比服務(wù)器的一個(gè)月便宜很多。
當(dāng)然雖然說在計(jì)算服務(wù)這里整體費(fèi)用只有幾元錢相對(duì)來說非常便宜,但是其還有 API 網(wǎng)關(guān)的費(fèi)用和對(duì)象存儲(chǔ)的費(fèi)用,例如 API 網(wǎng)關(guān)費(fèi)用:
同樣,我這里的 API 網(wǎng)關(guān)也是有很多服務(wù)的,不僅僅是 Anycodes 這樣一個(gè)服務(wù)產(chǎn)生的,但是整體加一起 2 月份只有 1 元錢,相對(duì)來說也是蠻低的。
通過個(gè)人項(xiàng)目中的一個(gè)子模塊重構(gòu)過程,將該項(xiàng)目部署到 Serverless 架構(gòu)上:
在開發(fā)過程中,我覺得是蠻方便的,一方面自己不需要在服務(wù)器中安裝各類軟件,也不需要搭建 web 服務(wù),不需要對(duì) web 服務(wù)進(jìn)行優(yōu)化,做的只是讀取數(shù)據(jù)庫,按照一定的格式進(jìn)行 return,至于 web 服務(wù)等相關(guān)模塊交給 API 網(wǎng)關(guān)來實(shí)現(xiàn),整個(gè)一個(gè)后端開發(fā)大概耗時(shí)大約是一個(gè)多小時(shí);前端開發(fā)是比較耗時(shí)的,因?yàn)槲覀€(gè)人不是專業(yè)做前端的,所以無論是布局還是邏輯開發(fā),都是有點(diǎn)障礙的,但是也只用了 2 天時(shí)間;所以這個(gè)模塊從開發(fā)到上線只用了 2 天時(shí)間;
項(xiàng)目在部署的時(shí)候非常流暢,基于 Serverless Framework 的開發(fā)者工具一鍵部署,后期更新維護(hù),只需要重新部署即可,線上也是無縫切換,不會(huì)出現(xiàn)更新服務(wù)造成的服務(wù)中斷,也不用為更新服務(wù)可能造成服務(wù)中斷而做額外的操作,整體后期更新過程快速且簡(jiǎn)單易用;
資源消耗部分就是使用按量付費(fèi),通過一個(gè)月的觀察,整個(gè)資源消耗是蠻低的,整體性能保證的同時(shí),成本也逐漸的被壓低,對(duì)于個(gè)人開發(fā)者來說,確實(shí)是一個(gè)福音。
通過這樣一個(gè)簡(jiǎn)單上 Serverless 架構(gòu)的過程,也讓我對(duì) Serverless 架構(gòu)有了更深入的了解和認(rèn)識(shí),作為一種新技術(shù)或者說新的架構(gòu),Serverless 的成長(zhǎng)還需要一段時(shí)間。但是我相信,他的成長(zhǎng),會(huì)很快速。
上述內(nèi)容就是Serverless架構(gòu)的編程學(xué)習(xí)小工具有哪些,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。