问题背景 最近,在对老项目进行重构工作。在重构过程中发现需要通过 grpc 调用若干远端微服务,远端微服务都有提前定义好的 proto,在运行时(编译通过,运行则panic)出现了 name conflict 冲突问题。也就是说,在运行时报错提示存在相同名称的 message 消息体。 具体报错信息,如下所示: ➜ app > go mod tidy ➜ app > go build main.go ➜ app > ./main api start panic: proto: file "usermgt.proto" has a name conf...
在go中进行编译时,可能会带一些指示条件(如:不同平台、架构等)让编译器选择满足条件的代码参与编译,将不满足条件的代码舍弃。这就是条件编译,也可称为构建(编译)约束。 目前,支持的构建约束有2种使用方式: 1.文件后缀 2.编译标签(build tag) 两者区别: 文件后缀方式多用于交叉编译 (跨平台)。 编译标签方式多用于条件编译 (也可用于交叉编译)。 构建约束官方文档 https://pkg.go.dev/cmd/go#hdr-Build_constraints 文件后缀的使用方式 编译器根据文件后缀来选择具体文件来参与编译操作,格式如下: $filenamePrefix...
每个grpc请求都是 stream,Keepalive 能够让 grpc 的每个 stream 保持长连接状态,适合一些执行时间长的请求。Keepalive 支持在服务端和客户端配置,且只有服务端配置后,客户端的配置才会真正有效。 server 端实现 https://github.com/grpc/grpc-go/blob/master/examples/features/keepalive/server/main.go keepalive配置参数是针对整个连接的 grpc-go基于http/2实现,可以多路复用。即:多个请求复用同一个连接,每个请求都是一个单独的stream pa...