摸索學習並了解何謂 Serverless ,並對這個服務感到十分期待
從宣傳上來說,開發者不必擔心伺服器的問題,只需要專注於程式應用開發上
從以往自己架設簡單伺服器、簡單雲服務、最終通通交給服務商了

嘗試練習寫一個簡單的 API 服務,看看丟到 GCP 上面會是怎麼樣的效果

建立專案

首先進入 GCP 選取 Cloud Functions

透過 建立 按鈕,進行專案創建

按照需求輸入 專案名稱,並進行建立

由於 GCP 需要有信用卡才能進行使用,當然第一次使用的朋友

Google 很棒的有提供 300 美金為期 1 年的免費使用可以讓你嘗試是否要使用 GCP

然後開始輸入帳單帳戶,這邊可以選擇貨幣單位,那後面的信用卡資訊我在此就跳過

最後回到 Google Cloud Functions

使用 建立函式 開始建構自己的 functions

建立 Google Cloud Functions 函式

可以設定這一個 functions 的 名稱 記憶體 觸發條件

這邊 觸發條件 我選擇 HTTP ,用比較簡單的觸發方式,以後再研究其他的觸發方式

並且會有一個網址之後可以進行觸發,並且需要勾選 允許未經驗證的叫用 方便進行呼叫,但是不公開就不要勾選

這邊為了方便進演示,就使用內嵌編輯器方便展示

裡面預設的程式是一個很普遍的 Hello World!

也對選項 要執行的函式:HelloWorld

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Package p contains an HTTP Cloud Function.
package p

import (
	"encoding/json"
	"fmt"
	"html"
	"net/http"
)

// HelloWorld prints the JSON encoded "message" field in the body
// of the request or "Hello, World!" if there isn't one.
func HelloWorld(w http.ResponseWriter, r *http.Request) {
	var d struct {
		Message string `json:"message"`
	}
	if err := json.NewDecoder(r.Body).Decode(&d); err != nil {
		fmt.Fprint(w, "Hello World!")
		return
	}
	if d.Message == "" {
		fmt.Fprint(w, "Hello World!")
		return
	}
	fmt.Fprint(w, html.EscapeString(d.Message))
}

執行階段我選擇 Golang,當然還支援 Nodejs Python

不過有版本的限制,需要確認版本是否符合需求

這邊可以選擇伺服器的位置,我在此選擇亞洲

然後可以看到函式正在建立的轉圈圈

沒有問題會看到函式建立完成的綠色勾勾,如果有問題就不會是綠色勾勾

然後點擊名稱可以進入這個 function 的 Dashboard

這邊簡單說明,在 一般 的頁面中

可以看到透過點選紅圈來觀看叫用 執行時間 記憶體 啟用中的執行個體

基本上該顯示的資訊都有提供給使用者

使用 Google Cloud Functions 函式

進入 觸發條件 的頁面

我們可以看到網址,這邊可以進行連線看看

此專案為練習用,所以會進行刪除,請使用自己的網址進行連線

正常顯示預設的 HelloWorld 函式

這邊我想要改變要執行的函式內容,透過 編輯 進入編輯頁面

更改成可以接受 GET POST Other 的簡單回應

function 名稱更改成 Example 所以要執行的函式也要對應更改成 Example

確定之後就開始 部屬,如果有錯誤會告知,那再請透過錯誤資訊進行除錯

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Package p contains an HTTP Cloud Function.
package p

import (
	"fmt"
    "io/ioutil"
	"net/http"
)

func Example(w http.ResponseWriter, r *http.Request) {
	switch r.Method {
	case "POST":
        defer r.Body.Close()
		con, _ := ioutil.ReadAll(r.Body)
		fmt.Fprint(w, string(con))
	case "GET":
		query := r.URL.Query()
		id := query.Get("id")
		fmt.Fprint(w, id)
	default:
		fmt.Fprint(w, r.Method)
	}
}

費用

請參考官方 Cloud Functions 定價

透過 叫用次數 運算時間 記憶體 CPU 進行費用計算

當然使用者付費,整體價格上的費用肯定會比雲端伺服器來的便宜很多

心得

這是一個簡單的練習,從這邊應該可以感受到不用去維護 伺服器 網路 等等相關

只需要專注開發功能剩下丟給提供商進行佈署,省下很多硬體層面的問題

參考資料

  1. Cloud Functions 定價