记一次使用Nacos 2.0.3版本搭建微服务注册中心和客户端的踩坑填坑详细过程

前言

最近决定深入学习微服务spring cloud alibaba生态的各个组件的使用,学习过程中急需要练手,打算从搭建nacos注册和配置中心,跑通服务端和客户端开始。最近国庆放假在家搭建了一个单机版的Nacos注册中心和客户端项目,nacos服务端跑起来挺容易的,但是客户端项目跑起来就费劲了。由于spring cloud alibabaspring bootspring cloud版本的兼容性非常严格,拉勾的专栏课程和官网教程与实际项目还是有不小的出入,因此让我踩了很多坑踩把项目跑起来,后面花了笔者快一天的时间虽然项目启动过程中还报了一些异常,但是并不影响客户端项目的成功启动。这里输出一篇文章,希望能给想要学习spring cloud alibaba生态的nacos组件的同行一些参考,避免踩同样的坑!

1 认识Nacos

这里引用Nacos官网的介绍:

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

Kubernetes Service

gRPC & Dubbo RPC Service

Spring Cloud RESTful Service

Nacos 的关键特性包括:

1.1 服务发现和服务健康监测

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。

Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

1.2 动态配置服务

动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

1.3 动态 DNS 服务

动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

1.4 服务及其元数据管理

nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

1.5 更多特性列表…

下面我们开始搭建Nacos服务端和客户端,最终我们要在nacos的UI界面上看到来自客户端的服务注册列表

2 搭建最新版本Nacos服务

我们参照Nacos官网**Nacos 快速开始**部分内容搭建Nacos服务端

2.1 安装nacos服务的环境准备

请参考官网Nacos快速开始中的**1.预备环境准备]**部分内容

2.2 下载安装包

读者可以从 最新稳定版本 下载 nacos-server-$version.tar.gz或nacos-server-$version.zip 包。前者为Linux环境下的安装包,后者为windows环境下的安装包

nacos安装包下载

2.3 安装Nacos

本案例中下载的是Linux环境下最新稳定版本nacos-server-2.0.3.tar.gz包,并能使用FinalShell云服务器客户端连接工具登录云服务器后上传到云服务器的/usr/local目录下:

nacos安装上传到云服务器

然后执行解压缩命令并切换到nacos/bin目录:

tar -xvf nacos-server-2.0.3.tar.gz
cd nacos/bin
2.4 启动Nacos服务

