记一次使用nacos2踩到的坑

这篇具有很好参考价值的文章主要介绍了记一次使用nacos2踩到的坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文素材来源朋友学习nacos2.1.1踩到的坑。直接上正菜

坑点一:出现端口被占用

因为是学习使用,朋友就在物理机搭建了搭建了nacos伪集群,即ip都一样,端口分别为8848,8847,8849。然而启动nacos服务器后,一台正常启动,其他两台都报了端口被占用

出现这种情况的原因,官网有做了解释

com.alibaba.nacos.api.exception.nacosexception: client not connected, curren,nginx,服务器,运维,springcloud
通过官网我们可以很容易得知,这个端口被占用主要是因为grpc引起的,因为他端口的生成方式,是由主端口+1000、主端口+1001生成。

解决方法

集群的端口不要采用相邻数字,步长尽量搞大点。比如设置为7777、8888、9999之类的

坑二:微服务项目启动出现com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING异常

这个问题出现在朋友在项目中配置的nacos地址为nginx地址,配置示例如下

spring.cloud.nacos.discovery.server-addr=nginx ip

一开始朋友nginx的配置示例如下

upstream nacos-cluster { 
		server 127.0.0.1:7777;
		server 127.0.0.1:8888;
		server 127.0.0.1:9999;
   }
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://nacos-cluster;
        }
        }

浏览器通过nginx访问没问题,但是项目中把nacos服务地址配置为nginx ip就报了

com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING

这个异常信息,后面朋友查资料,官网上有写

com.alibaba.nacos.api.exception.nacosexception: client not connected, curren,nginx,服务器,运维,springcloud
于是他就将转发方式改为TCP,他的nginx版本是1.9+以上版本,默认就支持TCP代理了,不用额外安装stream模块。nginx配置TCP的示例形如下


stream {
	upstream nacos-cluster-grpc{
	    # nacos2版本,grpc端口与要比主端口多1000,主端口为777788889999
	    server 127.0.0.1:8777;
		server 127.0.0.1:9888;
		server 127.0.0.1:10999; 
	}
	server{
	   listen 9848;
        proxy_pass nacos-cluster-grpc;
	}
}

当朋友配置好nginx tcp代理转发后,通过telnet命令

telnet 127.0.0.1 9848

来看是否能正常转发给nacos服务端,经过验证,网络可以连通。接着朋友在微服务项目的nacos配置填写如下地址

spring.cloud.nacos.discovery.server-addr=127.0.0.1:9848 #nginx代理tcp的地址

本来以为万事大吉,结果项目一启动,仍然报

com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING

于是朋友懵了,啥情况?就来找我交流一下
com.alibaba.nacos.api.exception.nacosexception: client not connected, curren,nginx,服务器,运维,springcloud
其实在nacos官网的FAQ就有提到相应的解题思路了

com.alibaba.nacos.api.exception.nacosexception: client not connected, curren,nginx,服务器,运维,springcloud
因为我们在nginx配置的代理tcp端口为9848,这个端口可以看成是grpc的端口,因为grpc的端口 = nacos主端口 + 1000,因此我们套这个公式就可以得出,nacos的主端口为 = 9848 - 1000 = 8848,而我们微服务项目配置nacos端口,其实配置是主端口,因此实际上我们配置要写成

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 #nginx代理tcp端口 - 1000

配置这个后,果然成功注册。这个思路是官网带给我们的,但作为一个有点追求的程序员应该不会仅仅满足与此,我们可以直接根据控制台报出的异常来获取答案

异常排查过程就省略了,直接贴出关键的解题代码

1、首先解析主端口号的核心代码

位置在

com.alibaba.nacos.common.remote.client.RpcClient#resolveServerInfo
ServerInfo private RpcClient.ServerInfo resolveServerInfo(String serverAddress) {
        Matcher matcher = EXCLUDE_PROTOCOL_PATTERN.matcher(serverAddress);
        if (matcher.find()) {
            serverAddress = matcher.group(1);
        }

        String[] ipPortTuple = serverAddress.split(":", 2);
        int defaultPort = Integer.parseInt(System.getProperty("nacos.server.port", "8848"));
        String serverPort = (String)CollectionUtils.getOrDefault(ipPortTuple, 1, Integer.toString(defaultPort));
        return new RpcClient.ServerInfo(ipPortTuple[0], NumberUtils.toInt(serverPort, defaultPort));
    }

2、其次设置grpc端口的核心代码

位置在:

com.alibaba.nacos.common.remote.client.grpc.GrpcClient#connectToServer

com.alibaba.nacos.api.exception.nacosexception: client not connected, curren,nginx,服务器,运维,springcloud
端口设置就是在截图圈红部分,然后从this.rpcPortOffset()我们可以发现

public int rpcPortOffset() {
        return Integer.parseInt(System.getProperty("nacos.server.grpc.port.offset", String.valueOf(Constants.SDK_GRPC_PORT_DEFAULT_OFFSET)));
    }

这个偏移量是可以通过nacos.server.grpc.port.offset进行修改,不修改默认就是1000。因此跟踪源码,我们可以得出另外一种解法。在微服务的nacos配置仍然填代理的nginx 的tcp地址,示例

spring.cloud.nacos.discovery.server-addr=127.0.0.1:9848 #nginx代理tcp的地址

同时启动的时候,加上

-Dnacos.server.grpc.port.offset=0

或者在主启动类硬编码也 可以

    System.setProperty("nacos.server.grpc.port.offset","0");

注: 这边很重要的细节点就是:GRPC port = 主端口 + grpc端口偏移量,这个计算出来的端口值要和nginx代理tcp 端口值相等。

