navigation

    golang 開發心得

    2017 跳脫待了 9 年的 .net 開發環境,一方面是想要挑戰自己能接觸到更多的系統架構。另一方面也是受夠了在 mac 裡面安裝 parallels,去處理開發環境限定 windows 的問題。 結果這幾年微軟新 CEO 就做了不少改變,更開放也更接觸 open source,開發跟部屬環境對非 windows 的支援也更全面。我個人對於微軟這次的改變真的是非常欣賞,終於處理了 windows / office 派系問題走向開放。事實也證明結果並沒有讓微軟失去領先地位,而是藉著開發社群 & 雲端創造更多收益。 為什麼選擇 golang 以往都是 C# 的經驗為主,自然在挑選的時候以強型別/編譯式語言為主。大部分數據分析也顯示 go 在執行效能上比 java / C# 更高一個層級。 環境部署原來可以這麼容易 可以不用安裝 .net framework,專案編譯完打包居然丟上去 server 就可以跑。而且只要一個檔案。相對應也節省下了 devops 設定 CI/CD 的繁瑣程度,尤其是當編譯出來檔案需要發佈到多台機器運行環境上的時候。 在 docker 火熱的今天,假設開發後專案都打包成 docker 才做發佈的動作,其實就一樣享有 go 發佈的好處,可以執行於多種運行環境,而且只需要一個二進制檔案就可以上傳到多組環境。 建置速度超快 用 go 開發的專案好多 可以在 github 看到各種套件 / 工具都是用熟悉的語言開發,這真的是一種很讓人開心的事,雖然 90% 的情況下都不會點進去看。但是好像自己也看得懂的那種感覺,真的要體會才知道。 最難以適應的部分 找不到相對應的套件 一開始開發還是使用 web api 的模式,這時候找習慣的對應套件並不是那麼容易,也沒有一套真正主流的 framework。當看到套件控管的部分,dep / vgo / go vendor 還有一堆,各家大神也都擁護不同的工具,真的會有一種無所適從的感覺。

    開始微服務架構

    前置作業 開始進行 microservices 至少要具備的基本建設。 開發相關配置 服務發現 service discovery k8s etcd consul zookeeper Netflix/eureka 事件訊息(非同步訊息) event sourcing messaging kafka NSQ 訊息傳遞(同步訊息) transport grpc thrift http 系統監控 monitor metrics Prometheus Grafana 斷路器 Circuit Breaker 紀錄追蹤 Log Tracking opentracing zipkin Elasticsearch Stackdriver Auth Devops CI / CD Docker k8s golang 相關套件 go-kit https://github.com/go-kit/kit go-micro https://github.com/micro/go-micro gizmo https://github.com/nytimes/gizmo rpcx https://github.

    使用 GVM 管理 go 版本

    基本介紹 GVM 是一套管理 golang 版本的套件,類似於 nodeJS / nvm。 安裝 GVM bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer) 安裝之後應該會在 bashrc 下加入 source 的指令,如果安裝完還是找不到 gvm 指令就需要檢查一下這塊。 source "/Users/<username>/.gvm/scripts/gvm" 首次使用 GVM 使用 GVM 安裝 Go1.4 與之後版本。go1.4 版本之後使用 go 對自己編譯,因此沒有安裝 go 的狀況下之後的版本都是無法編譯的。 gvm install go1.4 --binary # 直接安裝 binary gvm use go1.4 # 使用 go1.4 的環境 export GOROOTBOOTSTRAP=$GOROOT # 設定 $GOROOTBOOTSTRAP gvm install go1.10.3 # 安裝 Go go1.10.3 Installing go1.10.3... gvm install go1.

    在本機安裝 Minikube

    minikube 是 kubernetes 社群推出的的一個輕量型工具,用於在本地端建置模擬 kubernetes 功能。minikube 支援以下幾種 vm driver。 virtualbox(預設值) vmwarefusion kvm2 kvm hyperkit 後續內容預設使用 macOS + virtualbox。 安裝 VM 安裝 kubectl brew install kubernetes-cli 確定安裝版本 kubectl version 如果還沒有啟動 Minikube 這時候會出現 The connection to the server localhost:8080 was refused 的訊息。 安裝 Minikube curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.28.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/ 也可以使用 homebrew 安裝 brew cask install minikube 啟動 Minikube minikube start 如果是第一次啟動,這時候會自動下載 Minikube ISO & kubelet & kubeadm

    安裝和啟用 NSQ 服務

    安裝 NSQ 在本機測試環境 NSQ 本身有提供 brew / docker 版本。在這邊我是直接使用 github 原始碼下載編譯,注意 golang 1.7+ 並且已經有 dep 套件管理。在 test.sh 會執行 golang test & 編譯出所有的可執行檔。 下載 source code & 安裝相依性套件 git clone https://github.com/nsqio/nsq $GOPATH/src/github.com/nsqio/nsq cd $GOPATH/src/github.com/nsqio/nsq dep ensure 測試 & 編譯 ./test.sh 安裝 NSQ 安裝至 /usr/local/bin 目錄 make install 依序啟動服務 nsqlookupd 預設監聽 http:4161 / tcp:4160,而 nsqd 啟動時自動到 nsqlookupd 註冊。 nsqlookupd nsqd --lookupd-tcp-address=127.0.0.1:4160 nsqadmin --lookupd-http-address=127.0.0.1:4161 使用 go-nsq 發布與接受訊息 發佈環境配置 使用在 microservices 中時候,nsqd 建議並不是全部 services 共用,而是個別配置一個 localhost 的 nsqd 註冊到 nsqlookupd。

    Kubernetes

    Cobra 強大的 Golang 命令列工具

    基本介紹 Cobra 是一套可以快速可以快速建立 golang CLI 工具的套件。在 golang 的生態圈內到處都可以看到相關的痕跡。最有名的包含 docker, k8s 都使用 cobra 處理 CLI 介面。 使用方法 安裝 如果已經準備好 go 的環境,只需要執行 go get 就可以將 cobra 加入安裝。 go get -u github.com/spf13/cobra/cobra 建立根命令 cobra init 注意如果目錄下已經有檔案會出現 Cobra will not create a new project in a non empty directory,這時候新開目錄建立之後把全部資料移過來就可以。(需要修改 main.go import 路徑) 應該會建立以下檔案 + cmd root.go + main.go package main func main() { cmd.Execute() } 這時候只要執行 go run main.

    devops

    還不知道怎麼分類

    第一次使用 Hugo 就上手

    基本介紹 Hugo 是一套生成靜態頁面的工具(static site generator)。利用 Markdown 將內容跟樣式外觀完整分開,再利用生成的靜態網頁直接發佈到 server 上。般來說 markdown 語法對應樣式種類會比較少,但是相對的也是幫助在寫作的時候專注在內容而不是樣式上。 與動態的 blog 平台比較 優點 很容易對文章內容進行 git 版控或是多人協作 生成的靜態網頁瀏覽速度很快,也不需要對 server 系統依賴 容易互相在同類型的靜態生成工具之間轉換,只要把 markdown 的文章內容帶著走就好了 缺點 需要熟悉 markdown , git 通常不會有線上編輯模式或是管理平台 如果想要取得流量或讀者留言需要註冊其他服務 第一次安裝 如果是 mac OS 只要執行 brew install hugo 就可以直接安裝完成,之後進入選定好儲存檔案的目錄下 hugo new site <SiteName> 就會建立出預設的檔案目錄 建議第一篇 post hugo new post/my-first-post.md 建立後的 md 檔案產生在 content/post 目錄 選擇 Theme 挑選寫作工具 常用指令 // 建立可以發佈的靜態檔案 hugo // 建立 local 端 server 連同草稿 hugo server --buildDrafts Hugo 官網說明文件 https://gohugo.