切换到nacos/bin目录下后执行启动nacos服务命令(启动命令standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系统,可尝试如下运行:

bash startup.sh -m standalone

启动日志如下:

nacos is starting with standalone
nacos is starting, you can check the /usr/local/nacos/nacos/logs/start.out

默认 Nacos 以后台模式启动,利用 tail 命令查看启动日志。可以看到 Nacos 默认端口为 8848,下面日志说明 Nacos 单机模式已启动成功。

[root@VM_0_10_centos nacos]# tail -f ./logs/start.out
2021-10-04 13:01:49,867 INFO Exposing 16 endpoint(s) beneath base path '/actuator'

2021-10-04 13:01:50,506 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'

2021-10-04 13:01:50,514 INFO Nacos started successfully in stand alone mode. use embedded storage

2021-10-04 13:02:00,102 INFO Initializing Servlet 'dispatcherServlet'

2021-10-04 13:02:00,137 INFO Completed initialization in 35 ms

windows环境下请下载nacos-server-2.0.3.zip包到本地后解压缩后zip包,在解压缩的nacos文件夹下的盘符目录中输入cmd后回车进入cmd命令控制台,然后输入如下命令启动nacos单机服务:

startup.cmd -m standalone
2.5 开放端口防火墙和安全组

默认 CentOS 系统并没有对外开放 7848/8848 端口,需要设置防火墙对 7848/8848 端口放行。

其中,8848 端口是 Nacos 对客户端提供服务的端口,7848 是 Nacos 集群通信端口,用于Nacos 集群间进行选举,检测等。另外,Nacos 2.0以后增加了用于grpc客户端和服务端通信的长连接9848和9849端口,需要将这两个端口也一并开放。

[root@VM_0_10_centos nacos]# firewall-cmd --zone=public --add-port=8848/tcp --permanent
success
[root@VM_0_10_centos nacos]# firewall-cmd --zone=public --add-port=7848/tcp --permanent
success
[root@VM_0_10_centos nacos]# firewall-cmd --zone=public --add-port=9848/tcp --permanent
success
[root@VM_0_10_centos nacos]# firewall-cmd --zone=public --add-port=9849/tcp --permanent
success
[root@VM_0_10_centos nacos]# firewall-cmd  --reload
success

同时登录自己的云服务器控制台进入云服务器>安全组>修改规则以插入的方式添加入站规则,下面的截图以腾讯云服务器控制台为例

云服务器安全组入站规则开放nacos服务端口

然后我们就可以在浏览器中输入: http://134.175.187.61:8848/nacos 登录Nacos的UI管理界面了,用户名和密码都是nacos,登录成功后的Nacos管理界面如下:

nacos登录界面

未启动nacos客户端时的服务列表界面

客户端尚未启动,所以服务列表中还没有数据

3 搭建Nacos客户端项目

Spring Cloud Alibaba 作为 Spring Cloud 子项目,开发框架仍基于 SpringBoot,只是在构建项目时需要选择不同的 starter 接入注册中心,下面我们通过实操完成微服务与 Nacos服务器的接入工作。

开发工具强烈推荐 IDEA Ultimate,Ultimate 内置 SpringBoot工程向导,可以非常方便地实现 Spring Cloud 微服务的快速创建

Nacos Ultimate

3.1 创建新工程

工程类型选择 Spring Initializr

下图是 SpringBoot 工程向导,右侧选中 Custom,写入阿里云地址http://start.aliyun.com,默认的 https://start.spring.io。 这里需要连接 spring 官方服务器,因为网络原因经常无法访问,所以采用国内阿里云镜像生成工程初始代码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-znfdHjwJ-1633617366716)(D:\markdown撰写文档\SpringCloudAlibaba\aliyun_spring_initializr.png)]

​ Spring Initializr 工程向导

在Project Metadata 面板,设置 Maven Group 与 Artifact,一般 Artifact 即为微服务名称。

nacos sample

3.2. 添加项目的依赖项

点击上一步设置项目的maven坐标系后界面中的Next按钮后进入Dependencies界面,选中Spring Cloud Alibaba模块后在右侧的依赖项中勾选Nacos Service Discovery;同样选中Web模块后在右侧的依赖项中勾选Spring Web依赖。

nacos_dependencies

然后依次点击Next->Finish按钮生成项目骨架

IDEA生成的项目模板pom文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.lagou</groupId>
    <artifactId>nacos-sample</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>nacos-sample</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.lagou.nacossample.NacosSampleApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
3.3 解决项目启动报错问题

我们打开项目src目录下的NacosDiscoveryConfiguration配置类发现报红,显示无法导入

org.springframework.cloud.client.discovery.EnableDiscoveryClient

EnableDiscoveryClient注解报错

我们需要在pom.xml文件中加入spring-cloud-starter-consul-discoverynacos-client的依赖,spring-cloud-dependencies选则Hoxton.RELEASE版本,同时还需要增加spring-boot-starter-parent,解决maven依赖中的部分生命周期插件报红的问题

  <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    </properties>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
        <relativePath/>
    </parent>

同时在<dependencyManagement>的子标签dependencies>中加入spring-cloud-alibaba-dependencies依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring-cloud-alibaba.version}</version>
     <type>pom</type>
     <scope>import</scope>
 </dependency>

接下来还需要在<dependencies>标签下添加nacos-client和spring-cloud-starter-openfeign的依赖

        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>       

然后修改application.properties文件