总结

因为朋友用的是目前最新版的nacos2,所以有些问题搜索引擎不是那么好找答案,因此遇到这种问题,最好的解题思路就是官网和相应的github,还有就是源码跟踪了。

后面那个
Client not connected, current status:STARTING,其实还有一种解法,就是把客户端版本调低到1.x版本,因为这个问题本质上是连接不上grpc问题,因此我们可以不用grpc,直接用http就好了,而2.x服务端版本是同时支持http和grpc,因此客户端版本调成1.x,他就是以http的方式和服务端进行交互。不过是不建议这么做,因为你升级了2.x,有一方面就是为高性能,如果把版本降低,那还不如直接使用1.x就好了。

还有文中的那两种解法,我个人是建议不要改偏移量,直接通过主端口 + 1000这种方式去算就好了

附录

本文很多关于nacos2解题思路都是出自官网这篇文章

https://nacos.io/zh-cn/docs/2.0.0-compatibility.html文章来源地址https://www.toymoban.com/news/detail-737381.html

到了这里,关于记一次使用nacos2踩到的坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记一次Nacos线程数飙升排查

    近日有个项目用到了Nacos做注册中心。运行一段时间发现Nacos服务的线程数达到了1k+。这肯定是不正常的。 环境: 镜像nacos-server 2.2.3 docker-compose编排部署 Nacos standalone模式 问题表现 docker stats nacos 发现该容器的线程数1k+ 用Fastthread分析stack文件表现如下 数量最多的线程线程栈如

    2024年02月09日
    浏览(46)
  • nacos2.1.1版本,作为注册中心,配置中心如何使用,nacos服务端启动,微服务搭建,nacos集群化部署

    关于nacos 相信大多数人一样,在接触微服务的时候知道有Netflix系列和alibaba系列 但是Netflix这一套如今由于部分组件不在开源,又有alibaba这一套的出现,市面上,alibaba系列微服务架构已经是最火热的了,而nacos则是alibaba系列组件充当服务注册发现和配置中心的角色 说白了,就是将每个

    2024年02月03日
    浏览(49)
  • Nacos2.2使用PostgreSQL数据源插件存储数据手把手教程

    Nacos2.2在2022年的12月份正式发布了,该版本可以让开发者开发支持PostgreSQL数据库的插件,从而实现将配置信息存储到PostgreSQL中。 本文基于自己开发的PostgreSQL数据源插件进行说明,希望可以帮助到大家。 数据源插件开源仓库地址: https://github.com/wuchubuzai2018/nacos-datasource-exte

    2024年02月03日
    浏览(38)
  • 使用docker安装nacos2.0,解决nacos-logback.xml (No such file or directory)

    查看nacos日志 可能会报错说没有nacos-logback.xml 在/var/nacos/conf/nacos-logback.xml中添加如下代码 注意第四行value=“/home/nacos/logs/logback.log”,其中引号内填写的和上面maven启动配置的需要一致 重启docker-nacos 查看nacos日志

    2024年02月16日
    浏览(45)
  • nacos2..0.3下载教程

    进入nacos快速开始,找到最稳定版本,说白了,还是在GitHub上下载,GitHub的速度想必大家都清楚,非常慢。 然后经过九牛二虎之力进去之后,找到nacos-server-2.2.0 zip这是Windows版本的,应该适用于大部分人。 但是GitHub上面下载的比较慢,所以我就在网上找了一些资料,下载nac

    2024年02月13日
    浏览(45)
  • Nacos2.2.1 集群搭建

    Nacos默认端口是8848,2.0版本后另外还占用9848,9849两个端口,这两个是gRPC端口,用于服务端与客户端通讯,所以在单机上配置集群节点,节点要配置的端口不能连续,否则在启动时报端口占用的错误。 端口 与主端口(8848)偏移量 作用 9848 1000 客户端gRPC请求服务端口,用户客

    2024年02月12日
    浏览(35)
  • 记一次MOXA串口服务器使用

    AIS船台——天线——AIS基站——网线——交换机——服务器 AIS船台——天线——AIS基站——串口线——串口服务器——网线——交换机——服务器 串口线分为RS-485、RS-422、RS-232,此处以RS-232为例 串口线:一端为RS232连接头,用于连接串口服务器 一端为裸露的电线纤芯头,用

    2024年02月03日
    浏览(85)
  • 记一次在uniapp中使用websocket

    WebSocket是一种在Web应用程序中实现双向通信的技术,它允许服务器和客户端之间实时交换数据。近期在项目中使用websocket的一个过程,以及遇到的一些问题的解决思路。 连接的建立,处理消息的发送,接收 打开报错关闭监听,报错监听。 建立连接,连接已建立时监听WebSoc

    2024年02月01日
    浏览(45)
  • springboot整合nacos2.2.3

    注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。 我这个用的是 springboot2.3.12.RELEASE、服务端Nacos2.2.3 下载Nacos: https://github.com/alibaba/nacos/releases 我这里下载的是最新版本2.2.3 上传服

    2024年02月09日
    浏览(53)
  • liunx 安装 nacos2.1.0

    1. 下载nacos包 nacos下载的地址– https://github.com/alibaba/nacos/releases 找到你喜欢的包(我喜欢nacos2.1.0)。 2. 上传到服务器的 /opt 目录 我个人比较喜欢在opt目录下搞,你们可以自己定咯。 3. 找数据库包 那个数据库包就在 /opt/nacos/conf/nacos-mysql.sql,我们在mysql新建一个nacos的数据库,把

    2024年02月06日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包