问题描述
使用Golang注册Nacos服务,在Nacos管理台可以看到服务IP,表明注册成功,心跳也是正常的。但是通过其他服务调用这个Golang服务时报503错误。
解决过程
服务调用方增加临时接口,查看在Nacos中心获取的服务信息,发现IP列表为空
@RestController
public class ServiceController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/services")
public Map<String, List<String>> getServiceNamesAndIPs() {
Map<String, List<String>> serviceMap = new HashMap<>();
List<String> serviceIds = discoveryClient.getServices();
for (String serviceId : serviceIds) {
List<String> serviceIPs = discoveryClient.getInstances(serviceId)
.stream()
.map(serviceInstance -> serviceInstance.getHost() + ":" + serviceInstance.getPort())
.collect(Collectors.toList());
serviceMap.put(serviceId, serviceIPs);
}
return serviceMap;
}
}
{
"xxx": []
}
断点跟踪Nacos Client代码发现客户端有对实例进行过滤
回到服务台,发现Golang注册时权重设置为0
解决版本
修改Golang服务注册代码逻辑:增加Weight参数
// RegisterInstance 注册实例
func (nc *Client) RegisterInstance(serviceName, ip string, port uint64) error {
param := vo.RegisterInstanceParam{
Ip: ip,
Port: port,
ServiceName: serviceName,
GroupName: nc.NameGroup,
Weight: 1,
Enable: true,
Healthy: true,
Ephemeral: true,
}
success, err := nc.nameClient.RegisterInstance(param)
if !success || err != nil {
return err
}
// 启动心跳保持
go func() {
for {
// 更新实例的信息,包括心跳
_, err = nc.nameClient.UpdateInstance(vo.UpdateInstanceParam{
Ip: LocalMulIPv4(),
Port: port,
ServiceName: serviceName,
Weight: 1,
Enable: true,
Healthy: true,
Ephemeral: true,
})
if err != nil {
logs.Error("更新服务实例失败: %v", err)
}
time.Sleep(10 * time.Second) // 每 10 秒更新一次
}
}()
return nil
}
评论区