# 应用名称
spring.application.name=nacos-sample
# 应用服务 WEB 访问端口
server.port=9000
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
#spring.cloud.nacos.discovery.server-addr=mse-6d50f4f0-p.nacos-ans.mse.aliyuncs.com:8848
spring.cloud.nacos.discovery.server-addr=http://134.175.187.61:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
#spring.cloud.nacos.discovery.endpoint=nacos
spring.cloud.nacos.discovery.log-name=nacosLog
spring.cloud.nacos.discovery.cluster-name=nacos-cluster
spring.cloud.nacos.discovery.group=nacos-group
spring.cloud.loadbalancer.ribbon.enabled=true
management.endpoints.web.exposure.include=*

接下来开始以debug模式启动NacosSampleApplication类下的main方法,启动过程出现报错导致程序终止,报错信息如下:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nacosServiceDiscovery' defined in class path resource [com/alibaba/cloud/nacos/discovery/NacosDiscoveryAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery]: Factory method 'nacosServiceDiscovery' threw exception; nested exception is java.lang.NoClassDefFoundError: com/alibaba/spring/util/PropertySourcesUtils
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) ~[spring-beans-5.2.12.RELEASE.jar:5.2.12.RELEASE]
	......
Caused by: java.lang.ClassNotFoundException: com.alibaba.spring.util.PropertySourcesUtils
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_131]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_131]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[na:1.8.0_131]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_131]
	... 30 common frames omitted

以上报错日志信息显示类路径下没有找到com.alibaba.spring.util.PropertySourcesUtils找到这个类的定义,解决这个问题需要在<dependencies>标签下添加com.alibaba.springspring-context-support依赖:

        <dependency>
            <groupId>com.alibaba.spring</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>1.0.2</version>
        </dependency>

然后再次启动后项目日志控制台又报了另一个错误,报错信息如下:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-10-05 08:27:58.153 ERROR 1412 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nacosServiceDiscovery' defined in class path resource [com/alibaba/cloud/nacos/discovery/NacosDiscoveryAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery]: Factory method 'nacosServiceDiscovery' threw exception; nested exception is java.lang.RuntimeException: ErrCode:-400, ErrMsg:org.reflections.Reflections
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) ~[spring-beans-5.2.12.RELEASE.jar:5.2.12.RELEASE]
	......
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery]: Factory method 'nacosServiceDiscovery' threw exception; nested exception is java.lang.RuntimeException: ErrCode:-400, ErrMsg:org.reflections.Reflections
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.2.12.RELEASE.jar:5.2.12.RELEASE]
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:652) ~[spring-beans-5.2.12.RELEASE.jar:5.2.12.RELEASE]
	... 20 common frames omitted
Caused by: java.lang.RuntimeException: ErrCode:-400, ErrMsg:org.reflections.Reflections
	at com.alibaba.cloud.nacos.NacosServiceManager.createNewNamingService(NacosServiceManager.java:97) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at com.alibaba.cloud.nacos.NacosServiceManager.buildNamingService(NacosServiceManager.java:85) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at com.alibaba.cloud.nacos.NacosServiceManager.getNamingService(NacosServiceManager.java:48) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery.<init>(NacosServiceDiscovery.java:47) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration.nacosServiceDiscovery(NacosDiscoveryAutoConfiguration.java:47) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131]
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.12.RELEASE.jar:5.2.12.RELEASE]
	... 21 common frames omitted
Caused by: com.alibaba.nacos.api.exception.NacosException: java.lang.reflect.InvocationTargetException
	at com.alibaba.nacos.api.naming.NamingFactory.createNamingService(NamingFactory.java:61) ~[nacos-client-2.0.3.jar:na]
	at com.alibaba.nacos.api.NacosFactory.createNamingService(NacosFactory.java:77) ~[nacos-client-2.0.3.jar:na]
	at com.alibaba.cloud.nacos.NacosServiceManager.createNewNamingService(NacosServiceManager.java:94) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	... 30 common frames omitted
