Serverless架構的編程學習小工具有哪些

本篇文章為大家展示了Serverless架構的編程學習小工具有哪些,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

成都創新互聯主營朗縣網站建設的網絡公司,主營網站建設方案,成都APP應用開發,朗縣h5重慶小程序開發搭建,朗縣網站營銷推廣歡迎朗縣等地區企業咨詢

之前我做過一個在線編程的軟件,目前用戶量大概有幾十萬,通過這個 App 不僅僅可以進行代碼的編寫、運行還可以進行編程的學習。自己一直對 Serverless 架構情有獨鐘,恰好趕到我的這個 App 學習板塊被很多人吐槽難用,索性就對這個學習板塊進行重構,并且打算在重構的時候,直接將這個學習板塊搬上 Serverless 架構。

基于 Serverless 架構重構是出于兩個方面考慮 —— 一是 Serverless 架構能讓個人開發者的運維工作變得簡單,尤其是不用操心服務器,也不用關心流量洪峰(當然,對于我的個人項目而言,也沒太多的洪峰),二是 Serverless 架構的按量付費,極大節約了成本。

整體設計

數據庫設計

這個部分在之前是若干個大模塊,現在統一整理到一個模塊中進行項目重構,所以這里繼續復用之前的數據庫:

Serverless架構的編程學習小工具有哪些

在這個數據庫中,四個模塊分別是:新聞文章、開發文檔、基礎教程以及圖書資源。其中開發文檔包括大分類,子列表以及正文等內容,這里表關聯并沒有使用外鍵,而是直接用的 ID 進行表之間的關聯。

說實話,這個數據庫設計的并不是很好,原因是因為初次構建這個數據部分,絕大部分數據都是在其他站點采集而來,當時由于模塊快速上線,便直接按照原有格式存儲,所以可以認為這個數據庫中有很多表的字段其實是無效的,或者針對這個項目是未被使用的。

后端設計

后端將會整體部署到一個函數上,功能整體結構:

Serverless架構的編程學習小工具有哪些

整體功能就是云函數 SCF 綁定 API 網關觸發器,用戶訪問 API 網關指定的地址,觸發云函數,然后函數在入口處進行功能拆分,請求不同的方法獲得對應的數據。

這里要額外說明一下,后端整體接口部署在一個函數的原因,是因為我這個模塊的使用量并不是非常頻繁,所以部署到一個函數上也不會出現超過最大實例的限制,如果超出限制是可以申請擴容的;

其次,所有的接口都是對數據庫增刪改查,放入到一個函數中,在一定程度上可以保證容器的活性,降低部分冷啟動帶來的問題,同時容器的復用,也可以在一定程度上降低后臺數據庫鏈接池的壓力;除此之外,所有的接口功能,都是只需要最少的內存(64M)即可完整運行,不會因為個別接口的預估內存較大,進而影響影響整體的成本。

所以這里評估之后,是可以將多個接口,放入到一個函數中,對外提供對應的服務。

前端設計

前端設計,預計在學習資源部分需要有 8 個頁面,主要就是科技類新聞、教程、文檔、圖書等相關功能,通過墨刀繪制的原型圖如下:

Serverless架構的編程學習小工具有哪些

前端項目開發將會采用 Vue.js,并且將其部署到對象存儲中,通過騰訊云對象存儲的靜態網站功能對外提供服務。

項目開發

后端函數開發

后端函數開發主要包括三部分

  • 部分資源的初始化,部分資源初始化,需要在函數外進行,這樣可以保證復用實例的時候不會再次建立鏈接,防止數據庫連接池出現問題:

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")
  • 數據庫查詢操作

這一部分主要就是針對不同接口查詢數據庫,例如獲取文章分類:

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
  • 最后一部分就是函數的入口,函數入口部分就是做功能分發和接口識別:

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}

函數部分完成之后,可以配置 API 網關部分:

Serverless架構的編程學習小工具有哪些

在整個后端接口開發過程中,其實并沒有遇到什么太大的問題,因為這個學習功能的模塊基本上就是對數據庫進行查詢的操作,所以相對來說非常順利。

效果預覽

整體預覽結果:一共包括十幾個頁面,這里取其中8個主要的頁面進行效果展示:

Serverless架構的編程學習小工具有哪些

整個頁面基本上是還原了設計稿的樣子,并且和原有項目進行了部分的整合,無論是列表頁面還是圖書頁面等,數據加載速度表現良好。

通過 PostMan 進行基本測試:

Serverless架構的編程學習小工具有哪些

對接口進行 1000 次訪問測試:

Serverless架構的編程學習小工具有哪些

可以看到,接口表現良好,并未出現失敗的情況,對該測試結果進行耗時的可視化:

Serverless架構的編程學習小工具有哪些

