gRPC如何知道微服务的服务ip地址

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的地址?

Daz*_*kin 5

:{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。

  1. Kubernetes YAML 可能指定了服务 DNS。
  2. Kubernetes 将 DNS 名称的请求解析为选定的容器(IP 和端口)
  3. 容器运行时将主机端口上的传入请求路由到容器的端口
  4. 您的 gRPC 服务器将在您定义的任何接口上接受来自容器运行时的流量。{port}net.Listen