div*_*ery 1 go google-cloud-platform microservices grpc grpc-go
我从 Google Cloud Platform 的微服务演示开始。我很好奇当服务部署在容器中时 gRPC 存根如何工作。
据我了解,特定服务的容器是通过 YAML 配置文件中指定的服务 IP 来寻址的。那么服务的 gRPC 服务器必须监听该服务 IP 吗?但我遇到了以下代码片段:
l, err := net.Listen("tcp", fmt.Sprintf(":%s", port))
if err != nil {
log.Fatal(err)
}
Run Code Online (Sandbox Code Playgroud)
我想知道服务器如何监听没有IP的地址?
:{port}
不是“没有IP的地址”。
Listen的文档包括“如果地址参数中的主机为空或文字未指定的 IP 地址,则 Listen 侦听本地系统的所有可用单播和任播 IP 地址”。
因此,在这种情况下,如果没有主机地址,则有效地址将是0.0.0.0
对应于所有接口的地址。由此推论,人们在使用容器时常犯的一个错误是将其代码绑定到localhost
( 127.0.0.1
),而该代码无法从容器外部访问。
使用0.0.0.0
是一种常见(良好)实践,特别是在使用容器时,因为它有效地将地址绑定委托给容器运行时。
因此,您的应用程序可以{port}
在容器内的所有接口上运行。然后,容器运行时将这些接口(其中一个或多个)绑定到主机的接口,并且您的例如客户端代码连接到主机的 IP 地址。
当您的容器由 Kubernetes 管理时,Kubernetes 会将 IP 地址分配给运行您的应用程序的容器,这些容器通常会使用 Kubernetes 服务资源公开给其他服务,该资源不仅具有 IP 地址,还具有集群 DNS。
{port}
net.Listen