Caused by: java.lang.reflect.InvocationTargetException: null
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_131]
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_131]
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_131]
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_131]
	at com.alibaba.nacos.api.naming.NamingFactory.createNamingService(NamingFactory.java:59) ~[nacos-client-2.0.3.jar:na]
	... 32 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/reflections/Reflections
	at com.alibaba.nacos.api.remote.PayloadRegistry.scan(PayloadRegistry.java:56) ~[nacos-client-2.0.3.jar:na]
	at com.alibaba.nacos.api.remote.PayloadRegistry.init(PayloadRegistry.java:44) ~[nacos-client-2.0.3.jar:na]
	at com.alibaba.nacos.common.remote.client.RpcClient.<clinit>(RpcClient.java:109) ~[nacos-client-2.0.3.jar:na]
	at com.alibaba.nacos.common.remote.client.RpcClientFactory.lambda$createClient$0(RpcClientFactory.java:79) ~[nacos-client-2.0.3.jar:na]

以上报错信息显示没有找到类org.reflections.Reflections, pom.xml文件的<dependencies>标签中加入reflections的依赖:

        <dependency>
            <groupId>org.reflections</groupId>
            <artifactId>reflections</artifactId>
            <version>0.9.10</version>
        </dependency>

再次启动项目后又报了以下错误信息:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-10-05 15:49:33.984 ERROR 13264 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field autoServiceRegistration in org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration required a single bean, but 2 were found:
	- nacosAutoServiceRegistration: defined by method 'nacosAutoServiceRegistration' in class path resource [com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.class]
	- consulAutoServiceRegistration: defined by method 'consulAutoServiceRegistration' in class path resource [org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationAutoConfiguration.class]

Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

以上错误信息显示自动配置类AutoServiceRegistrationAutoConfiguration注入autoServiceRegistration属性时同时出现了两个可注入的实例bean,一个是NacosAutoServiceRegistration类的实例bean,另一个是ConsulAutoServiceRegistration类的实例bean。这里用的是NacosAutoServiceRegistration的实例bean,因此需要排除spring-cloud-starter-consul-discovery依赖下的spring-cloud-consul-discovery依赖:

     <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
            <version>2.2.0.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-consul-discovery</artifactId>
                </exclusion>
            </exclusions>
     </dependency>

保存后重启项目又报了另一个错误,报错信息如下:

2021-10-05 16:06:55.223 ERROR 22868 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.context.ApplicationContextException: Failed to start bean 'nacosWatch'; nested exception is java.lang.NoClassDefFoundError: io/prometheus/client/Gauge
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:185) ~[spring-context-5.2.12.RELEASE.jar:5.2.12.RELEASE]
......
Caused by: java.lang.ClassNotFoundException: io.prometheus.client.Gauge
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_131]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_131]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[na:1.8.0_131]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_131]
	... 20 common frames omitted

以上报错信息显示没有找到类io.prometheus.client.Gauge,需要在pom.xml文件中引入simpleclient的依赖:

       <dependency>
           <groupId>io.prometheus</groupId>
           <artifactId>simpleclient</artifactId>
           <version>0.0.9</version>
       </dependency>

同时报了一个zip文件打不打的警告异常:

2021-10-05 16:06:29.933  WARN 22868 --- [           main] org.reflections.Reflections              : could not create Dir using jarFile from url file:/D:/mavenRepository/.m2/repository/org/aspectj/aspectjweaver/1.9.6/aspectjweaver-1.9.6.jar. skipping.

java.util.zip.ZipException: error in opening zip file
	at java.util.zip.ZipFile.open(Native Method) ~[na:1.8.0_131]

网了查了下关于这个错误的资料,发现是本地maven仓库下的aspectjweaver-1.9.6.jar损坏了导致打不开,通过在终端控制台执行命令:mvn dependency:tree后发现这个依赖包位于spring-cloud-starter-consul-discoveryspring-cloud-starter-openfeign两个依赖jar包中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KGWUjdTn-1633617366724)(D:\markdown撰写文档\SpringCloudAlibaba\aspectjweaver.png)]

