Nacos服务端由1.x升级到2.x后,仍可以兼容1.x的客户端,但是仍存在连接问题,于是对客户端服务一一升级。
官方版本兼容性介绍文档: Nacos 2.0.0 兼容性文档
一、升级后版本情况
- Spring Cloud:Greenwich.SR5
- Spring Cloud Alibaba:2.1.2.RELEASE
- Spring Boot:2.1.12.RELEASE
- Nacos Client:2.0.0-BETA
按照版本对应关系升级:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.0-BETA</version>
</dependency>
二、端口
Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。
端口 | 与主端口的偏移量 | 描述 |
---|---|---|
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。
三、启动服务遇到的问题
启动时报错Connection is unregistered.或Client not connected,current status:STARTING
原因是客户端gRPC无法和服务端创建连接,请先使用telnet ${nacos.server.address}:${nacos.server.grpc.port}进行测试,查看网络是否畅通,服务端端口是否已经正确监听。
若服务端没有问题,查看配置是否有误,服务端和客户端的所配置的端口应一致。
若配置也没有问题,查看是否有防火墙或VIP端口转发问题,Nacos2.0的gRPC端口均通过主端口的偏移量计算产生,因此端口转发也需要满足该偏移量。
以上是官方的解决方案,但是我在检查过都没问题后,启动后还是报连接失败问题,
有些博主给的解决方案是客户端退回1.x版本。这... ...
后来在测试中,发现项目中存在JAR冲突问题,导致nacos-api引用了低版本的protobuf,
后来在项目中引入依赖,解决问题。
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.8.0</version>
<scope>compile</scope>
</dependency>
四、Nacos1.x 与 Nacos2.x 配置文件的区别
spring:
application:
name: service-product
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # Nacos配置中心的地址
file-extension: yaml # 配置的格式
#新版本配置方式 可以配置多个
shared-configs[0]:
data_id: all-service.yaml # 要引入的配置
group: DEFAULT_GROUP # 可以不写,默认值为DEFAULT_GROUP
refresh: true # 默认是false,如果需要支持自动刷新需要配置true,搭配@RefreshScope实现动态刷新
#老版本配置方式
#shared-dataids: all-service.yaml # 要引入的配置
#refreshable-dataids: all-service.yaml # 动态刷新时也刷新引入的配置
profiles:
active: test # 环境标识