- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我最近又开始玩 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
}
我按照this article这样测试的:
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 test
PASS
2018/08/13 09:23:16 Stopped
ok github.com/... 0.015s
问题是当我尝试在主应用程序中添加 gRPC 服务器时,遵循 gPRC go examples .我已将其添加到我的主文件中
func main() {
[...]
startChecksServiceServer()
[...]
}
func startChecksServiceServer() *grpc.Server {
flag.Parse()
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", serverPort))
if err != nil {
log.Fatalf("Starting gPRC server error: failed to listen port %d: %v", serverPort, err)
}
grpcServer := grpc.NewServer()
pb.RegisterChecksServiceServer(grpcServer, &checksServiceServer{})
grpcServer.Serve(lis)
log.Println("Started grpc server")
return grpcServer
}
但现在当我运行测试时,在实际测试运行后,当发送中断信号时,它失败了。
$ go test
PASS
signal: interrupt
FAIL github.com/... 0.016s
我做了一些测试,这并不取决于实际测试(因为它通过了一个测试函数,它只是 return
,并且它在使用 goLand 运行测试套件时工作:
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/marco/Documents/projects/go #gosetup
/usr/local/go/bin/go test -c -i -o /private/var/folders/jh/znhv9f090yb7y390dckb23s00000gn/T/[...] #gosetup
/usr/local/go/bin/go tool test2json -t /private/var/folders/jh/znhv9f090yb7y390dckb23s00000gn/T/[...] -test.v -test.run
^TestK8SHealth$ #gosetup
=== RUN TestK8SHealth
--- PASS: TestK8SHealth (0.00s)
PASS
Process finished with exit code 1
--- 编辑
我发现问题出在监听器周围。在主要功能中有:
func main() {
net.Listen("tcp", fmt.Sprintf(":%d", serverPort))
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
<-c
log.Println("Stopped")
}
而只有返回的测试(与前一个设置相同)将导致测试失败:
$ go test -v
=== RUN Test2
--- PASS: Test2 (0.00s)
PASS
signal: interrupt
FAIL github.com/[...] 0.014s
最佳答案
grpcServer.Serve(lis)
是一个阻塞调用。因此,就像您对 HTTP 服务器 go server.ListenAndServe()
所做的一样,您需要在 goroutine 中运行它。你能试试 go grpcServer.Serve(lis)
是否能让测试通过吗?
我不确定你的新 EDIT 表明问题出在听众身上。您可以检查 net.Listen("tcp", fmt.Sprintf(":%d", serverPort))
是返回还是阻塞。
关于testing - Go gRPC 服务器使集成测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51819159/
关于 gRPC Health Checking ,如果 gRPC 服务托管在与其他也需要健康检查的 HTTP 服务相同的端口上,则对 grpc.health.v1.Health.Check 的响应应该
我的项目是读取服务器中的图像,进行一些处理,然后将整个图像传递给客户端。客户端占用图像并进行更多处理,并将一些输出值返回给服务器。服务器和客户端之间使用的图像大小为 [640x480x3]。 以下是我
gRPC 基于 HTTP/2,它(假设)被浏览器广泛支持。因此,我觉得从浏览器使用 gRPC 应该没有问题。 但是,很明显存在问题。协议(protocol),grpc web , 是不同的,因为“由于
关于服务器端代码的幂等性的问题,或者说它的必要性。对于一般的 gRPC,或者专门针对 java 实现。 当我们从客户端发送消息一次时,是否有可能由我们的服务实现处理两次?也许这与服务似乎不可用时的重试
假设我想使用 Grpc Server 流式传输或双向流式传输。 考虑到它在底层使用 http/2,流可以持续多长时间是否有任何限制? 如果是的话,它可以用来代替消息总线,这样流就可以打开并存活多久?
使用 gRPC 向客户端发送有关错误的更多详细信息的模式是什么? 例如,假设我有一个用于注册用户的表单,用于发送消息 message RegisterUser { string email = 1
我是 GRPC 的新手。我想知道当 GRPC 客户端启动一个请求时,服务器是否启动一个新线程来处理。 最佳答案 最多可能有一个 Runnable加入 Server's executor用于申请处理。每
我想传输一个 int64 数组。 我查了一下如何使用它。在我的原型(prototype)文件中,我需要一个流: service myService { rpc GetValues(myRequ
通常,客户端可以通过以下方式取消 gRPC 调用: (requestObserver as ClientCallStreamObserver) .cancel("Cancelled", nul
在 100Gb 网络上,我创建了一个服务器来监听 4 个端口,grpc 客户端可以达到 3GB+/s 的吞吐量。然而,当服务器监听一个端口时,grpc 客户端达到了 1GB/s 的吞吐量,即使我设置了
我想验证调用并可能在服务器拦截器中回答错误。有没有办法做到这一点?如果是,我该如何实现? 最佳答案 简单地从拦截器响应 RPC,可能通过调用 close() ,不要调用next .您仍然需要返回一个监
我有一个 GRPC API,经过重构,一些包被重命名。这包括我们定义 API 的原型(prototype)文件之一中的 package 声明。像这样的: package foo; service Ba
我想在 Ubuntu 上使用源代码中的所有子模块编译 grpc,并将其安装到/usr/local 以外的指定位置 为提供的 Makefile 指定此位置的方法是什么(类似于配置脚本的 --prefix
我不断在控制台中收到此警告: DeprecationWarning: grpc.load: Use the @grpc/proto-loader module with grpc.loadPackag
上下文 我正在尝试使用 Google 的 Cloud Natural Language API。我有我的服务帐户 key JSON 文件,并且正在尝试编写一个简单的 .NET Core 应用程序(更具
用户在测试中遇到了此崩溃。我的第一个猜测是这与内存有关,但除此之外我没有什么可做的。更深入地研究代码,我认为这可能是主线程问题,但看起来监听器在后台线程上被删除,所以我怀疑这就是原因。 我认为在应用程
我正在编写一个 grpc 服务并在 Kubernetes (https://github.com/grpc-ecosystem/grpc-health-probe) 上使用 gRPC 健康检查。在我的
如何使用 gRPC-java 实现检测网络错误并尝试从中恢复的策略?我知道 UNAVAILABLE 状态可能意味着网络错误,但这并没有告诉我它是哪种网络错误 - 并且 UNAVAILABLE 也可以从
假设我们有一个 Search-Service service Search { rpc Search (SearchRequest) returns (SearchReply) {} } mess
如果浏览器支持http/2,为什么 grpc-web 需要 envoy 代理? 不支持 http/2 的旧浏览器是否只需要它? 最佳答案 回答于 https://github.com/grpc/grp
我是一名优秀的程序员,十分优秀!