解决这个告警异常的方案是在这两个依赖包中排除掉aspectjweaver的依赖,并换上一个完好的1.9.4版本的aspectjweaver.jar包。

       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
            <version>2.2.0.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-consul-discovery</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjweaver</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjweaver</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>

再次启动后发现不再报错,项目启动成功,但是没有客户端连接nacos注册中心的日志信息

2021-10-05 17:43:36.717  INFO 22604 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 22 endpoint(s) beneath base path '/actuator'
2021-10-05 17:43:36.851  INFO 22604 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9000 (http) with context path ''
2021-10-05 17:43:36.892  INFO 22604 --- [           main] c.a.c.n.registry.NacosServiceRegistry    : nacos registry, nacos-group nacos-sample 192.168.10.3:9000 register finished
2021-10-05 17:43:41.833  INFO 22604 --- [           main] c.l.nacos.sample.NacosSampleApplication  : Started NacosSampleApplication in 49.293 seconds (JVM running for 54.26)

为了让控制台显示客户端连接nacos的详细的日志,我们加上spring-cloud-starter-alibaba-nacos-config的依赖,并在application.properties文件中加入配置项spring.cloud.nacos.config.server-addr=http://134.175.187.61:8848

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

再次启动客户端服务,控制台日志报了以下错误,但却并不影响服务启动成功:

2021-10-05 17:56:06.481 ERROR 18308 --- [s.client.Worker] c.a.n.client.config.impl.ClientWorker    : Async listen config change error 

com.alibaba.nacos.api.exception.NacosException: Client not connected,current status:STARTING
	at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:655) ~[nacos-client-2.0.3.jar:na]
	at com.alibaba.nacos.client.config.impl.ClientWorker$ConfigRpcTransportClient.requestProxy(ClientWorker.java:1067) ~[nacos-client-2.0.3.jar:na]
	at com.alibaba.nacos.client.config.impl.ClientWorker$ConfigRpcTransportClient.requestProxy(ClientWorker.java:1042) ~[nacos-client-2.0.3.jar:na]
	at com.alibaba.nacos.client.config.impl.ClientWorker$ConfigRpcTransportClient.executeConfigListen(ClientWorker.java:831) ~[nacos-client-2.0.3.jar:na]
	at com.alibaba.nacos.client.config.impl.ClientWorker$ConfigRpcTransportClient$4.run(ClientWorker.java:748) [nacos-client-2.0.3.jar:na]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_131]
	at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) [na:1.8.0_131]
	at java.util.concurrent.FutureTask.run(FutureTask.java) [na:1.8.0_131]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_131]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_131]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]

2021-10-05 17:56:06.534 ERROR 18308 --- [t.remote.worker] c.a.n.c.remote.client.grpc.GrpcClient    : Server check fail, please check server localhost ,port 9848 is available , error ={
    
    }

java.util.concurrent.TimeoutException: Waited 3000 milliseconds (plus 328500 nanoseconds delay) for com.alibaba.nacos.shaded.io.grpc.stub.ClientCalls$GrpcFuture@6112d2a2[status=PENDING, info=[GrpcFuture{
    
    clientCall={
    
    delegate={
    
    delegate=ClientCallImpl{
    
    method=MethodDescriptor{
    
    fullMethodName=Request/request, type=UNARY, idempotent=false, safe=false, sampledToLocalTracing=true, requestMarshaller=com.alibaba.nacos.shaded.io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller@59dc36d4, responseMarshaller=com.alibaba.nacos.shaded.io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller@12fcc71f, schemaDescriptor=com.alibaba.nacos.api.grpc.auto.RequestGrpc$RequestMethodDescriptorSupplier@5679e96b}}}}}]]

日志信息中显示:RpcClient请求失败,提示开发人员检查本地服务9848端口是否有效

