在现代微服务架构中,服务注册与发现是一个核心组件。Nacos作为阿里巴巴开源的服务注册与发现工具,广泛应用于Spring Cloud和Dubbo等微服务框架中。然而,在实际开发中,我们可能会遇到服务重复注册的问题,尤其是在同时集成Spring Cloud和Dubbo时。本文将详细分析这一问题,并提供解决方案。

在某个微服务项目中,我们使用了Nacos作为服务注册中心,同时集成了Spring Cloud和Dubbo。在Nacos的服务列表中,我们发现同一个服务(如auth服务)注册了两个实例,尽管我们只在同一台服务器上启动了一个服务实例。具体现象如下:
10.206.64.138011preserved.register.source=SPRING_CLOUD10.206.64.1320880这种现象不仅增加了服务管理的复杂性,还可能导致服务调用时的负载均衡问题。接下来,我们将深入分析问题的原因,并提供解决方案。
Spring Cloud通过spring-cloud-starter-alibaba-nacos-discovery组件将服务注册到Nacos。它会将服务的IP、端口、健康状态等信息注册到Nacos,并使用HTTP协议提供服务。
Dubbo通过dubbo-registry-nacos组件将服务注册到Nacos。Dubbo支持多种协议(如Dubbo协议、HTTP协议),并且可以配置不同的注册模式(如实例级别、接口级别)。
在同时集成Spring Cloud和Dubbo时,可能会出现以下情况:
port: -1),它可能会选择一个与Spring Cloud不同的端口,导致Nacos中出现两个实例。register-mode配置可能会影响注册行为。如果配置为instance,Dubbo会注册实例级别的信息,可能与Spring Cloud的注册信息冲突。以下是项目的application.yaml配置:
dubbo:
application:
name: ${spring.application.name}
register-mode: instance
config-center:
address: nacos://nacos:adcenter1N2BC@10.0.0.1:8848?namespace=107cf0bc-8714-888888888-a913cd5ba888
username: nacos
password: adcenter1N2BC
scan:
base-packages: com.auth.service
protocol:
name: dubbo
port: -1从配置中可以看出:
register-mode: instance)。-1,这意味着它会随机选择一个可用端口。如果你的项目只需要Dubbo协议,可以通过以下配置禁用Spring Cloud的服务注册功能:
spring:
cloud:
nacos:
discovery:
enabled: false如果你需要同时支持Spring Cloud和Dubbo,可以尝试统一注册模式,避免重复注册。例如,将Dubbo的register-mode改为all或interface:
dubbo:
application:
register-mode: all为了避免端口冲突,可以为Dubbo配置固定端口:
dubbo:
protocol:
name: dubbo
port: 20880如果Nacos中已经存在无效的实例,可以通过Nacos控制台手动删除:
auth服务。查看项目启动日志,确认是否有重复注册的行为。重点关注以下日志:
以下是一个完整的application.yaml配置示例,假设你只需要Dubbo协议:
spring:
application:
name: auth
cloud:
nacos:
discovery:
enabled: false # 禁用Spring Cloud服务注册
dubbo:
application:
name: ${spring.application.name}
register-mode: instance # 实例级别注册
config-center:
address: nacos://nacos:adcenter1N2BC@10.0.0.1:8848?namespace=107cf0bc-8714-888888888-a913cd5ba888
username: nacos
password: adcenter1N2BC
scan:
base-packages: com.auth.service # Dubbo服务扫描包
protocol:
name: dubbo
port: 20880 # 使用固定端口在同时集成Spring Cloud和Dubbo时,服务重复注册是一个常见问题。通过禁用Spring Cloud的服务注册功能、统一注册模式、固定Dubbo端口以及清理Nacos中的无效实例,我们可以有效解决这一问题。希望本文的分析和解决方案能够帮助你更好地管理微服务架构中的服务注册与发现。
通过本文的详细分析和解决方案,相信你已经对Spring Cloud与Dubbo集成Nacos时服务重复注册问题有了更深入的理解。如果你在实际开发中遇到类似问题,欢迎参考本文的解决方案。