1. 程式人生 > 實用技巧 >Serverless 解惑——函式計算如何安裝字型

Serverless 解惑——函式計算如何安裝字型

前言

首先介紹下在本文出現的幾個比較重要的概念:

函式計算(Function Compute):函式計算是一個事件驅動的服務,通過函式計算,使用者無需管理伺服器等執行情況,只需編寫程式碼並上傳。函式計算準備計算資源,並以彈性伸縮的方式執行使用者程式碼,而使用者只需根據實際程式碼執行所消耗的資源進行付費。函式計算更多資訊 參考 Fun:Fun 是一個用於支援 Serverless 應用部署的工具,能幫助您便捷地管理函式計算、API 閘道器、日誌服務等資源。它通過一個資源配置檔案(template.yml),協助您進行開發、構建、部署操作。Fun 的更多文件 參考

備註: 本文介紹的技巧需要 Fun 版本大於等於 3.6.7。

函式計算執行環境中內建一些常用字型,但仍不滿足部分使用者的需求。如果應用中需要使用其它字型,需要走很多彎路。本文將介紹如何通過 Fun 工具將自定義字型部署到函式計算,並正確的在應用中被引用。

你需要做什麼

  1. 在程式碼(CodeUri)目錄新建一個 fonts 目錄;

  2. 將字型複製到 fonts 目錄;

  3. 使用 fun deploy 進行部署。

工具安裝

建議直接從這裡下載二進位制可執行程式,解壓後即可直接使用。下載地址

執行 fun --version 檢查 Fun 是否安裝成功。

$ fun --version
3.6.7

示例

demo 涉及的程式碼,託管在 github 上。專案目錄結構如下:

$ tree -L -a 1

├── index.js
├── package.json
└── template.yml

index.js 中程式碼:

'use strict';
​
var fontList = require('font-list')
​
module.exports.handler = async function (request, response, context) {
 response.setStatusCode(200);
 response.setHeader('content-type', 'application/json');
 response.send(JSON.stringify(await fontList.getFonts(), null, 4));
};

index.js 中藉助 node 包 font-list 列出系統上可用的字型。

template.yml:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  fonts-service: # 服務名
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: fonts example
    fonts-function: # 函式名
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: index.handler
        Runtime: nodejs8
        CodeUri: ./
        InstanceConcurrency: 10
      Events:
        http-test:
          Type: HTTP
          Properties:
            AuthType: ANONYMOUS
            Methods:
              - GET
              - POST
              - PUT

  tmp_domain: # 臨時域名
    Type: 'Aliyun::Serverless::CustomDomain'
    Properties:
      DomainName: Auto
      Protocol: HTTP
      RouteConfig:
        Routes:
          /:
            ServiceName: fonts-service
            FunctionName: fonts-function

template.yml 中定義了名為 fonts-service 的服務,此服務下定義一個名為 fonts-function 的 http trigger 函式。tmp_domain 中配置自定義域名中路徑(/)與函式(fonts-service/fonts-function)的對映關係。

1. 下載字型

你可以通過這裡下載自定義字型 Hack,然後複製字型到 fonts 目錄。

此時 demo 目錄結構如下:

$ tree -L 2 -a
​
├── fonts(+)
│   ├── Hack-Bold.ttf
│   ├── Hack-BoldItalic.ttf
│   ├── Hack-Italic.ttf
│   └── Hack-Regular.ttf
├── index.js
├── package.json
└── template.yml

2. 安裝依賴

$ npm install

3. 部署到函式計算

可以通過 fun deploy 直接釋出到遠端。

4. 預覽線上效果

fun deploy 部署過程中,會為此函式生成有時效性的臨時域名:

開啟瀏覽器,輸入臨時域名並回車:

可以看到字型 Hack 已生效!!!

原理介紹:

  1. fun deploy 時,如果檢測到 CodeUri 下面有 fonts 目錄,則為使用者在 CodeUri 目錄生成一個 .fonts.conf 配置檔案。在該配置中,相比於原來的 /etc/fonts/fonts.conf 配置,添加了 /code/fonts 作為字型目錄。

  2. 自動在 template.yml 中新增環境變數,FONTCONFIG_FILE = /code/.fonts.conf,這樣在函式執行時就可以正確的讀取到自定義字型目錄。

如果依賴過大,超過函式計算的限制(50M)則:

  1. 將 fonts 目錄新增到 .nas.yml;

  2. 將 fonts 對 nas 的對映目錄追加到 .fonts.conf 配置。

fun deploy 對大依賴的支援可參考《開發函式計算的正確姿勢——輕鬆解決大依賴部署》

總結

你只需要在程式碼(CodeUri)目錄新建一個 fonts 目錄,然後複製所有字型到該目錄即可。Fun 會自動幫你處理配置檔案(.fonts.conf),環境變數以及大依賴場景的情況。如果大家在使用 Fun 的過程中遇到了一些問題,可以在 github 上提 issue,或者加入我們的釘釘群進行反饋(釘釘搜尋群號 11721331 即可進群)。