真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

基于Serverless的舞萌音游查分器是怎樣的

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)基于 Serverless 的舞萌音游查分器是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)是一家專業(yè)提供寧德企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都做網(wǎng)站、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為寧德眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

一、什么是 Serverless Framework

Serverless Framework 是業(yè)界非常受歡迎的無服務(wù)器應(yīng)用框架,開發(fā)者無需關(guān)心底層資源即可部署完整可用的 Serverless 應(yīng)用架構(gòu)。Serverless Framework 具有資源編排、自動伸縮、事件驅(qū)動等能力,覆蓋編碼、調(diào)試、測試、部署等全生命周期,幫助開發(fā)者通過聯(lián)動云資源,迅速構(gòu)建 Serverless 應(yīng)用

沒錯,就像幾天前看到的《Serverless 之歌》里面所說 I'm gonna reduce your ops,它能大幅度減輕運維壓力,那就開始動手吧!注意開發(fā)環(huán)境需 Node.js 10.0+,一鍵全局安裝:npm install -g serverless

二、騰訊云 Flask Serverless Component 簡介

騰訊云 Flask Serverless Component,支持 Restful API 服務(wù)的部署

按照慣例首先來部署 demo

  1. 本地 PyCharm 創(chuàng)建一個新的 Flask 項目

基于 Serverless 的舞萌音游查分器是怎樣的

  1. 手動創(chuàng)建內(nèi)容為 Flaskrequirements.txt

  2. 按照配置文檔創(chuàng)建 serverless.yml,例如本項目實際使用的完整內(nèi)容,初次使用可自行酌情簡化

  3. 將密匙寫入 .env(當(dāng)然,部署的時候也可以選擇微信掃碼授權(quán))

TENCENT_SECRET_ID=
TENCENT_SECRET_KEY=

基于 Serverless 的舞萌音游查分器是怎樣的

基于 Serverless 的舞萌音游查分器是怎樣的

這樣基于 ServerlessFlask Demo 就部署完成了,接下來繼續(xù)按照自己的方式寫剩下的代碼。

三、maimai_DX

maimai 是一款街機(jī)音游。

基于 Serverless 的舞萌音游查分器是怎樣的

在這里放一張動圖自行體會一下,原始素材來自「外錄 maimai」QZKago Requiem Re:MASTER ALLPERFECT Player: Ruri*R

基于 Serverless 的舞萌音游查分器是怎樣的

  • 日本官網(wǎng)

  • 海外官網(wǎng)

在國內(nèi),只能從微信公眾號中查看成績,而且每次進(jìn)頁面都需要微信的授權(quán)登錄,并且里面存儲的記錄有條數(shù)限制,相冊只存最新 10 條,游戲記錄只存最新 50 條(就是一個隊列,先進(jìn)先出的那種)。這就是本項目的初衷,自己打出來的每一次成績都應(yīng)該保存好。

舞萌查分器

成果展示了,前端 Fomantic-UI,后端 Flask+MySQL。gh 開源地址:https://github.com/yuangezhizao/maimai_DX_CN_probe,歡迎 watch、star、fork & pr

基于 Serverless 的舞萌音游查分器是怎樣的

目前實裝了如下功能:

  1. wechat_archive中包含 主頁,游戲數(shù)據(jù),相冊游戲記錄:對原始網(wǎng)頁進(jìn)行了修改,并且添加了 Highcharts 庫可視化曲線顯示變化

  2. record包含 記錄(分頁)差異(分頁):即自寫的快速預(yù)覽頁面,是查看歷史記錄和成績變化的非常實用的功能

  3. info包含 鋪面列表:即全部鋪面基礎(chǔ)信息,輸出到一個頁面中,方便頁面內(nèi)搜索

開發(fā)過程

接下來將按照時間的順序,描述一下開發(fā)過程中遇到的問題以及如何解決

1. Serverless Framework Component 配置文件

Serverless Framework 現(xiàn)在是 V2 版本,也就是說不能沿襲之前版本的 serverless.yml 配置文件,需要重新對照文檔修改。

a. 之前版本會根據(jù) requirements.txt 自動下載第三方庫到項目目錄下的 .serverless 文件夾下的 requirements 文件夾以參加最終的依賴打包,壓縮成 zip 文件再最終上傳至云函數(shù)運行環(huán)境

