Spring Cloud Nacos 微服务架构实践
1. 概述
Nacos (Dynamic Naming and Configuration Service) 是阿里巴巴开源的动态服务发现、配置管理平台,旨在构建云原生应用。在 Spring Cloud 体系中,它主要提供两大核心能力:服务注册与发现以及动态配置管理。
基础环境
- SpringBoot: 3.2.5
- SpringCloud: 2023.0.3
- SpringCloud Alibaba: 2023.0.1.0
- Nacos: 2.2.3
启动与配置
下载 Nacos 后,双击 startup.cmd 即可启动,默认端口为 8848。若仅需单机测试,建议修改 startup.cmd 中的模式:
set MODE="standalone"
![图示:Nacos 启动界面]
2. 服务注册与发现
微服务架构中,服务提供者(Provider)启动时将自身网络地址(IP + Port)和服务名称注册到 Nacos,并定时发送心跳保持存活。服务消费者(Consumer)则通过查询 Nacos 获取服务列表,根据负载均衡策略选择实例进行调用。
依赖引入
在模块的 pom.xml 中添加以下依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置文件
在 application.yml 中指定 Nacos 服务器地址:
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
启动服务后,访问 http://127.0.0.1:8848/nacos/#/serviceManagement 可查看注册状态。
3. 远程调用优化
传统 RestTemplate 痛点
直接使用硬编码 IP 调用(如 http://127.0.0.1:9000/product/...),一旦服务 IP 变更或环境切换,代码需频繁修改。
基于 Nacos 的负载均衡调用
利用 Nacos 的服务名解析能力,配合 @LoadBalanced 注解,实现服务名的动态路由。
1. 引入 LoadBalancer 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
2. 配置 RestTemplate
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
3. 调用示例
此时 URL 中使用服务名而非 IP:
@Service
public class OrderService {
private final OrderMapper orderMapper;
private final RestTemplate restTemplate;
@Autowired
public OrderService(OrderMapper orderMapper, RestTemplate restTemplate) {
this.orderMapper = orderMapper;
this.restTemplate = restTemplate;
}
public OrderInfo selectOrderById(Integer id) {
OrderInfo orderInfo = orderMapper.selectOrderById(id);
// 使用服务名代替 IP
String url = "http://product-service/product/getProductById?id=" + orderInfo.getProductId();
ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
orderInfo.setProductInfo(productInfo);
return orderInfo;
}
}
4. 负载均衡与集群
Nacos 本身不直接处理负载均衡,而是配合客户端负载均衡器(如 Spring Cloud LoadBalancer)。默认策略(轮询、随机)可能忽略 Nacos 实例权重,需显式开启:
spring:
cloud:
loadbalancer:
nacos:
enabled: true
权重配置
在 Nacos 控制台编辑服务实例,设置权重值,高权重实例将接收更多流量。
同集群优先访问
为避免跨机房调用增加延迟,可配置集群名称。例如北京机房服务均设置为 cluster-beijing:
启动参数:
-Dspring.cloud.nacos.discovery.cluster-name=cluster-beijing
配置文件:
spring:
cloud:
nacos:
discovery:
cluster-name: cluster-beijing
5. 健康检查机制
Nacos 支持两种健康检查模式,取决于实例类型:
- 临时实例(默认):采用客户端主动上报心跳。若超过 15 秒未收到心跳标记为不健康,30 秒后剔除。
- 非临时实例:采用服务端反向探测。宕机后不会立即剔除,适合持久化服务。
如需将服务注册为非临时实例,配置如下:
spring:
cloud:
nacos:
discovery:
ephemeral: false
注意: 实例类型确定后不可随意更改,否则可能导致启动报错。若需修改,需停止 Nacos 服务并清理 /data/protocol/raft 目录下的元数据文件。
6. 环境隔离
通过命名空间(Namespace)实现开发、测试、生产环境的严格隔离。不同 Namespace 下的服务互不可见。
创建与配置
在 Nacos 控制台创建命名空间,并在配置文件中指定 ID:
spring:
cloud:
nacos:
discovery:
namespace: 0bec5adc-2787-44b0-b826-e4bb48746c4e
7. 配置中心
传统配置文件存在修改需重启、多环境维护困难等问题。Nacos 作为配置中心,支持配置集中管理与实时生效。
Bootstrap 上下文
从 Spring Cloud 2020.0.0 版本起,默认禁用 bootstrap 上下文。需引入额外依赖以支持 bootstrap.yml 加载:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
配置文件结构
bootstrap.yml 优先级高于 application.yml,用于连接配置中心:
spring:
application:
name: order-service
profiles:
active: local
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: 0bec5adc-2787-44b0-b826-e4bb48746c4e
file-extension: yaml
Data ID 规则
应用读取的配置文件的 Data ID 遵循以下公式:
Data ID = ${prefix} - ${spring.profiles.active} . ${file-extension}
实际启动时,系统会按优先级加载多个配置文件:
${prefix}-${profiles.active}.${extension}(最高)${prefix}.${extension}${prefix}
例如 order-service-local.yaml > order-service.yaml > order-service。
动态刷新
使用 @RefreshScope 标注的 Bean 会在配置变更时自动重新加载,无需重启服务。
@RestController
@RequestMapping("/config")
@RefreshScope
public class NacosConfigController {
@Value("${test.value}")
private String value;
@GetMapping("/getValue")
public void getValue() {
log.info("getValue:{}", value);
}
}

