<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          人人都是 Serverless 架構(gòu)師 | 彈幕應(yīng)用開發(fā)實戰(zhàn)

          共 6097字,需瀏覽 13分鐘

           ·

          2022-01-09 13:42

          作者 | 寒斜阿里云云原生中間件前端負(fù)責(zé)人


          ?

          如何使用 Serverless 架構(gòu)實現(xiàn)全雙工通信的應(yīng)用,Serverless 架構(gòu)中數(shù)據(jù)庫是如何使用的,本篇文章將為您揭開答案。


          Serverless 的理念是即時彈性,用完即走。服務(wù)并非長時間運行,這也就意味著像 websocket 這種長鏈接的請求模式看起來并不適合?Serverless。

          是否有其它的辦法即可以滿足長連接模式請求,又能夠利用?Serverless 本身特性呢?

          答案是肯定的,上一篇文章我們談及了網(wǎng)關(guān)的關(guān)鍵作用,所以這次也是通過網(wǎng)關(guān)來解決全雙工通信的問題。本次將以彈幕場景為例,為大家展開我們是怎么使用?Serverless?架構(gòu)來實現(xiàn)這個場景的。

          應(yīng)用效果預(yù)覽


          彈幕應(yīng)用的實用場景比較多,比如運營推廣,年會活動等。但是通常實現(xiàn)一套帶管控的流程,且部署發(fā)布的話,一般會花費比較長的時間。本篇實戰(zhàn)則可以讓你在 2 分鐘之內(nèi)就部署好自己的彈幕應(yīng)用。同時做到支持炫彩和彈幕內(nèi)容管控,你可以用它來豐富公司年會的形式。文末也會貼上源碼,可以供大家參考和二次定制。


          架構(gòu)一覽


          整體架構(gòu)依然采用 dns 解析 -> 網(wǎng)關(guān) -> oss | fc 。不一樣的是分了 3 個靜態(tài)資源的工程,函數(shù)部分則采用事件驅(qū)動和 http 相結(jié)合,并且 api 部分采用 tablestore 進行數(shù)據(jù)的持久化。


          流程說明


          彈幕應(yīng)用總工由大屏幕, 個人用戶,管理員三個客戶端,以及一個注冊設(shè)備的服務(wù) &?api 服務(wù)組成。客戶端跟服務(wù)端的長鏈接由網(wǎng)關(guān)來承載,每次客戶端連接到網(wǎng)關(guān)的時候,網(wǎng)關(guān)都會存儲設(shè)備編號,并且觸發(fā)一次注冊函數(shù),設(shè)備編號存儲到 tablestore。

          當(dāng)用戶發(fā)起彈幕的時候經(jīng)網(wǎng)關(guān)到 api 服務(wù),api 服務(wù)會做一次查詢先判斷彈幕是否被管制,如果無管制則直接查找當(dāng)前的大屏幕設(shè)備 id,并且進行網(wǎng)關(guān)的下行調(diào)用,網(wǎng)關(guān)在發(fā)到前端頁面,顯示數(shù)據(jù)。如果被管制,則查詢在線的管理員設(shè)備,將彈幕下行通知到網(wǎng)關(guān),網(wǎng)關(guān)發(fā)送給管理員前端頁面。


          數(shù)據(jù)表設(shè)計


          • equipment(設(shè)備)

          字段

          類型

          說明

          id

          string

          設(shè)備表主鍵

          deviceld

          string

          設(shè)備id

          docld

          string

          備用字段

          type

          string

          設(shè)備類型(screen | admin)


          • barrage(彈幕)


          字段

          類型

          說明

          gid

          string

          分區(qū)鍵

          id

          integer

          主鍵自增

          fromId

          string

          彈幕作者id

          fromName

          string

          來源作者名稱

          color

          string

          彈幕顏色

          fontSize

          string

          彈幕字體大小

          checkStatus

          integer

          彈幕狀態(tài)0(未處理)1(審批通過)2(審批未過)

          sendTime

          string

          彈幕發(fā)送時間

          checkTime

          string

          彈幕更新時間

          message

          string

          彈幕內(nèi)容


          • interceptor (過濾器)


          字段

          類型

          說明

          id

          integer

          主鍵/分區(qū)鍵

          status

          integer

          攔截狀態(tài)0不攔截 1攔截 2攔截加過濾

          filterWords

          string

          過濾字段


          1、準(zhǔn)備工作


          同前篇《人人都是 Serverless 架構(gòu)師 | 現(xiàn)代化 Web 應(yīng)用開發(fā)實戰(zhàn)》文章一樣需要提前準(zhǔn)備好域名,并安裝好 Serverless Devs 開發(fā)者工具,以及下面的產(chǎn)品:

          • 云解析 DNS
          • API 網(wǎng)關(guān)
          • 函數(shù)計算
          • 對象存儲 OSS
          • Tablestore

          這次我們引入了 tablestore 的數(shù)據(jù)庫記性數(shù)據(jù)的持久化功能,同樣需要創(chuàng)建好數(shù)據(jù)庫實例備用。


          2、操作步驟


          為了更好的展示效果,本次演示使用?ServerlessDesktop?來給大家演示一下如何 2 分鐘部署一個復(fù)雜的彈幕應(yīng)用。你可以根據(jù)自身需要選擇?Serverless Devs Cli 或者 Serverless Desktop 對彈幕應(yīng)用進行初始化和部署構(gòu)建。


          1)秘鑰配置


          可參考密鑰獲取文檔:
          http://www.serverless-devs.com/zh-cn/docs/provider-config/alibabacloud.html

          2)初始化



          本次初始化除了需要將應(yīng)用模板下載到本地之外,還會幫忙初始化 tablestore 的表和數(shù)據(jù),因此需要預(yù)配置幾個參數(shù):


          • 秘鑰別名 - 對應(yīng)你的阿里云賬號
          • 域名 - 自定義域名
          • bucketName - oss 的 bucket 名稱
          • endpoint - 對應(yīng) tablestore 實例的公網(wǎng)訪問地址
          • instance - 對應(yīng) tablestore 的實例名

          預(yù)配置參數(shù)寫好后點擊 “確定”,接下來的工作就叫給 Serverless Devs,它會幫我們初始化彈幕應(yīng)用的表。

          3)構(gòu)建部署


          初始化之后,我們重新進入配置頁面,對項目進行部署。配置信息 -> 全量操作 -> deploy 點擊后其他的就交給 Serverless Devs了,它會幫助我們完成:

          1. 大屏幕,管理后臺和玩家的前端部署;

          2. 注冊函數(shù)以及 api 函數(shù)的部署

          3. 以及網(wǎng)關(guān)的路由設(shè)置和網(wǎng)關(guān)的域名綁定



          4) 部署效果查看


          • 網(wǎng)關(guān)



          • 函數(shù)計算



          • Oss



          • DNS



          此時訪問?barragego.serverless-developer.com?發(fā)現(xiàn)訪問不同,檢查發(fā)現(xiàn)原因是 apigateway 的域名和 oss 域名都未綁定成功,我們手動處理一下:




          接下來再訪問 barragego.serverless-developer.com 即可看到效果:


          2、數(shù)據(jù)庫明細(xì)


          數(shù)據(jù)庫方面想拿出來說一下,主要本次用的數(shù)據(jù)庫確實比較新,也就是 tablestore。


          1)數(shù)據(jù)庫配置傳遞


          可以看到,我們在初始化應(yīng)用的時候是填寫了數(shù)據(jù)庫的公網(wǎng)訪問地址和實例名稱信息的,初始化的時候會把用戶的輸入配置寫入到 s.yaml 中,這里如果是比較敏感的信息建議從 s.yaml 提取出來放到 .env 環(huán)境中,并且 ignore 掉這個文件,減少數(shù)據(jù)庫信息被泄露到代碼倉庫的風(fēng)險。

          最終 Devs 會把這兩個基本信息放到函數(shù)計算的環(huán)境變量中然后各運行時可以通過環(huán)境變量取到這些值,比如這里是 nodejs 的運行環(huán)境,則通過 process.env.instance 獲取。

          除了實例名稱和公網(wǎng)訪問地址外數(shù)據(jù)庫的初始化還需要 用戶的秘鑰信息。鑒于秘鑰信息的敏感性比較高,不建議直接把秘鑰信息配置到 s.yaml 里,而是通過給函數(shù)服務(wù)授權(quán) tablestore 角色權(quán)限,讓函數(shù)內(nèi)置臨時秘鑰信息。

          • 函數(shù)服務(wù)授權(quán)配置如下:



          • 函數(shù)內(nèi)獲取秘鑰信息如下:



          2)數(shù)據(jù)庫初始化


          為了減少數(shù)據(jù)庫初始化次數(shù),我們可以在函數(shù)的 initializer 方法中初始化,當(dāng)函數(shù)未被釋放的時候可以直接使用數(shù)據(jù)庫的實例而不必重新連接。這樣可以降低請求響應(yīng)時間。單實例多并發(fā)的情況下比較實用。

          exports.initializer = (context, callback) => {  try {    const ak = context.credentials.accessKeyId;    const sk = context.credentials.accessKeySecret;    const stsToken = context.credentials.securityToken;    SAT.init(endpoint, instance, ak, sk, stsToken);    internal = { tableClient: SAT, TableStore };    callback();  } catch (err) {    callback(err.message);  }}

          數(shù)據(jù)庫實例初始化之后,我們通過賦值給全局變量來從其他的方法中取得實例,進行后續(xù)的操作。


          3)CRUD


          tablestore 原生的 api 去做 CRUD 操作用戶體驗不夠友好,tablestore 社區(qū)提供了一個很好的封裝?SAT。我們用它來做基礎(chǔ)的增刪改查會非常的方便,代碼看起來也非常整潔。


          // 單主鍵查詢const getInterceptor = async (ctx) => { const { tableClient } = ctx.req.requestContext.internal; const res = await tableClient.table('interceptor').get(1, cols = []); return res;}
          // 查詢?nèi)?/span>const getAllEquipment = async (tableClient,TableStore) => { const res = await tableClient.table('equipment').getRange(TableStore.INF_MIN, TableStore.INF_MAX, cols = []) return Object.keys(res).map((key)=> res[key]);}// 雙主鍵(一個分區(qū)鍵,一個自增鍵)的插入const addBarrage = async (ctx) => { const { tableClient, TableStore } = ctx.req.requestContext.internal; const { fromId, fromName, color, fontSize = '28px', checkStatus = 0, message } = ctx.request.body; const currentTime = Date.now().toString(); const newData = Object.assign({}, { fromId, fromName, color, fontSize, checkStatus: parseInt(checkStatus), message }, { sendTime: currentTime, checkTime: currentTime }); const res = await tableClient.table('barrage', ['gid', 'id']).put([1, TableStore.PK_AUTO_INCR], newData, c = 'I'); return res;}// 更新const updateBarrage = async (ctx) => { const { tableClient } = ctx.req.requestContext.internal; const { checkStatus } = ctx.request.body; const { id } = ctx.request.params; const currentTime = Date.now().toString(); const res = await tableClient.table('barrage', ['gid', 'id']).update([1, parseInt(id)], { checkStatus: parseInt(checkStatus), checkTime: currentTime }, c = 'I') return res;}// 條件查詢const getBarrageByCondition = async (ctx) => { const { tableClient, TableStore } = ctx.req.requestContext.internal; const res = await tableClient.table('barrage').search('index', ['checkStatus', 0]) return res;}

          當(dāng)然如果你想做更高級的查詢,就需要自己去查閱官網(wǎng)文檔了。


          總結(jié)



          這個項目本身是對 Serverless 如何使用 websocket 的一個展示示例。你可以把它變成任意相近形態(tài)的應(yīng)用,比如聊天室,多人協(xié)作平臺等。

          應(yīng)用本身也還有很多改進空間,比如增加點贊效果,管控部分可以加上管理員的登錄注冊等。總之你可以根據(jù)自身需求定制更高級的功能,相關(guān)的源碼已經(jīng)提供出來供大家參考。下個篇章我會繼續(xù)跟大家聊一聊?Serverless?和低代碼的場景,并分享一個我們最近做的實踐。

          文中涉及網(wǎng)址匯總:


          Serverless Devs:https://github.com/Serverless-Devs云解析DNS:https://wanwang.aliyun.com/domain/dnsAPI網(wǎng)關(guān):https://www.aliyun.com/product/apigateway函數(shù)計算:https://www.aliyun.com/product/fc對象存儲OSS:https://www.aliyun.com/product/ossServerlessDesktop:http://www.serverless-devs.com/zh-cn/desktop/index.htmlServerless Devs Cli:http://www.serverless-devs.com/zh-cn/cli/index.htmlServerless Hub:https://serverlesshub.resume.net.cn/#/hubs/specialviewTablestore表格存儲:https://www.aliyun.com/product/ots官網(wǎng)文檔:https://help.aliyun.com/document_detail/27304.html?spm=5176.54465.J_7985555940.4.15942e0c3qkHbU源碼:https://github.com/devsapp/start-barrage

          作者介紹:


          ?

          王慶(寒斜)|阿里云云原生中間件前端負(fù)責(zé)人

          2016 年加入阿里中間件從事云產(chǎn)品企業(yè)控制臺研發(fā)工作,負(fù)責(zé)中間件 20 多款云產(chǎn)品前端研發(fā)工作,主要技術(shù)棧為大前端通用技術(shù),目前專注在 Serverless 開發(fā)者工具鏈的建設(shè),是云原生 Serverless Devs 研發(fā)負(fù)責(zé)人之一。





          END


          ?獎勵看到最后的你:


          # 點個在看,并在下方留言;
          # 然后,將
          后臺回復(fù)云小寶,試試手氣?
          # 本周互動獎品是
          “云小寶公仔”

          # 本期禮品開獎時間1月12日?


          訂閱話題?精彩資訊不錯過


          ?原文,跳轉(zhuǎn)至 Serverless Devs~
          瀏覽 58
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美成人无码一区二区三区 | аⅴ天堂中文在线网 | WW青青草 | 在线国产激情 | 国产黄片日逼视频 |