我最近又開始玩 go,目前我的任務是實現一個服務(將運行在 k8s 上),它應該充當 gRPC 服務器。根據要求,目前,為了滿足 k8s 上的 readinessProbe,我需要為我的服務實現一個健康檢查端點,并且應該對此進行測試:我所做的是:func main() { server := startHTTPServer() defer server.Close() c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGINT) <-c log.Println("Stopped")}func startHTTPServer() *http.Server { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) server := &http.Server{ Addr: net.JoinHostPort("", strconv.Itoa(livelinessPort)), } go server.ListenAndServe() return server}我按照這篇文章以這種方式進行了測試:func TestMain(m *testing.M) { flag.Parse() wg := setup() result := m.Run() shutdown(wg) os.Exit(result)}func shutdown(wg *sync.WaitGroup) { syscall.Kill(syscall.Getpid(), syscall.SIGINT) wg.Wait()}func setup() *sync.WaitGroup{ os.Setenv("APP_ENV", EnvTest) wg := &sync.WaitGroup{} startMainProcess(wg) return wg}func startMainProcess(wg *sync.WaitGroup) { go func() { wg.Add(1) defer wg.Done() main() }()}func TestK8SHealth(t *testing.T) { res, err := http.Get("http://:8080/") if err != nil { t.Errorf("Unexpected API error: %s", err) return } defer res.Body.Close() if res.StatusCode != http.StatusOK { t.Errorf("Unexpected status code: %d", res.StatusCode) return }}到目前為止一切順利:$ go testPASS2018/08/13 09:23:16 Stoppedok github.com/... 0.015s
1 回答

慕萊塢森
TA貢獻1810條經驗 獲得超4個贊
grpcServer.Serve(lis)
是一個阻塞調用。所以就像你對 HTTP server 所做的那樣go server.ListenAndServe()
,你需要在一個 goroutine 中運行它。你能試試看是否go grpcServer.Serve(lis)
能讓測試通過嗎?
我不確定你的新 EDIT 表明問題出在聽眾身上。您可以檢查是否net.Listen("tcp", fmt.Sprintf(":%d", serverPort))
返回或阻止。
- 1 回答
- 0 關注
- 108 瀏覽
添加回答
舉報
0/150
提交
取消