Go语言 gRPC如何知道微服务的服务IP地址

6rqinv9w  于 2023-01-15  发布在  Go
关注(0)|答案(1)|浏览(313)

我从Google云平台的microservice demo开始,我很好奇当服务部署在容器中时gRPC存根是如何工作的。
据我所知,一个特定服务的容器是由YAML配置文件中指定的服务IP来寻址的。因此,服务的gRPC服务器必须监听服务IP。但我遇到了下面的代码片段:

l, err := net.Listen("tcp", fmt.Sprintf(":%s", port))
if err != nil {
    log.Fatal(err)
}

我想知道服务器如何监听没有IP的地址?

ddrv8njm

ddrv8njm1#

:{port}不是“没有IP的地址”。
Listen的文档包括“如果address参数中的主机为空或为文本未指定的IP地址,Listen将侦听本地系统的所有可用单播和任意播IP地址”。
因此,在这种情况下,如果没有主机地址,有效地址将是0.0.0.0,它对应于所有接口。因此,人们在使用容器时经常犯的一个错误是将代码绑定到localhost127.0.0.1),而localhost无法从容器外部访问。
使用0.0.0.0是一种常见的(良好的)实践,特别是在使用容器时,因为它有效地将地址绑定委托给容器运行时。
因此,您的应用在{port}上的容器内所有接口上运行。然后,容器运行时将这些接口(一个或多个)绑定到主机接口,您的客户端代码将连接到主机的IP地址。
当您的容器由Kubernetes管理时,Kubernetes会为运行您的应用的容器分配IP地址,这些地址通常会通过Kubernetes服务资源暴露给其他服务,该资源不仅具有IP地址,还具有群集DNS。

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

相关问题