Spring Cloud微服务本地启动:不改YML配置,如何用注解避免顶掉Nacos服务?

目录

一.问题背景

二.解决方案

三.方案优势对比

四.实战验证

1.不添加该注解,本地启动会顶掉nacos上的该服务节点

2.添加该注解,本地启动就不会顶掉该服务节点


一.问题背景

在微服务开发中,我们经常在本地启动服务进行调试。但如果直接连接公司的Nacos注册中心,本地的服务实例就会注册上去,可能会带来一系列麻烦:

  • 流量污染:线上或其他环境的调用方可能会请求到你的本地服务,导致对方报错或影响你的调试。
  • 服务列表混乱:Nacos上会充斥着大量临时的、不稳定的本地服务实例,让服务列表变得杂乱无章。
  • 端口冲突:如果多个开发者都注册了同名服务,可能会因为负载均衡策略导致意想不到的调用结果。

我们的需求很明确:既要能读取Nacos上的配置,又要避免将本地服务注册上去。
大白话解释:

我们此时要在本地启动下面这个项目(我们系统中的一个微服务),并且不想改yml配置文件中的nacos服务注册配置,这种情况下还不想把nacos上的已注册的该服务顶下去,怎么办?此时可以使用

复制代码
@EnableDiscoveryClient(autoRegister = false)

这个注解。

二.解决方案

一个非常优雅的解决方案是使用@EnableDiscoveryClient注解的autoRegister属性。这种方法无需修改任何YAML配置文件,只需要在启动类上动动手指即可。

  1. 核心原理
    @EnableDiscoveryClient是Spring Cloud用于启用服务发现的注解。它提供了一个autoRegister属性,默认值为true,表示应用启动时自动向注册中心注册自己。当我们将其设置为false时,应用虽然能连接到Nacos(例如为了拉取配置),但不会执行自我注册的流程,从而实现"隐身"。

  2. 代码实现

    找到你的Spring Boot应用启动类(通常是带有@SpringBootApplication注解的那个),然后按照以下步骤操作:

引入必要的包

确保你的项目中已经引入了spring-cloud-starter-alibaba-nacos-discovery依赖。

添加注解

在启动类上添加@EnableDiscoveryClient(autoRegister = false)注解。

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * 通过设置 autoRegister = false,
 * 使本服务在本地启动时不注册到Nacos,避免干扰线上服务。
 */
@EnableDiscoveryClient(autoRegister = false)
@SpringBootApplication
public class UserServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}
  1. 效果验证
    完成上述修改后,重新启动你的本地服务。此时打开Nacos控制台,你会发现:
  • 你的本地服务并没有出现在服务列表中。
  • 你的应用依然可以正常启动,并且能够从Nacos成功读取配置文件。

这样就完美实现了我们的目标!

三.方案优势对比

相比于其他方法,使用@EnableDiscoveryClient(autoRegister = false)注解的方式有显著优势。

  1. 零配置侵入

    你不需要去修改bootstrap.ymlapplication.yml文件,也就避免了因忘记切换配置而误提交到代码仓库的风险。

  2. 清晰直观

    是否注册服务的行为直接由启动类的注解控制,对于代码阅读者来说意图非常清晰。

  3. 灵活切换

    如果你需要临时将服务注册到Nacos(例如测试集群功能),只需将注解中的autoRegister = false改为true或直接移除该属性,重新编译运行即可,非常方便。

四.实战验证

1.不添加该注解,本地启动会顶掉nacos上的该服务节点

此时只要访问服务器上的该微服务节点的相关接口时,必定报错"内部服务器错误",就是因为把服务器的那个微服务节点顶掉了。

2.添加该注解,本地启动就不会顶掉该服务节点

此时再访问服务器上的该微服务节点的相关接口时,就不会报错了,因为添加该注解以后,你的本地项目再启,就不会顶掉nacos上的该服务节点了。

以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~