我最近又開(kāi)始玩 go,目前我的任務(wù)是實(shí)現(xiàn)一個(gè)服務(wù)(將運(yùn)行在 k8s 上),它應(yīng)該充當(dāng) gRPC 服務(wù)器。根據(jù)要求,目前,為了滿足 k8s 上的 readinessProbe,我需要為我的服務(wù)實(shí)現(xiàn)一個(gè)健康檢查端點(diǎn),并且應(yīng)該對(duì)此進(jìn)行測(cè)試:我所做的是: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}我按照這篇文章以這種方式進(jìn)行了測(cè)試: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貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
grpcServer.Serve(lis)
是一個(gè)阻塞調(diào)用。所以就像你對(duì) HTTP server 所做的那樣go server.ListenAndServe()
,你需要在一個(gè) goroutine 中運(yùn)行它。你能試試看是否go grpcServer.Serve(lis)
能讓測(cè)試通過(guò)嗎?
我不確定你的新 EDIT 表明問(wèn)題出在聽(tīng)眾身上。您可以檢查是否net.Listen("tcp", fmt.Sprintf(":%d", serverPort))
返回或阻止。
- 1 回答
- 0 關(guān)注
- 105 瀏覽
添加回答
舉報(bào)
0/150
提交
取消