b. 最新版本不再自動下載,需要自行處理。官方示例的參考用法:hook

  src:
    # TODO: 安裝python項目依賴到項目當(dāng)前目錄
    hook: 'pip3 install -r requirements.txt -t ./requirements'
    dist: ./
    include:
      - source: ./requirements
        prefix: ../ # prefix, can make ./requirements files/dir to ./
    exclude:
      - .env
      - 'requirements/**'

注釋寫的很清楚,使用 hook 去根據(jù) requirements.txt 下載第三方庫到項目目錄下的 requirements 文件夾,避免第三方庫導(dǎo)致本地文件夾管理混亂。然后 include 中指定了項目目錄下的 requirements 文件夾在云端的 prefix,即對于云端的云函數(shù)運行環(huán)境,requirements 文件夾中的第三方庫和項目目錄是同級的,可以正常導(dǎo)入使用。當(dāng)然了,本地運行使用的是全局的第三方庫,并未用到項目目錄下的 requirements 文件夾。

2. 層管理概述

前者(指 b)是一個很合理的設(shè)計,不過在實際環(huán)境中卻發(fā)現(xiàn)了新的問題。完全一致的配置文件

  src:
    hook: 'pip3 install -r ./src/requirements.txt -t ./src/requirements'
    dist: ./src
    include:
      - source: ./requirements
        prefix: ../
    exclude:
      - .env

在 macOS 下成功部署之后,云端的云函數(shù)編輯器中看到 requirements 文件夾不存在,第三方庫和項目目錄是同級的,的確沒問題。

不過在 Windows 下成功部署之后,云端的云函數(shù)編輯器中看到了 requirements 文件夾?也就是說第三方庫和項目目錄非同級,于是訪問就會出現(xiàn) no module found 的導(dǎo)入報錯了……

反復(fù)嘗試修改 prefix 等配置項到最后也沒有調(diào)試成功,因此在這里提出兩種解決方法:

a. 修改配置文件如下,讓本地的第三方庫和項目目錄同級存在

  src:
    hook: 'pip3 install -r ./src/requirements.txt -t ./src'
    dist: ./src
    exclude:
      - .env

不過隨著項目和第三方庫的擴(kuò)大文件夾會越來越多,非常不便于管理

b. 使用云函數(shù)提供的

雖然 sls deploy 部署的速度很快,但是如果可以在部署時只上傳項目代碼而不去處理依賴不就更好了嘛,這樣跨終協(xié)作端開發(fā)只需要關(guān)心項目代碼就 ok 了,再也不需要管理依賴!

并且還有一點,想在 SCF 控制臺中在線編輯函數(shù)代碼需要將部署程序包保持在 10MB 以下,不要以為十兆很大,很快就用光也是可能的

基于 Serverless 的舞萌音游查分器是怎樣的

具體如何操作呢?那就是要將第三方庫文件夾直接打包并創(chuàng)建為層,則在函數(shù)代碼中可直接通過 import 引用,畢竟有些特殊庫比如 Brotli,Windows 下沒有 vc++ 的話就只能去https://lfd.uci.edu/~gohlke/pythonlibs下載 wheel 安裝。

macOS 下正常安裝之后會得到 _brotli.cpython-39-darwin.so,brotli.py 中再以 import _brotli 的形式導(dǎo)入,不過又出新問題了,云端會導(dǎo)入報錯ModuleNotFoundError: No module named '_brotli'"

當(dāng)前 SCF 的執(zhí)行環(huán)境建立在以下基礎(chǔ)上:標(biāo)準(zhǔn) CentOS 7.2

為了解決問題嘗試在 linux 環(huán)境下打包,拿起手頭的 CentOS 8.2 云主機(jī)開始操作

pip3 install -r requirements.txt -t ./layer --upgrade
zip -r layer.zip ./layer

然后就可以把打包的 layer.zip 下載到本地再傳上去了,暫時可以一勞永逸了。

基于 Serverless 的舞萌音游查分器是怎樣的

對了,配置文件可以移除 hook 并添加 layers

  src:
    src: ./src
    exclude:
      - .env
      - '__pycache__/**'
  layers:
    - name: maimai_DX_CN_probe
      version: 3

