本文最后更新于187 天前,其中的信息可能已经过时,如有错误请发送邮件到2067863254@qq.com
咱们就用“开餐厅”这个比喻,来把 Nacos 给你讲得明明白白。你不用怕,我保证不用那些晦涩的术语。
一、Nacos 到底是什么?—— 餐厅的“服务台”和“菜单管理部”
想象一下,你要开一个大型餐厅,这个餐厅不是只有一个厨房,而是有很多个特色档口(比如炒菜档口、烧烤档口、甜点档口、饮料档口)。每个档口都是独立运营的,这就是微服务架构。 那么问题来了:
- 炒菜档口做好了菜,怎么知道该叫哪个服务员(另一个微服务)来取餐送给客人?
- 烧烤档口的秘制酱料配方突然要变更,难道要一个个去通知所有烧烤师傅吗?
这时候,你就需要一个核心部门:Nacos。 Nacos 主要干两件大事:
- 服务发现与注册中心 —— 餐厅的“服务台”
- 工作流程:每个档口(微服务)开业时,都先到服务台(Nacos)报到:“你好,我是炒菜档口,我在厨房区1号位置。”
- 有什么用:当饮料档口需要找炒菜档口合作一份套餐时,它不用自己满世界找,直接去问服务台(Nacos):“炒菜档口在哪儿?” 服务台就会告诉它准确位置。
- 好处:档口可以随时开业、关门、搬家(服务上线、下线、扩容),只要在服务台更新一下信息就行,其他档口永远能通过服务台找到它。
- 配置管理中心 —— 餐厅的“菜单和配方管理部”
- 工作流程:所有档口的菜单内容和秘制配方(应用的配置信息,比如数据库地址、功能开关、参数值)都不自己保管了,全部统一交给这个管理部门(Nacos)。
- 有什么用:比如“辣度”标准要从“微辣、中辣、重辣”改成“一级辣、二级辣、三级辣”,管理部门只需要修改一份总菜单,然后通知所有相关的炒菜档口。档口们会自动收到新标准,不用一个个去改。
- 好处:所有配置集中管理,修改起来非常方便,而且能实时生效,不用重启整个档口(微服务)。
简单总结:Nacos 就是一个微服务架构中的“大管家”,既管所有服务在哪里(服务发现),也管所有服务的配置信息(配置管理)。
二、核心概念(一点也不难)
- 服务(Service):就是我们的“炒菜档口”、“烧烤档口”,一个独立的业务功能单元。
- 服务注册(Register):档口开业后,去服务台(Nacos)登记信息的过程。
- 服务发现(Discover):饮料档口通过服务台(Nacos)查询和找到炒菜档口的过程。
- 配置管理(Configuration Management):把档口的配方(配置信息)放在Nacos里统一管理。
- 命名空间(Namespace):相当于餐厅的“楼层”或“区域”。比如:
dev命名空间:后厨的“测试区”,专门用来试验新菜,不会影响正式客人。prod命名空间:正式的“用餐区”,为真实客人服务。- 这样做可以实现环境隔离,开发环境的配置不会搞乱生产环境。
- 分组(Group):相当于给档口“分类”。比如把所有“中餐类”的档口(炒菜、火锅)分到
Chinese-Food组,把所有“西餐类”的档口分到Western-Food组。默认分组叫DEFAULT_GROUP。这样可以实现更细粒度的管理。
三、上手使用(四步搞定)
我们来模拟一个最简单的场景:有一个“用户服务”(user-service)需要被一个“订单服务”(order-service)调用。
第1步:安装并启动Nacos服务器
这相当于先把“服务台”和“管理部门”搭建起来。
- 去Nacos的GitHub发布页下载最新版的压缩包(比如
nacos-server-2.x.x.tar.gz)。 - 解压后,进入
bin目录。- Linux/Mac:执行
sh startup.sh -m standalone(standalone代表单机模式,适合学习) - Windows:双击
startup.cmd文件。
- Linux/Mac:执行
- 启动成功后,打开浏览器访问
http://localhost:8848/nacos。 - 输入默认用户名和密码(都是
nacos),你就看到了Nacos的管理界面!这就是你的“服务台”和“配置管理部”的办公室了。
第2步:将“用户服务”注册到Nacos(去服务台报到)
在你的“用户服务”的SpringBoot项目中:
- 添加依赖(在
pom.xml中): <!– Spring Cloud Alibaba 依赖管理 –> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2022.0.0.0</version> <!– 请使用与你SpringBoot匹配的版本 –> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!– Nacos 服务发现依赖 –> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> - 配置文件(在
application.yml中):spring: application: name: user-service # 给这个服务起个名字,比如“用户服务” cloud: nacos: discovery: server-addr: localhost:8848 # 告诉服务,Nacos服务台在哪里 - 启动主类上添加
@EnableDiscoveryClient注解(新版本可省略,但写上更明确):@SpringBootApplication @EnableDiscoveryClient // 开启服务发现功能 public class UserServiceApplication { public static void main(String[] args) { SpringApplication.run(UserServiceApplication.class, args); } } - 启动“用户服务”。然后刷新Nacos控制台的“服务管理”->“服务列表”,你应该能看到一个名为
user-service的服务了!报到成功!
第3步:“订单服务”通过Nacos发现并调用“用户服务”
“订单服务”的配置步骤和上面一模一样,确保它的application.name是order-service。 关键是如何调用?我们不用写死user-service的IP地址,而是通过Nacos动态发现。
- 使用SpringCloud提供的
RestTemplate或OpenFeign来调用。 - 这里用
RestTemplate举例:- 在“订单服务”的启动类中,注册一个
RestTemplate的Bean:
@Bean @LoadBalanced // 这个注解是核心!它让RestTemplate拥有负载均衡的能力,能向Nacos查询地址 public RestTemplate restTemplate() { return new RestTemplate(); }- 在需要调用的地方(如Controller、Service中):
@RestController public class OrderController { @Autowired private RestTemplate restTemplate; @GetMapping("/order/{userId}") public String getOrder(@PathVariable Long userId) { // 注意:这里直接用服务名“user-service”代替了具体的IP和端口! String url = "http://user-service/user/" + userId; String userInfo = restTemplate.getForObject(url, String.class); return "订单信息 for user: " + userInfo; } }- 神奇之处:当访问
http://user-service/...时,@LoadBalanced注解的RestTemplate会向Nacos查询名为user-service的实例地址,并自动完成调用。即使user-service有多个实例(集群),它也会做负载均衡。
- 在“订单服务”的启动类中,注册一个
第4步:使用配置中心(管理配方)
现在,我们把“用户服务”的某个配置(比如“每页显示条数”)放到Nacos管理。
- 在“用户服务”中添加配置中心依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> - 在Nacos控制台创建配置:
- 进入“配置管理”->“配置列表”。
- 点击“+”号,新建配置。
- Data ID:通常是
{spring.application.name}-{profile}.{后缀},例如我们创建一个user-service-dev.yaml。 - Group:保持默认
DEFAULT_GROUP。 - 配置内容:写一个配置,比如:
page: size: 5
- 在“用户服务”中读取这个配置:
- 创建一个
bootstrap.yml或bootstrap.properties文件(它的加载优先级比application.yml高)。 - 内容如下:
spring: application: name: user-service # 应用名,用于定位Data ID cloud: nacos: config: server-addr: localhost:8848 # 配置中心地址 file-extension: yaml # 指定配置后缀 discovery: server-addr: localhost:8848 # 注册中心地址 - 在代码中,你可以用
@Value注解来获取这个值:@RestController public class UserController { @Value("${page.size:10}") // :10 是默认值,如果Nacos上找不到就用10 private Integer pageSize; @GetMapping("/config") public String getConfig() { return "当前的每页大小是:" + pageSize; } }
- 创建一个
- 动态刷新:如果想在Nacos上修改配置后,不重启服务就生效,在类上添加注解
@RefreshScope即可。@RestController @RefreshScope // 添加这个注解 public class UserController { // ... 上面的代码 }现在你去Nacos控制台把page.size从5改成20,并发布,然后重新访问/config接口,会发现值已经变了!这就是动态配置刷新,非常强大。
总结
你看,使用Nacos其实就四步曲:
- 启动Nacos服务器:把大管家请来。
- 注册服务:让所有微服务去大管家那里报到(加依赖,改配置)。
- 发现与调用:微服务之间通过服务名互相呼叫,不用关心对方在哪(用
@LoadBalanced)。 - 管理配置:把配置信息交给大管家统一保管,修改能实时生效(用
bootstrap.yml和@RefreshScope)。
先从这些最简单的步骤开始实践,跑通一个例子,你就能深刻理解Nacos的价值了。





