我从Google云平台的microservice demo开始,我很好奇当服务部署在容器中时gRPC存根是如何工作的。
据我所知,一个特定服务的容器是由YAML配置文件中指定的服务IP来寻址的。因此,服务的gRPC服务器必须监听服务IP。但我遇到了下面的代码片段:
l, err := net.Listen("tcp", fmt.Sprintf(":%s", port))
if err != nil {
log.Fatal(err)
}
我想知道服务器如何监听没有IP的地址?
我从Google云平台的microservice demo开始,我很好奇当服务部署在容器中时gRPC存根是如何工作的。
据我所知,一个特定服务的容器是由YAML配置文件中指定的服务IP来寻址的。因此,服务的gRPC服务器必须监听服务IP。但我遇到了下面的代码片段:
l, err := net.Listen("tcp", fmt.Sprintf(":%s", port))
if err != nil {
log.Fatal(err)
}
我想知道服务器如何监听没有IP的地址?
1条答案
按热度按时间ddrv8njm1#
:{port}
不是“没有IP的地址”。Listen的文档包括“如果address参数中的主机为空或为文本未指定的IP地址,Listen将侦听本地系统的所有可用单播和任意播IP地址”。
因此,在这种情况下,如果没有主机地址,有效地址将是
0.0.0.0
,它对应于所有接口。因此,人们在使用容器时经常犯的一个错误是将代码绑定到localhost
(127.0.0.1
),而localhost
无法从容器外部访问。使用
0.0.0.0
是一种常见的(良好的)实践,特别是在使用容器时,因为它有效地将地址绑定委托给容器运行时。因此,您的应用在
{port}
上的容器内所有接口上运行。然后,容器运行时将这些接口(一个或多个)绑定到主机接口,您的客户端代码将连接到主机的IP地址。当您的容器由Kubernetes管理时,Kubernetes会为运行您的应用的容器分配IP地址,这些地址通常会通过Kubernetes服务资源暴露给其他服务,该资源不仅具有IP地址,还具有群集DNS。
1.容器运行时将主机端口上的传入请求路由到容器的端口
1.您的gRPC服务器将在
{port}
上的 * 任何 * 接口上接受来自容器运行时的流量,您已将该接口定义为net.Listen
。