侧边栏壁纸
博主头像
ZHD的小窝博主等级

行动起来,活在当下

  • 累计撰写 79 篇文章
  • 累计创建 53 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

记一次Nacos 503问题

江南的风
2024-11-05 / 0 评论 / 0 点赞 / 31 阅读 / 3097 字 / 正在检测是否收录...

问题描述

使用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
}

0

评论区