已綁定層的函數(shù)被觸發(fā)運行,啟動并發(fā)實例時,將會解壓加載函數(shù)的運行代碼至 /var/user/ 目錄下,同時會將層內(nèi)容解壓加載至 /opt 目錄下。若需使用或訪問的文件 file,放置在創(chuàng)建層時壓縮文件的根目錄下。則在解壓加載后,可直接通過目錄 /opt/file 訪問到該文件。若在創(chuàng)建層時,通過文件夾進(jìn)行壓縮 dir/file,則在函數(shù)運行時需通過 /opt/dir/file 訪問具體文件

體驗更快的部署速度吧!因為第三方庫已經(jīng)打包在“層”中了

但是奇怪的是,在云端導(dǎo)入任意第三方庫均會報錯,于是調(diào)試著查看 path

for path in sys.path:
    print(path)

/var/runtime/python3
/var/user
/opt
/var/lang/python3/lib/python36.zip
/var/lang/python3/lib/python3.6
/var/lang/python3/lib/python3.6/lib-dynload
/var/lang/python3/lib/python3.6/site-packages
/var/lang/python3/lib/python3.6/site-packages/pip-18.0-py3.6.egg

再查看 opt

import os
dirs = os.listdir('/opt')

for file in dirs:
   print(file)

layer

這才恍然大悟,打包時需要在當(dāng)前路徑直接打包。上傳之后“層”更新為版本 2,但是 ModuleNotFoundError: No module named '_brotli' 報錯依舊,并且確認(rèn) _brotli.cpython-38-x86_64-linux-gnu.so 文件實際存在。

而在 CentOSmacOS 上本地導(dǎo)入均沒有問題,這可就犯難了,又想到很有可能是 python 版本的問題,于是去尋找現(xiàn)成 3.6 的環(huán)境,比如這里:

基于 Serverless 的舞萌音游查分器是怎樣的

再再次上傳之后“層”更新為版本 3,訪問成功!課題終于解決,原來是需要相同版本Python 3.6 運行環(huán)境

3.自定義入口文件

components源碼tencent-flask/src/_shims/中的文件每次都會被原封不動地重新打包上傳到云端云函數(shù)中,目前有兩個文件

a. severless_wsgi.py,作用是 converts an AWS API Gateway proxied request to a WSGI request. WSGI的全稱是Python Web Server Gateway InterfaceWeb 服務(wù)器網(wǎng)關(guān)接口,它是為Python語言定義的Web服務(wù)器和Web應(yīng)用程序或框架之間的一種簡單而通用的接口

b. sl_handler.py,就是默認(rèn)的入口文件

import app  # Replace with your actual application
import severless_wsgi

# If you need to send additional content types as text, add then directly
# to the whitelist:
#
# serverless_wsgi.TEXT_MIME_TYPES.append("application/custom+json")

def handler(event, context):
    return severless_wsgi.handle_request(app.app, event, context)

針對于自己的項目,使用了 Flask工廠函數(shù),為了避免每次都要在云端云函數(shù)編輯器中重新修改,最好的方法是自定義入口文件:

import severless_wsgi

from maimai_DX_CN_probe import create_app  # Replace with your actual application


# If you need to send additional content types as text, add then directly
# to the whitelist:
#
# serverless_wsgi.TEXT_MIME_TYPES.append("application/custom+json")

def handler(event, context):
    return severless_wsgi.handle_request(create_app(), event, context)

再指定 執(zhí)行方法serverless_handler.handler,就 ok 了

4. url_for 輸出 http 而非 httpsURL

在視圖函數(shù)中重定向到 url_for 所生成的鏈接都是 http,而不是 https……其實這個問題 Flask 的文檔 Standalone WSGI Containers有描述到

說到底這并不是 Flask 的問題,而是 WSGI 環(huán)境所導(dǎo)致的問題,推薦的方法是使用中間件,官方也給出了 ProxyFix

from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)

但是是從X-Forwarded-Proto中取的值,apigw中其為http,因此并不能直接使用這個ProxyFix 因為Flask的社區(qū)還算完善,參考資料很多前人都鋪好了路,所以直接去Stack Overflow搜解決方法,F(xiàn)lask url_for generating http URL instead of https 問題出現(xiàn)的原因如圖:Browser ----- HTTPS ----> Reverse proxy(apigw) ----- HTTP ----> Flask 因為自己在apigw設(shè)置了前端類型https,也就是說Browser端是不可能使用http訪問到的,通過打印environ可知

{
  "CONTENT_LENGTH": "0",
  "CONTENT_TYPE": "",
  "PATH_INFO": "/",
  "QUERY_STRING": "",
  "REMOTE_ADDR": "",
  "REMOTE_USER": "",
  "REQUEST_METHOD": "GET",
  "SCRIPT_NAME": "",
  "SERVER_NAME": "maimai.yuangezhizao.cn",
  "SERVER_PORT": "80",
  "SERVER_PROTOCOL": "HTTP/1.1",
  "wsgi.errors": <__main__.CustomIO object at 0x7feda2224630>,
  "wsgi.input": <_io.BytesIO object at 0x7fed97093410>,
  "wsgi.multiprocess": False,
  "wsgi.multithread": False,
  "wsgi.run_once": False,
  "wsgi.url_scheme": "http",
  "wsgi.version": (1, 0),
  "serverless.authorizer": None,
  "serverless.event": "",
  "serverless.context": "",
  "API_GATEWAY_AUTHORIZER": None,
  "event": "",
  "context": "",
  "HTTP_ACCEPT": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
  "HTTP_ACCEPT_ENCODING": "gzip, deflate, br",
  "HTTP_ACCEPT_LANGUAGE": "zh-CN,zh;q=0.9,en;q=0.8",
  "HTTP_CONNECTION": "keep-alive",
  "HTTP_COOKIE": "",
  "HTTP_ENDPOINT_TIMEOUT": "15",
  "HTTP_HOST": "maimai.yuangezhizao.cn",
  "HTTP_SEC_FETCH_DEST": "document",
  "HTTP_SEC_FETCH_MODE": "navigate",
  "HTTP_SEC_FETCH_SITE": "none",
  "HTTP_SEC_FETCH_USER": "?1",
  "HTTP_UPGRADE_INSECURE_REQUESTS": "1",
  "HTTP_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
  "HTTP_X_ANONYMOUS_CONSUMER": "true",
  "HTTP_X_API_REQUESTID": "5bcb29af2ca18c1e6d7b1ec5ff7b5427",
  "HTTP_X_API_SCHEME": "https",
  "HTTP_X_B3_TRACEID": "5bcb29af2ca18c1e6d7b1ec5ff7b5427",
  "HTTP_X_QUALIFIER": "$LATEST"
}

HTTP_X_FORWARDED_PROTO對應(yīng)apigw里的變量是HTTP_X_API_SCHEME,故解決方法如下:app.wsgi_app = ReverseProxied(app.wsgi_app)

