workbunny/webman-nacos插件心跳报错

kylin87

问题描述

nacos那边可以看到服务,但是健康状态在1和0来回变更,查看日志,一直有这条日志的报错。
本身使用没什么问题,可以使用

日志

default.ERROR: Nacos instance heartbeat failed: [0] caused: errCode: 400, errMsg: Current service DEFAULT_GROUP@@finance is persistent service, can't register ephemeral instance. ;. {"name":"main","trace":[]}

是不是webman这边要实现什么功能啊

864 4 0
4个回答

chaz6chez

提供一下nacos版本、php版本、插件版本、运行环境

  • chaz6chez 2023-12-06

    另外,可以先尝试将配置文件中的ephemeral字段的值改成字符串类型,比如'false'

  • kylin87 2023-12-07

    插件版本是1.2.2,我看默认这个字段就是字符串类型的'false'
    nacos版本是2.2.3 php版本是8.1。环境是centos7.6

kylin87

插件版本是1.2.2,我看默认这个字段就是字符串类型的'false'
nacos版本是2.2.3 php版本是8.1。环境是centos7.6

  • kylin87 2023-12-07

    我看了源码,请求的nacos接口,都是v1,目前nacos比较新的版本都是2.x.x,2.x的文档,没有心跳的api,是不是因为这个原因。但是我看v2的文档,它是兼容v1的

  • chaz6chez 2023-12-08

    你的这个是因为之前注册的是临时实例,将临时实例修改为非临时实例时,nacos会报400错误,具体可自行百度can't register ephemeral instance相关内容

  • kylin87 2023-12-08

    ephemeral这个字段一直都默认的‘false’,应该是注册的非临时实例吧。非临时实例需要心跳吗

  • chaz6chez 2023-12-08

    非临时需要心跳

  • kylin87 2023-12-08

    按照目前的条件,ephemeral这个字段一直都默认的‘false’,应该是注册的非临时实例吧。心跳的发送信息,我也打印看了,也是非临时实例的心跳。但是还是提示service DEFAULT_GROUP@@finance is persistent service, can't register ephemeral instance

  • kylin87 2023-12-08

    按照网上的说法,把raft文件夹内的清除,重启nacos。其实并未解决问题。因为从开始就注册的非临时实例,后续发送的心跳也是非临时实例的心跳参数,目前还是这个错误日志。但是我觉得应该不是该插件的问题了

  • kylin87 2023-12-08

    基本确定是nacos-server的问题了,我这边把nacos版本换成了2.0.3后,就没有上述问题了。

  • kylin87 2023-12-08

    不过又出现了,之前出现过的问题。就是之前发过的问题。https://www.workerman.net/q/11680

  • chaz6chez 2023-12-08

    你是使用的配置文件默认进行注册实例,还是通过自己代码实现的方式自行自定义注册的?

  • kylin87 2023-12-08

    配置文件默认进行注册的,没有自定义注册过

  • kylin87 2023-12-08

    我这边经过多个nacos-server版本的测试。2.0.3及之前的,没有 is persistent service, can't register ephemeral instance这个报错,但是会出现2个实例,1个健康,1个不健康这个问题。2.0.3之后的,没有这个2个实例的问题,但是会出现is persistent service, can't register ephemeral instance

  • kylin87 2023-12-08

    对了,我是用docker运行的nacos-server

  • chaz6chez 2023-12-08

    稍安勿躁,在修复

  • kylin87 2023-12-08

    好的,感谢感谢,辛苦了。我这边查了一些资料,资料上说,对于临时实例,需要服务提供者主动向nacos发送心跳,5s一次,15s不发,就从服务中剔除。对于永久实例,变成了由nacos主动探测服务提供者,它的探测周期是 2000 毫秒 + 随机数(5000 毫秒以内),如果检测异常会将此服务实例,标记为非健康实例,但不会把服务实例向临时实例那样进行删除。

  • kylin87 2023-12-08

    在nacos2.0.4版本下,我尝试在app.php中将要注册的实例,'ephemeral' => 'true',主动标记为临时实例,则一切正常了,也不会出现心跳的错误日志了。可能变相的说明,对于永久实例,是不需要服务提供者主动心跳的
    以上猜测,仅供参考,对nacos,我还是初学者

  • kylin87 2023-12-08

    我好像找到原因了。根据上面的规则,永久实例是需要接受探测的,因为我的nacos是在容器内,如果配置的是127.0.0.1的话,nacos容器对宿主机的探测肯定是失败的,我调整后,让容器可以访问宿主后,这个永久实例开始保持健康了,但是日志中仍然有主动心跳报错的日志,应该是需要移除那些永久实例的主动心跳

  • kylin87 2023-12-08

    总的来说,如果nacos部署在docker的话,永久实例要保证容器内的nacos可以访问到服务提供者,这种容器内的nacos-server其实建议直接使用临时实例即可。
    如果nacos是单独部署的,或者mse的这种,可以使用永久实例,但是最好等待插件修复永久实例主动心跳的bug

  • chaz6chez 2023-12-08

    更新使用1.2.3版本即可

  • chaz6chez 2023-12-08

    总的来说,如果nacos部署在docker的话,永久实例要保证容器内的nacos可以访问到服务提供者,这种容器内的nac> os-server其实建议直接使用临时实例即可。
    如果nacos是单独部署的,或者mse的这种,可以使用永久实例,但是最好等待插件修复永久实例主动心跳的bug

    其实也不是,因为本地测试时候下意识会注册127.0.0.1,所以nacos如果在docker容器中会探测不到,但在实际生产环境中,填写127.0.0.1的场景基本上不存在,所以大可不必担心;
    而当nacos使用docker进行本地开发环境部署的时候,为了保持统一,大概率其他项目也会同时使用docker环境,所以如果想要在开发环境中使用,其实注册的时候通过host.docker.internal即可

  • kylin87 2023-12-08

    非常感谢。另外,1.2.3版本出现了较大的bug,我已经提交了pr尝试修复,再次感谢

  • chaz6chez 2023-12-08

    已合并,发布了1.2.4

kylin87

心跳的发送信息如下:

{
  ["serviceName"]=>
  string(11) "finance"
  ["ip"]=>
  string(9) "127.0.0.1"
  ["port"]=>
  int(9514)
  ["groupName"]=>
  string(13) "DEFAULT_GROUP"
  ["namespaceId"]=>
  string(0) ""
  ["ephemeral"]=>
  bool(false)
  ["beat"]=>
  string(58) "{"ip":"127.0.0.1","port":9514,"serviceName":"finance"}"
}
  • chaz6chez 2023-12-08

    心跳发送信息ephemeral字段时bool,你改成字符串类型,再次尝试

  • kylin87 2023-12-08

    我手动通过文档的参数,自行发心跳,bool和字符串,都是同样的返回那个错误

kylin87

截图
截图

  • 暂无评论
×
🔝