我最近又开始玩 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 关注
- 87 浏览
添加回答
举报
0/150
提交
取消