默認狀況下,雲開發的函數部署在公共網絡中,只能夠訪問公網。若是開發者須要訪問騰訊雲的 Redis、TencentDB、CVM、Kafka 等資源,須要創建私有網絡來確保數據安全及鏈接安全。前端
本文會演示如何在雲開發的函數中使用 Redis,如需訪問其餘數據庫資源,也能夠參考本文的思路。git
Redis 是一個開源的 In-Memory 的NoSQL數據庫,能夠用做數據庫、緩存和消息中間件。 支持多種類型的數據結構,如字符串(strings)、散列(hashes)、列表(lists)和集合(sets)等github
常見的應用場景有:redis
私有網絡(Virtual Private Cloud,VPC)是基於騰訊雲構建的專屬雲上網絡空間,爲您在騰訊雲上的資源提供網絡服務,不一樣私有網絡間徹底邏輯隔離。您能夠自定義網絡環境、路由表、安全策略等;同時,私有網絡支持多種方式鏈接 Internet、鏈接其餘 VPC、鏈接您的本地數據中心,助力您輕鬆部署雲上網絡。數據庫
相比於用戶共享資源池的基礎網絡,在私有網絡中用戶能夠自由定義網段劃分、IP 地址和路由策略;安全方面可提供網絡 ACL 及安全組的訪問控制,靈活性和安全性更高。json
私有網絡有三個核心組成成分:私有網絡網段、子網和路由表。小程序
一個私有網絡由至少一個子網組成,子網的 CIDR(無類別域間路由) 必須在私有網絡的 CIDR 內。segmentfault
子網用於管理彈性雲服務器網絡平面的一個網絡,能夠提供 IP 地址管理、DNS 等服務。私有網絡中的全部雲資源(如雲服務器、雲數據庫等)都必須部署在子網內。緩存
私有網絡具備 地域(Region) 屬性(如廣州),而子網具備 可用區(Zone) 屬性(如廣州一區),一個私有網絡下的子網能夠屬於該地域下不一樣可用區,同一私有網絡下各個子網內資源不管是否在同一可用區內,均默認內網互通。安全
路由表由多條路由策略組成,用於控制私有網絡內子網的出流量走向。每一個子網僅且只能關聯一個路由表,一個路由表能夠關聯多個子網。您能夠爲不一樣流量走向的子網建立多個路由表
在騰訊雲控制檯的私有網絡中能夠免費建立私有網絡,因爲私有網絡具備地域(Region)屬性,咱們須要在函數所在的地域來新建私有網絡。
這裏咱們選擇華東地區(上海)地域,若是您已經在該地域創建了私有網絡,能夠跳過這一步
建立私有網絡時須要初始化一個子網,這裏咱們選擇建一個在上海二區可用區的子網
建立私有網絡和子網以後,咱們須要配置函數的網絡模式,將函數加入到華東地區(上海)地域的私有網絡中
在騰訊雲的雲開發控制檯中,找到須要配置的雲函數,點擊編輯進入配置界面
在函數配置界面中,修改網絡配置爲華東地區(上海)地域的虛擬網絡和子網。
接下來咱們在騰訊雲的雲數據庫控制檯中,找到上海地域,新建一個 Redis 實例
這裏爲了方便演示,咱們選擇了一個內存爲 256 MB 的單副本實例,您也能夠根據具體的需求和場景來選擇合適的套餐。
TIPS在生產環境中,爲了保證可靠性和高可用,建議不要選擇選擇單副本,最好選擇多副本或者 Redis 集羣;另外若是隻在 CVM 等單機部署了 Redis,也須要作好容災和備份
注意網絡類型須要選擇私有網絡,同時選擇剛纔建好的私有網絡和子網
購買 Redis 以後,很快就會建立 Redis 的實例,建立成功以後,在網絡下咱們能夠看到 Redis 實例的 ip,咱們須要在雲函數中鏈接這個實例
爲了鏈接和操做 Redis 實例,咱們須要一個 Redis 客戶端,這裏咱們使用社區開源的 ioredis 做爲 Redis 客戶端庫做爲示例:
首先,在雲函數目錄中的 package.json 中新增依賴 ioredis 依賴,設置完以後記得在開發者工具中選擇 上傳並部署(雲端安裝依賴)
{ "name": "redis-demo", "dependencies": { "wx-server-sdk": "latest", "ioredis": "4.14.1" } }
接下來,在雲函數中編寫代碼來鏈接和操做 Redis,這裏須要提供 Redis 實例的 ip、端口和密碼等信息
TIPS建議在 main 函數外面新建 Redis 客戶端實例,這樣在函數實例被複用時不會重複鏈接 Redis ,性能更好
在 main 函數中可經過 redis.get、redis.set 等方法讀取和寫入數據,具體能夠查看 ioredis 的 API 文檔
const Redis = require('ioredis'); // 建議在 main 函數外面新建 Redis 客戶端實例 // 這樣在函數實例被複用時不會重複鏈接 Redis const redis = new Redis({ port: 6379, // Redis port host: 'YOUR_REDIS_IP', // Redis host family: 4, // 4 (IPv4) or 6 (IPv6) password: 'YOUR_PASSWORD', db: 0, }); // 雲函數入口函數 exports.main = async (event, context) => { // TODO 可使用 redis.get、redis.set 等方法來操做 Redis };
咱們如今來實際演示下一下如何在雲函數中使用 Redis 做爲緩存
咱們須要新建一個名爲 redis-demo 的雲函數 ,該函數的主要實現是:
// 雲函數入口文件 const cloud = require('wx-server-sdk'); const Redis = require('ioredis'); cloud.init(); const redis = new Redis({ port: 6379, // Redis port host: 'YOUR_REDIS_IP', // Redis host family: 4, // 4 (IPv4) or 6 (IPv6) password: 'YOUR_PASSWORD', db: 0, }); // 雲函數入口函數 exports.main = async (event, context) => { const wxContext = cloud.getWXContext(); const cacheKey = wxContext.OPENID; const cache = await redis.get(cacheKey); if (!cache) { const result = await new Promise((resolve, reject) => { // 模擬一個耗時 2s 的任務,返回了一個隨機數 setTimeout(() => resolve(Math.random()), 2000); }); // 緩存一小時 redis.set(cacheKey, result, 'EX', 3600); return result; } else { return cache; } };
編寫完代碼以後,咱們須要上傳並部署 redis-demo 函數,而後嘗試在小程序中調用這個雲函數來測試一下效果:
咱們能夠看到,因爲使用了 Redis 做爲緩存,在屢次的調用雲函數請求中,在 300 ms 左右均可以獲取到函數的結果,函數返回的結果正是咱們緩存的隨機數,符合預期的效果。
若是有須要訪問雲開發以外的騰訊雲資源,能夠選擇使用私有網絡這種網絡模式,將雲開發資源如函數和其餘資源放在同一個私有網絡便可,私有網絡相比基礎網絡更加安全和靈活。本文雖然只演示了在函數中使用騰訊雲的 Redis 資源,若是須要訪問騰訊雲的其餘的數據庫資源,思路也是同樣的,只須要將函數和數據庫資源放在同一個私有網絡,就能夠在函數中訪問。
經過私有網絡還能夠實現對公網訪問服務、實現和騰訊雲以外的 IDC 互聯等功能,關於這部分的介紹,咱們後續進行講解。
binggg(Booker Zhao) @騰訊 - 前後就任於迅雷、騰訊等,我的開源項目有 mrn.js 等 - 創辦了迅雷內部組件倉庫 XNPM ,參與幾個迅雷前端開源項目的開發 - 熱衷於優化和提效,是一個奉行「懶惰令人進步」的懶人工程師
微信公衆號 binggg_net
, 歡迎關注