ServerLess之雲函數實踐-天氣API


關注我的個人博客,發掘更多的內容

ServerLess之雲函數實踐-天氣API

前言

雲計算是大勢所趨

Serverless 架構即“⽆服務器”架構,它是一種全新的架構方式,是雲計算時代⼀種⾰命性的架構模式

FaaS(Function as a Service - 函數即服務) 是在無狀態容器中運行的事件驅動型計算的執行模型

☁️雲函數算是FaaS的一種具體的形式,由雲商(騰訊雲,阿里雲,七牛雲等等)提供計算平台,開發者只需關注函數邏輯的實現,將服務器相關的配置管理工作統統交給雲商去做,不再花大精力去管理服務器

我們只需要提供一段代碼,由雲商研制的 FaaS 方案幫我們選擇語言對應技術棧的最佳實踐,基於內置的擴展機制按實際需要,進行動態擴展計算資源,輕松部署服務到公網,並提供可靠的監控、報警保障,不需要以前一樣,服務器資源不是大部分時間處於閑置狀態,就是遇到超大瀏覽需要緊急擴容

給 FaaS 一個函數,就能上線一個高可用的服務

簡單的服務接口開發的專業性要求降低了,前端有了更大的發揮空間,包括但不限於:

  • BFF(Backend For Frontend)
  • SSR(Server-Side Rendering)

上面簡單的介紹了一下“雲函數”,有一點抽象,下面就結合實操,來搞一個”實用的“

☁️搞一個簡單的天氣查詢API

就像這樣的:點我體驗

參數:cityId 地區參照表

所使用到的技術與平台

  • Node.js (雲函數選用JavaScript語言)
  • 騰訊雲 - 免費的雲函數服務
  • 阿里雲 - 免費的墨跡天氣查詢服務

下面開始手把手教程

騰訊雲側

1. 注冊賬號

注冊騰訊雲賬號並登錄

https://cloud.tencent.com/

2. 進入控制台

點擊右上角進入控制台

圖片

3. 雲函數-函數服務

左上角選擇雲產品,輸入雲函數,選擇 雲函數-函數服務

圖片

4. 新建雲函數

新建一個雲函數

圖片

5. 錄入基本信息

  • 符合規范的函數名稱
  • 環境選擇一個Node.js的環境
  • 選擇空白函數
  • 然后下一步
    圖片

6. 完成創建

直接點擊完成,什么都不更改

圖片

7. 觸發器

然后來到這個界面,點擊觸發管理

圖片

8. 創建觸發器

創建觸發器,填寫相關信息

  • 觸發方式-API網關觸發
  • 請求方法-GET
  • 鑒權方法-免鑒權

圖片

9. 大功告成

體驗一下生成的觸發器鏈接

圖片

10. 觀察接口

觀察響應結果與我們的代碼

響應結果

圖片

我們的雲函數代碼

圖片

關注紅色框中的內容

  • 執行方法:index.main_handler
    • index 對應的就是 index.js
    • main_handler就是就是index.js中對外暴露的 main_handler方法

再看代碼

'use strict';
exports.main_handler = async (event, context) => {
    console.log("Hello World")
    console.log(event)
    console.log(event["non-exist"])
    console.log(context)
    return event
};

根據上上圖返回的結果可知其對應的是event里面的內容: 即我們可以在event中取到我們請求的參數,header,body等信息,便於我們執行后續邏輯

context的內容(console.log的內容)在哪里看?

11. 日志查詢

圖片

在日志查詢面板可以查詢到我們接口的調用信息,響應狀態與log的內容

12. 安裝依賴的模塊

這個和本地安裝差不多,一個敲命令,一個點按鈕

我們使用本地終端創建一個package.json文件

npm init -y

圖片

package.json

{
  "name": "faas",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

如安裝axios,本地執行安裝先

yarn add axios
# or
npm i axios

此時的package.json

{
  "name": "faas",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "axios": "^0.21.0"
  }
}

在平台上創建一個 package.json文件,並把上述內容粘貼進去,ctrl/command + S 保存修改的內容

圖片

圖片

選擇在線安裝依賴,然后點擊保存

圖片

安裝完成后 會出現 node_modules目錄

圖片

JS雲函數創建相關流程,差不都陳述完畢

下面開始我們的代碼編寫

天氣雲函數編寫

代碼同步到線上的方式

  • 可以本地編輯后上傳文件
  • 使用騰訊雲的cli工具上傳
  • 復制粘貼

這里比較簡單我們就復制粘貼了

先簡單編寫一下大體結構,然后點擊保存,再訪問剛剛的觸發器鏈接觀察返回的結果

index.js

'use strict';
const http = require('axios').default

function getNowWeather(cityId = 3) {
    // 待編寫
    return {
        data:{
            cityId
        }
    }
}
exports.main_handler = async (event, context) => {
    // 結構取得url中傳遞的參數
    const { queryString: { cityId } } = event
    return getNowWeather(cityId)
};

下面實現getNowWeather的邏輯就要用到阿里雲的服務了

阿里雲側

先白嫖個服務

阿里雲-免費版氣象天氣服務(cityid)-墨跡天氣

根據其文檔中的請求示例,我們先構建出 Node版本的方法

const http = require('axios').default

function getNowWeather(cityId = 3) {
    const token = ''
    const appcode = ''
    const nowStatusURL = 'http://freecityid.market.alicloudapi.com/whapi/json/alicityweather/briefcondition' // 精簡實況的請求URL
    const data = `cityId=${cityId}&token=${token}` // 請求參數
    const headers = { // header
        'Authorization': `APPCODE ${appcode}`,
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }
    
    // 發送請求
    return http.post(nowStatusURL, data, {
        headers
    }).then(res => res.data)
}

購買服務后根據文檔找到tokenappcode即可

控制台->API網關->華北2(北京)

圖片

為了節約查找token與appcode的時間,下面列一下步驟(吐槽,阿里雲的文檔太攔了,不方便信息定位)

token與appcode

API網關頁面地址

  1. token: 應用管理->選擇一個應用->已授權API列表->選擇自己要查看的API->點擊調試API->調試面板的token參數即是所需參數
  2. appcode: 應用管理->選擇一個應用->AppCode面板

圖片

圖片

最終代碼

圖片

index.js

'use strict';
const http = require('axios').default

function getNowWeather(cityId = 3) {
    const token = ''
    const appcode = ''
    const nowStatusURL = 'http://freecityid.market.alicloudapi.com/whapi/json/alicityweather/briefcondition' // 精簡實況的請求URL
    const data = `cityId=${cityId}&token=${token}` // 請求參數
    const headers = { // header
        'Authorization': `APPCODE ${appcode}`,
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }
    
    // 發送請求
    return http.post(nowStatusURL, data, {
        headers
    }).then(res => res.data)
}

exports.main_handler = async (event, context) => {
    const {queryString:{cityId}} = event
    return await getNowWeather(cityId)
};

觸發器鏈接

最后

到此一個雲函數就開發完畢了

可以感覺到,如果熟悉創建流程了,只需要幾分鍾就能創建一個提供服務的API,極大的節約了成本

不懂服務端部署,服務器運維,Linux的開發者可以通過 雲函數+雲數據庫(關系數據庫,非關系數據庫) 快速搭建一個后端服務

文件存儲服務可以使用OSS

開發者只需要通過雲函數調用各服務提供的API即可完成一個后端服務的構建

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM