今年第一次參加濁水溪以南最大研討會 Mopcon,給了一場議程叫『用 Go 語言打造輕量級 Push Notification 服務』,身為南部人一定要參加 Mopcon,剛好透過此議程順便發佈新版 Gorush,其實今年投稿 Mopcon 最主要是回家鄉宣傳 Google 所推出的 Go 語言,藉由實際案例來跟大家分享如何入門 Go 語言,以及用 Go 語言最大好的好處有哪些。底下是此議程大綱:
Gorush 是一套輕量級的 Push Notification 服務,此服務只做一件事情,就是發送訊息給 Google Andriod 或 Apple iOS 手機,啟動時預設跑在 8088
port,可以透過 Docker 或直接用 Command line 執行,對於 App 開發者,可以直接下載執行檔,在自己電腦端發送訊息給手機測試。藉由這次投稿順便發佈了新版本。底下來說明新版本多了哪些功能。
在此之前 Gorush 只有支援 REST API 方式,也就是透過 JSON 方式來通知伺服器來發送訊息,新版了多了 RPC 方式,這邊我是使用 gRPC 來實作,Gorush 預設是不啟動 gRPC 服務,你必須要透過參數方式才可以啟動,詳細可以參考此文件,底下是 Go 語言客戶端範例:
package main
import (
"log"
pb "github.com/appleboy/gorush/rpc/proto"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
const (
address = "localhost:9000"
)
func main() {
// Set up a connection to the server.
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGorushClient(conn)
r, err := c.Send(context.Background(), &pb.NotificationRequest{
Platform: 2,
Tokens: []string{"1234567890"},
Message: "test message",
})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Success: %t\n", r.Success)
log.Printf("Count: %d\n", r.Counts)
}
目前已經支援 ARM64 的 Docker 版本,所以可以在 ARM64 板子內用 Docker 來執行,可以直接在 Docker Hub 找到相對應的標籤
Gorush 本身支援 Yaml 設定檔,但是每次想要改設定,都要重新修改檔案,這不是很方便,所以我透過 Viper 套件來讓 Gorush 同時支援 Yaml 設定,或 Global 變數,也就是以後都可以透過變數方式來動態調整,有了這方式就可以讓 Docker 透過環境變數來設定。底下是範例讓開發者動態調整 HTTP 服務 Port。請注意所有變數的前置符號為 GORUSH_
$ GORUSH_CORE_PORT=8089 gorush
此版增加了 Kubernetes 設定方式,有了上述的全域變數支援,這時候設定 Kubernetes 就更方便了,請直接參考 k8s 目錄,詳細安裝步驟請參考此說明,底下是透過 ENV 動態設定 Gorush
env:
- name: GORUSH_STAT_ENGINE
valueFrom:
configMapKeyRef:
name: gorush-config
key: stat.engine
- name: GORUSH_STAT_REDIS_ADDR
valueFrom:
configMapKeyRef:
name: gorush-config
key: stat.redis.host
在此之前發送訊息到 iOS 手機,都必須在啟動伺服器前將 iOS 環境設定好,現在可以動態調整 JSON 參數。
{
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 1,
"message": "Hello World iOS!"
}
]
}
可以加上 development
或 production
布林參數,底下是將訊息傳給 iOS 開發伺服器
{
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 1,
"development": true,
"message": "Hello World iOS!"
}
]
}
底下是議程投影片,有興趣的參考看看
https://www.slideshare.net/appleboy/gorush-a-push-notification-server-written-in-go
最後有講到如何部署及測試 Go 語言,這邊講了一下 Drone 這套自動化測試工具。如果大家有興趣可以參考我在 Udemy 開設的課程,目前特價 1600 元。Drone 幫忙開發者自動化測試,部署到 Docker Hub 或編譯出執行檔,這些在 Drone 裡面都可以透過 YAML
來設定,開發者只需要專注於寫程式就可以了。