由于本地并没有后启动nacos服务,而application.properties配置文件中的配置中心注册地址变量spring.cloud.nacos.config.server-addr没有生效,我们需要在resources目录下新建一个bootstrap.properties配置文件,并加入配置项:spring.cloud.nacos.config.server-addr=http://134.175.187.61:8848

然后保存后再次启动客户端服务,发现控制台日志依然报错,但是注册中心地址ip已经指向了云服务器ip: 134.175.187.61了。

2021-10-05 18:09:03.142  INFO 20624 --- [           main] com.alibaba.nacos.common.remote.client   : [1228cbb0-75e6-4b49-b624-e9d2f2607244_config-0] Try to connect to server on start up, server: {
    
    serverIp='134.175.187.61', server main port=8848}
2021-10-05 18:09:11.738 ERROR 20624 --- [           main] c.a.n.c.remote.client.grpc.GrpcClient    : Server check fail, please check server 134.175.187.61 ,port 9848 is available , error ={
    
    }

java.util.concurrent.TimeoutException: Waited 3000 milliseconds (plus 761600 nanoseconds delay) for com.alibaba.nacos.shaded.io.grpc.stub.ClientCalls$GrpcFuture@53e800f9[status=PENDING, info=[GrpcFuture{
    
    clientCall={
    
    delegate={
    
    delegate=ClientCallImpl{
    
    method=MethodDescriptor{
    
    fullMethodName=Request/request, type=UNARY, idempotent=false, safe=false, sampledToLocalTracing=true, requestMarshaller=com.alibaba.nacos.shaded.io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller@2924f1d8, responseMarshaller=com.alibaba.nacos.shaded.io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller@524a076e, schemaDescriptor=com.alibaba.nacos.api.grpc.auto.RequestGrpc$RequestMethodDescriptorSupplier@5b5e7036}}}}}]]

仍然是连接grpc服务的9848端口报错,虽然报错,但是并不影响客户端项目的启动,这个问题留在下一篇文章实现nacos配置中心时再解决。

4 效果预览

此时我们登录nacos ui 界面,点击左侧菜单中的服务管理->服务列表菜单进入服务列表界面,可以看到我们的客户端服务nacos-sample成功注册到Nacos注册中心来了

启动nacos客户端后的Nacos注册中心列表

参考资料

参考资料

[1] Nacos快速开始 https://nacos.io/zh-cn/docs/quick-start.html

[2] spring-cloud-alibaba版本说明 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

[3] Nacos github仓库源码 https://github.com/alibaba/nacos/

[4] java.util.zip.ZipException: error in opening zip file 问题处理 https://www.javatt.com/p/77826

最后推广一款超高性价比的腾讯云服务器,首年只需要74元。这样的云服务器是每一个开发人员学习Linux命令实操必不可少的工具。我为什么不推荐读者使用免费的虚拟机呢?因为虚拟机安装和ping通网络的过程实在太繁琐,笔者之前写过一篇关于如何解决VMWare虚拟机无法平台网络的问题的文章CentOS7操作系统安装及安装后解决ping不通网络和主机域名的问题
阅读量达到了17832,即使笔者把解决问题的步骤和截图都交代的非常清楚,但是下面还是有很多读者留言说自己仍然没有解决虚拟机CentOS7操作系统ping通网络的问题。

article_read_data.png

而下面这款腾讯云服务器只需要首年74元的价格,超级划算,省去了你通过安装VMWare虚拟机来安装Linux操作系统的麻烦,网速体验也非常好,而且这款云服务器自带了很多安装软件,免去了你自己去网上搜索、下载和安装的烦恼,非常值得作为开发人员拥有一台这样的云服务器。点击图片下面的链接即可进入产品详情页,而且有机会以秒杀价的超低价格买到你想要的产品。

tencent_server.jpg
【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年74元

本文首发个人微信公众号【阿福谈Web编程】,觉得笔者的文章不错的读者可以关注笔者的微信公众号【阿福谈Web编程】,让我们在IT技术的路上共同成长!

—END—

猜你喜欢

转载自blog.csdn.net/heshengfu1211/article/details/120643050