Minio 從 Docker 容器移除 healthcheck 腳本

minio golang

Minio 是一套開源專案的 Object 儲存容器,如果你有使用 AWS S3,相信要找一套代替 S3 的替代品,一定會想到這套用 Go 語言開發的 Minio 專案。讓您在公司內部也可以享有 S3 的儲存容器,不需要變動任何程式碼就可以無痛從 AWS S3 搬到公司內部。剛好最近在整合 Traefik 搭配 Minio,由於 Minio 原先已經內建 healthcheck 腳本,所以當運行 Minio 時,使用 docker ps 正常來說可以看到類似 Up 7 weeks (healthy) 字眼,但是 Minio 運行了三分鐘之後,狀態就會從 healthy 變成 unhealthy,造成 Traefik 會自動移除 frontend 的對應設定,這樣 Web 就無法顯示了。我在 Udemy 上面有介紹如何用 Golang 寫 healthcheck,大家有興趣可以參考看看,coupon code 可以輸入 GOLANG2019

Continue reading “Minio 從 Docker 容器移除 healthcheck 腳本”

架設 Go Proxy 服務加速 go module 下載速度

golang logo

Go 語言在 1.11 推出 go module 來統一市面上不同管理 Go 套件的工具,像是 dep 或 govendor 等,還不知道如何使用 go module,可以參考之前寫的一篇文章『Go Module 導入到專案內且搭配 Travis CI 或 Drone 工具』,在團隊內如果每個人在開發專案時,都透過網路去下載專案使用到的套件,這樣 10 個人就會浪費 10 個人的下載時間,並且佔用公司網路頻寬,所以我建議在公司內部架設一台 Go Proxy 服務,減少團隊在初始化專案所需要的時間,也可以減少在跑 CI/CD 流程時,所需要花費的時間,測試過公司 CI/CD 流程,有架設 Go Proxy,一般來說可以省下 1 ~ 2 分鐘時間,根據專案使用到的相依性套件用量來決定花費時間。本篇來介紹如何架設 ATHENS 這套開源 Go Proxy 專案。

Continue reading “架設 Go Proxy 服務加速 go module 下載速度”

Go Module 如何發佈 v2 以上版本

golang logo

Go ModuleGolang 推出的一套件管理系統,在 Go 1.11 推出後,許多 Package 也都陸續支援 Go Module 取代舊有的套件管理系統,像是 govendor 或 dep 等,而再過不久之後,保留 vendor 的方式也會被移除,畢竟現在開發已經不需要在 GOPATH 目錄底下了。對於 Go Module 不熟的話,建議先看官方今年寫的一篇教學部落格,底下是教學會涵蓋的範圍

  • Creating a new module.
  • Adding a dependency.
  • Upgrading dependencies.
  • Adding a dependency on a new major version.
  • Upgrading a dependency to a new major version.
  • Removing unused dependencies.

而本篇最主要會跟大家探討如何發佈 v2 以上的套件版本。

Continue reading “Go Module 如何發佈 v2 以上版本”

15 分鐘學習 Go 語言如何處理多個 Channel 通道

golang logo

大家在初學 Go 語言時,肯定很少用到 Go Channel,也不太確定使用的時機點,其實在官方 Blog 有提供一篇不錯的文章『Go Concurrency Patterns: Pipelines and cancellation』,相信大家剛跨入學習新語言時,不會馬上看 Go Channel,底下我來用一個簡單的例子來說明如何使用 Go Channel,使用情境非常簡單,就是假設今天要同時處理 20 個背景工作,一定想到要使用 Goroutines,但是又想要收到這 20 個 JOB 處理的結果,並顯示在畫面上,如果其中一個 Job 失敗,就跳出 main 函式,當然又會希望這 20 個 JOB 預期在一分鐘內執行結束,如果超過一分鐘,也是一樣跳出 main 函式。針對這個問題,我們可以整理需要三個 Channel + 一個 Timeout 機制。

  • 使用 outChan 顯示各個 JOB 完成狀況
  • 使用 errChan 顯示 JOB 發生錯誤並且跳出 main 主程式
  • 使用 finishChan 通知全部 JOB 已經完成
  • 設定 Timeout 機制 (1 秒之內要完成所有 job)

在看此文章之前,也許可以先理解什麼是『buffer vs unbuffer channel』。

Continue reading “15 分鐘學習 Go 語言如何處理多個 Channel 通道”

[Go 語言教學影片] 在 struct 內的 pointers 跟 values 差異

golang logo

Struct MethodGo 語言開發上是一個很重大的功能,而新手在接觸這塊時,通常會搞混為什麼會在 function 內的 struct name 前面多一個 * pointer 符號,而有時候又沒有看到呢?以及如何用 struct method 實現 Chain 的實作,本影片會實際用寄信當作範例講解什麼時候該用 pointer 什麼時候該用用 Value。也可以參考我之前的一篇文章『Go 語言內 struct methods 該使用 pointer 或 value 傳值?

Continue reading “[Go 語言教學影片] 在 struct 內的 pointers 跟 values 差異”

在 appveyor 內指定 Go 語言編譯版本

golang logo

相信比較少人知道 appveyor 這服務,我會接觸到此服務最大的原因是,要提供 Windows 的 Docker Image,並且上傳到 DockrHub,此服務提供了 Windows 環境,讓開發者可以透過此服務編譯 Windows 的 Binary 檔案,並且在 Windows 上執行測試,這對於我在寫 Go 語言開源專案非常有幫助,畢竟平常開發真的沒有 Windows 相關的環境可以使用。但是 appveyor 在更新第三方套件非常的慢,這時候我們想要用 GO 的 1.12 版本就需要自行來安裝,安裝方式其實也不難,請參考底下設定。

Continue reading “在 appveyor 內指定 Go 語言編譯版本”

用 Go 語言讀取專案內 .env 環境變數

golang logo

在現代開發專案時,一定會用到環境變數,像是讀取 AWS Secret Key 等等,在部署上面也會透過設定變數讓專案依據不同環境讀取不同環境變數,而 Go 語言內如何實現讀取環境變數,又可以讓開發者透過 .env 檔案動態改變環境變數,本影片用簡單的套件來實現。這個在其他語言的 Framework 都有實現,像是 Laravel 的 .env 設定。透過本篇例子也教大家如何 import Go 語言的 Package。

Continue reading “用 Go 語言讀取專案內 .env 環境變數”

用五分鐘了解什麼是 unbuffered vs buffered channel

golang logo

本篇要跟大家聊聊在 Go 語言內什麼是『unbuffered vs buffered channel』,在初學 Go 語言時,最大的挑戰就是了解 Channel 的使用時機及差異,而 Channel 又分為兩種,一種是 buffered channel,另一種是 unbuffered channel,底下我來用幾個簡單的例子帶大家了解這兩種 channel 的差異,讓初學者可以很快的了解 channel 使用方式。

Continue reading “用五分鐘了解什麼是 unbuffered vs buffered channel”