其中最大的時間消耗是 219 毫秒,最小是 27 毫秒,平均值 35 毫秒,可以看到整體的效果還是非常不錯。

這樣一個項目開發完成,上線之后,前端部分被放到對象存儲 COS 中,后端業務被放到云函數 SCF 中,觸發器使用的是 API 網關,在監控層面,函數計算有著比較不錯的監控緯度:

Serverless架構的編程學習小工具有哪些

同時函數并發,彈性伸縮等問題都由云廠商來解決,可以這樣說,自從這個組件部署到了 Serverless 架構上,我所做的操作就是如果業務代碼有問題,進行簡單修復和簡單維護。講真,整個效果還是不錯的。

通過按量付費,可以看到我后端服務產生的費用:

Serverless架構的編程學習小工具有哪些

由于云函數沒辦法看到單個資源的費用,所以整個函數我有幾十個,一共花費的費用也遠遠比服務器的一個月便宜很多。

當然雖然說在計算服務這里整體費用只有幾元錢相對來說非常便宜,但是其還有 API 網關的費用和對象存儲的費用,例如 API 網關費用:

Serverless架構的編程學習小工具有哪些

同樣,我這里的 API 網關也是有很多服務的,不僅僅是 Anycodes 這樣一個服務產生的,但是整體加一起 2 月份只有 1 元錢,相對來說也是蠻低的。

總結

通過個人項目中的一個子模塊重構過程,將該項目部署到 Serverless 架構上:

  • 在開發過程中,我覺得是蠻方便的,一方面自己不需要在服務器中安裝各類軟件,也不需要搭建 web 服務,不需要對 web 服務進行優化,做的只是讀取數據庫,按照一定的格式進行 return,至于 web 服務等相關模塊交給 API 網關來實現,整個一個后端開發大概耗時大約是一個多小時;前端開發是比較耗時的,因為我個人不是專業做前端的,所以無論是布局還是邏輯開發,都是有點障礙的,但是也只用了 2 天時間;所以這個模塊從開發到上線只用了 2 天時間;

  • 項目在部署的時候非常流暢,基于 Serverless Framework 的開發者工具一鍵部署,后期更新維護,只需要重新部署即可,線上也是無縫切換,不會出現更新服務造成的服務中斷,也不用為更新服務可能造成服務中斷而做額外的操作,整體后期更新過程快速且簡單易用;

  • 資源消耗部分就是使用按量付費,通過一個月的觀察,整個資源消耗是蠻低的,整體性能保證的同時,成本也逐漸的被壓低,對于個人開發者來說,確實是一個福音。

通過這樣一個簡單上 Serverless 架構的過程,也讓我對 Serverless 架構有了更深入的了解和認識,作為一種新技術或者說新的架構,Serverless 的成長還需要一段時間。但是我相信,他的成長,會很快速。

上述內容就是Serverless架構的編程學習小工具有哪些,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創新互聯行業資訊頻道。

當前文章:Serverless架構的編程學習小工具有哪些
文章起源:http://m.kartarina.com/article36/jeohpg.html

成都網站建設公司_創新互聯,為您提供軟件開發云服務器自適應網站營銷型網站建設網站導航品牌網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管
主站蜘蛛池模板: 免费无码作爱视频| 无码中文在线二区免费| 伊人蕉久中文字幕无码专区| 毛片亚洲AV无码精品国产午夜| 国产精品亚洲а∨无码播放不卡 | 久久久久琪琪去精品色无码| 久久国产精品无码HDAV| 无码日韩精品一区二区人妻 | 无码毛片AAA在线| 中文字幕人妻三级中文无码视频| 日韩AV无码久久一区二区| 成年轻人电影www无码| 亚洲AV成人无码久久精品老人 | 熟妇人妻中文av无码| 亚洲a∨无码男人的天堂| 丝袜无码一区二区三区| 精品一区二区三区无码免费直播| 亚洲日韩乱码中文无码蜜桃| 亚洲精品无码久久久久| HEYZO无码综合国产精品227| 中文字幕日产无码| 人妻丰满av无码中文字幕| 国产成人精品无码播放| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 亚洲精品中文字幕无码AV| 免费无码H肉动漫在线观看麻豆 | 亚洲AV综合色区无码一区| 无码日韩精品一区二区人妻 | 久久久久亚洲AV无码专区网站| 无码Aⅴ在线观看| 国产AV无码专区亚洲AV麻豆丫| 亚洲人av高清无码| 亚洲av日韩av无码av| 亚洲一区二区三区无码国产| 无码福利写真片视频在线播放| 精品人妻无码区二区三区| 97久久精品无码一区二区| 亚洲AV永久无码精品一福利| 亚洲中文字幕无码亚洲成A人片| 亚洲综合无码一区二区痴汉| 免费无码又爽又刺激高潮的视频|