class ReverseProxied(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        scheme = environ.get('HTTP_X_FORWARDED_PROTO')
        if scheme:
            environ['wsgi.url_scheme'] = scheme
        return self.app(environ, start_response)

app = Flask(__name__)
app.wsgi_app = ReverseProxied(app.wsgi_app)

5. 響應(yīng)數(shù)據(jù)壓縮

不論是IIS、Apache還是Nginx,都提供有壓縮功能。畢竟自己在用的云主機(jī)外網(wǎng)上行只有1M帶寬,壓縮后對于縮短首屏?xí)r間的效果提升極為顯著。對于Serverless,響應(yīng)數(shù)據(jù)是通過API Gateway傳輸?shù)娇蛻舳?,那么壓縮也應(yīng)該是它所具備的能力(雖然外網(wǎng)速度大幅度提高,但是該壓縮還是得壓縮),然而并沒有找到……看到某些js框架原生有提供壓縮功能,于是打算添加Flask自行壓縮的功能。簡單來講,通過訂閱@app.after_request信號并調(diào)用第三方庫brotlicompress方法即可( 在寫之前去gh上看看有沒有現(xiàn)成的輪子拓展,果然有……剛開始用的是Flask-Zipper,后來換成Flask-Compress解決了問題 實測3.1 MB的數(shù)據(jù)采用brotli壓縮算法減至76.1 kB

基于 Serverless 的舞萌音游查分器是怎樣的

基于 Serverless 的舞萌音游查分器是怎樣的

基于 Serverless 的舞萌音游查分器是怎樣的

6. apigw 三種環(huán)境不同路徑所產(chǎn)生的影響

默認(rèn)的映射如下:

ID環(huán)境名訪問路徑
1發(fā)布release
2預(yù)發(fā)布prepub
3測試test

因為配置的static_url_path"",即static文件夾是映射到/路徑下的,所以再加上release、prepubtest訪問就自然404了 因此綁定了自定義域名使用自定義路徑映射,并將發(fā)布環(huán)境的訪問路徑設(shè)置成/,這樣再訪問發(fā)布環(huán)境就沒有問題了

ID環(huán)境名訪問路徑
1發(fā)布/
2預(yù)發(fā)布prepub
3測試test

7. 同時訪問私有網(wǎng)絡(luò)外網(wǎng)

云函數(shù)中可以利用到的云端數(shù)據(jù)庫有如下幾種

  • 云數(shù)據(jù)庫CDB,需要私有網(wǎng)絡(luò)訪問,雖然可以通過外網(wǎng)訪問但是能走內(nèi)網(wǎng)就不走外網(wǎng)

  • PostgreSQL for Serverless(ServerlessDB),這個是官方給Serverless配的pg數(shù)據(jù)庫

  • 云開發(fā)TCB中的MongoDB,沒記錯的話需要開通內(nèi)測權(quán)限訪問

因為自己是從舊網(wǎng)站遷移過來的,數(shù)據(jù)暫時還沒有遷移,因此直接訪問原始云數(shù)據(jù)庫CDB,在云函數(shù)配置所屬網(wǎng)絡(luò)所屬子網(wǎng)即可。但是此時會無法訪問外網(wǎng),一種解決方法是開啟公網(wǎng)訪問公網(wǎng)固定IP,就可以同時訪問內(nèi)網(wǎng)和外網(wǎng)資源了。關(guān)于配置文件,本項目是單實例應(yīng)用也就是說項目中只引入一個組件,部署時只生成一個組件實例。但是如果想引入數(shù)據(jù)庫的話,就得新增組件了,目前在Flask Components中并沒有提供數(shù)據(jù)庫相關(guān)的配置項,因此需要項目中引入多個組件,部署時生成多個組件實例。也很簡單,創(chuàng)建一個含有serverless.yml的新文件夾,用來配置postgresql

component: postgresql # (必填) 組件名稱,此處為 postgresql
name: maimai_DX_CN_probe # (必選) 組件實例名稱.
org: yuangezhizao # (可選) 用于記錄組織信息,默認(rèn)值為您的騰訊云賬戶 appid,必須為字符串
app: yuangezhizao # (可選) 用于記錄組織信息. 默認(rèn)與name相同,必須為字符串
stage: dev # (可選) 用于區(qū)分環(huán)境信息,默認(rèn)值是 dev

inputs:
  region: ap-beijing # 可選 ap-guangzhou, ap-shanghai, ap-beijing
  zone: ap-beijing-3 # 可選 ap-guangzhou-2, ap-shanghai-2, ap-beijing-3
  dBInstanceName: maimai_DX_CN_probe
  #  projectId: 0
  dBVersion: 10.4
  dBCharset: UTF8
  vpcConfig:
    vpcId: vpc-mrg5ak88
    subnetId: subnet-hqwa51dh
  extranetAccess: false

然后在終端cd到這個目錄再執(zhí)行sls deploy即可成功部署postgresql

yum install python3-devel postgresql-devel
pip install psycopg2

結(jié)果

import psycopg2
File "/opt/psycopg2/__init__.py", line 51, in <module>
from psycopg2._psycopg import (                     # noqa
ImportError: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory

下列問題處于解決之中:

  • http 強(qiáng)制跳轉(zhuǎn) https

  • 測試環(huán)境推送至生產(chǎn)環(huán)境

上述就是小編為大家分享的基于 Serverless 的舞萌音游查分器是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁題目:基于Serverless的舞萌音游查分器是怎樣的
瀏覽地址:http://weahome.cn/article/pjcsge.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部