问题
我们的服务一直用 Consul 作为注册中心,在 AWS 和 阿里云上使用的时候,没出现过问题。最近把一些服务迁到腾讯云的时候,遇到一个问题:注册的服务地址都是 127.0.1.1。
127.0.1.1 这个地址我们平时遇到的比较少,这个地址和 127.0.0.1 一样,也是个本地环回地址。
先看看问题。
用 API 看一下服务注册详情:
curl -XGET 127.0.0.1:8500/v1/agent/services
这会列出所有已注册服务的详细信息,每个服务的信息如下所示。
{
"AP-USDT-0": {
"ID": "AP-0",
"Service": "AP-0",
"Tags": [
],
"Meta": {
"TIMESTAMP": "1715337108416"
},
"Port": 9093,
"Address": "127.0.1.1",
"TaggedAddresses": {
"lan_ipv4": {
"Address": "127.0.1.1",
"Port": 9093
},
"wan_ipv4": {
"Address": "127.0.1.1",
"Port": 9093
}
},
"Weights": {
"Passing": 1,
"Warning": 1
},
"EnableTagOverride": false
}
}
比较重要的字段包括服务 ID,服务地址 Address,服务端口 Port。这里可以看到远程服务器注册的服务地址是 「127.0.1.1」。这样的话,访问这个服务的「其他服务」获取到的地址是变成了本地地址,无法访问服务。
服务取到「127.0.1.1」这个地址,先查看一下 /etc/hosts 文件,打开以后,发现有这样两条记录:
127.0.1.1 localhost.localdomain VM-0-12-ubuntu
127.0.0.1 localhost
这里就找到问题了,hosts 第一条记录就是「127.0.1.1」,如果把这条记录注释或者删除是不是就好了?
在这之前,先要把之前注册的无效服务删除。
Consul 删除某个服务
Consul 删除服务有两种方式,一种是用 API,一种是用命令行。
-- 使用 API 删除服务
curl -XPUT "http://10.0.0.12:8500/v1/agent/service/deregister/service-id"
-- 使用命令行删除服务
consul services deregister -id=$id
上面的两种方式,每次都只能删除一条记录,如果要删除所有服务,可以使用下面的命令。
consul catalog services | awk '{print $1}' | while read service; do
consul services deregister -id=$service
done
问题解决
把无效服务删除,修改完 /etc/hosts 文件之后,重启服务,再次查看服务。
curl -XGET 127.0.0.1:8500/v1/agent/services
这次服务注册已经没有问题了,服务注册了正确的地址。
{
"AP-USDT-0": {
"ID": "AP-0",
"Service": "AP-0",
"Tags": [
],
"Meta": {
"TIMESTAMP": "1715337108416"
},
"Port": 9093,
"Address": "10.0.0.13",
"TaggedAddresses": {
"lan_ipv4": {
"Address": "10.0.0.13",
"Port": 9093
},
"wan_ipv4": {
"Address": "10.0.0.13",
"Port": 9093
}
},
"Weights": {
"Passing": 1,
"Warning": 1
},
"EnableTagOverride": false
}
}
关于 127.0.1.1
127.0.0.1 通常被用作回环接口的 IP 地址,而 127.0.1.1 是一种替代方案,它在某些 Linux 发行版中用来标识计算机的主机名(hostname),常被用于本地测试和开发环境中,表示本机自己。
在大多数情况下,我们不需要 127.0.1.1。如果您想在本地测试一个应用程序,您可以使用 127.0.0.1 或者 localhost 来访问它。如果您需要在 Linux 中修改主机名(hostname),可以编辑 /etc/hostname 文件并重启网络服务。
总结
不用的云服务商提供的 Linux 服务器,都对系统做了一些定制,即使是同样的系统,例如 Ubuntu,也会有些许的不同。在进行服务迁移的时候,一些小的问题,也需要花费大力气解决。这种细节必须亲身经历才能体会到,也是开发人员的一种无奈。