初搭建Nacos你可能会踩进的坑(Windows)

本文记录了在Windows环境下搭建Nacos注册中心过程中遇到的问题及其解决办法,并介绍了如何将Spring Boot项目与Nacos进行集成,包括解决启动过程中的配置错误。

此文章描述本人参考Nacos官网以及一些博客文章,springboot项目转型springcloud时,在windows下搭建Nacos注册中心时遇到的坑,以作分享。

1、Nacos启动报错

进入Nacos官网置顶的Github下载链接后,在需要的Nacos版本中,找到 Assets 下的.tar.gz文件,点击即可下载。下载完成后解压进入bin目录下,双击点击startup.cmd,即可启动Nacos。出现下图日志则表示启动成功。

按照官网以及一些博客文章,完成以上步骤即可启动Nacos。

此时我却出现如下报错:

具体原因报错:

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:156)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)
......(此处开始省略)

 经过研究,解决方案为:

方法一:

编辑startup.cmd,将

set MODE="cluster"

改为

set MODE="standalone"

方法二:

用命令窗口,进入到安装路径的bin目录下,执行:

sh startup.sh -m standalone

报错原因:

因为当前电脑中Nacos没有配置集群模式,而是使用的单机模式,将MODE修改为standalone。使用cluster则会报错。

2、使用srringboot项目注册到nacos,启动时报错

将Springboot项目接入nacos,据一些博客文章所述,需要调整一下文件:

pom.xml 加入nacos相关依赖代码:

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2021.1</version>
        </dependency>

项目配置文件加入nacos配置代码:(我把它写在了application.yml)

spring:
  application:
    name: first-server
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_HOST:pigx-register}:${NACOS_PORT:8848}
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yml

NACOS_HOST: 127.0.0.1

启动类加入发现注册注解:

@EnableDiscoveryClient

启动。本以大功告成,结果问题还多着呢

问题一:

启动时报以下错误,导致无法启动

WARN 14272 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nacosConfigManager' defined in class path resource [com/alibaba/cloud/nacos/NacosConfigAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alibaba.cloud.nacos.NacosConfigManager]: Factory method 'nacosConfigManager' threw exception; nested exception is com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureException: java.lang.reflect.InvocationTargetException

原因:发现了 Nacos 的启动注解,却找不到 Nacos 的相关配置导致。导致出现在这样错误的原因是因为我吧相关配置写到了原有的 application.yml 配置文件里边。可能是加载顺序的问题,生成 nacosConfigProperties 时 application.yml 还没有读取。解决方法是新建 bootstrap.yml 文件,把 Nacos 相关配置放到 bootstrap.yml 里。因为 bootstrap.yml 的加载优先级高于 application.yml。

之后则顺利启动原先springboot项目啦。

此时产生新的问题,Nacos 却没有连接上。

问题二:

代码虽然顺利跑了起来,但是却出现报错,大意为 Nacos 连接出现了异常,具体报错如下:

ERROR 19068 --- [           main] c.a.cloud.nacos.discovery.NacosWatch     : namingService subscribe failed, properties:NacosDiscoveryProperties{serverAddr='localhost:8848', endpoint='', namespace='', watchDelay=30000, logName='', service='', weight=1.0, clusterName='DEFAULT', group='DEFAULT_GROUP', namingLoadCacheAtStart='false', metadata={preserved.register.source=SPRING_CLOUD}, registerEnabled=true, ip='192.168.1.108', networkInterface='', port=-1, secure=false, accessKey='', secretKey='', heartBeatInterval=null, heartBeatTimeout=null, ipDeleteTimeout=null}

java.lang.IllegalArgumentException: Param 'serviceName' is illegal, serviceName is blank
	at com.alibaba.nacos.api.naming.utils.NamingUtils.getGroupedName(NamingUtils.java:47) ~[nacos-api-1.4.1.jar:na]
	at com.alibaba.nacos.client.naming.NacosNamingService.subscribe(NacosNamingService.java:457) ~[nacos-client-1.4.1.jar:na]
	at com.alibaba.cloud.nacos.discovery.NacosWatch.start(NacosWatch.java:123) ~[spring-cloud-starter-alibaba-nacos-discovery-2021.1.jar:2021.1]
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) [spring-context-5.3.3.jar:5.3.3]
	
    ......

 看上去,没准又是配置的问题了。

经查阅一些博客之后终于弄明白原因。原来是spring-cloud-dependencies 2020.0.0 及之后版本不在默认加载 bootstrap 配置文件,如果需要加载 bootstrap 配置文件需要手动添加依赖。

解决方案:

pom.xml 中添加依赖:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.1.0</version>
        </dependency>

具体原因说明可参考文章:Param ‘serviceName‘ is illegal, serviceName is blank_wyz0923的博客-CSDN博客

至此,我的 Nacos 已经成功运行,并能成功发现我的服务,可在 http://127.0.0.1:8848/nacos 上面查验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值