Nacos机制
Nacos 配置详解
配置项作用
spring.cloud.nacos.discovery.server-addr=10.207.22.2:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
1. spring.cloud.nacos.discovery.server-addr
- 指定 Nacos 服务注册与发现中心的地址
- 格式:
host:port
- 本例中 Nacos 服务运行在
10.207.22.2
主机的8848
端口
2. spring.cloud.nacos.discovery.username/password
- 连接 Nacos 服务所需的认证凭据
- 用于安全认证,防止未授权访问
Nacos 在程序中的作用机制
1. 服务注册过程
当 [XgQcsServerApplication](file:///Users/01450329/JavaProjects/inc-nlp-aicc-xg-qcs-server/inc-nlp-aicc-xg-qcs-server-web/src/main/java/com/sf/xg/qcs/server/web/XgQcsServerApplication.java#L15-L36) 启动时,Nacos 客户端会执行以下步骤:
应用启动 → Nacos客户端初始化 → 服务注册 → 心跳检测 → 服务发现
详细流程:
-
应用启动
- Spring Boot 启动过程中加载 Nacos 相关自动配置
- 读取 [application.properties](file:///Users/01450329/JavaProjects/inc-nlp-aicc-xg-qcs-server/inc-nlp-aicc-xg-qcs-server-web/src/main/resources/application.properties) 中的 Nacos 配置
-
Nacos 客户端初始化
- 创建 Nacos Discovery Client
- 建立与 Nacos Server (
10.207.22.2:8848
) 的连接 - 使用用户名/密码进行认证
-
服务注册
// 自动注册信息包括: - 服务名:xg-qcs-server (来自 spring.application.name) - IP地址:应用所在服务器IP - 端口:8080 (来自 server.port) - 健康状态等元数据
-
心跳检测
- 客户端定期向 Nacos Server 发送心跳包
- 证明服务实例仍然存活
- 默认每5秒发送一次心跳
-
服务发现
- 应用可以查询其他注册到 Nacos 的服务
- 实现服务间调用
2. Nacos 参与的关键位置
启动阶段
在 [XgQcsServerApplication.java](file:///Users/01450329/JavaProjects/inc-nlp-aicc-xg-qcs-server/inc-nlp-aicc-xg-qcs-server-web/src/main/java/com/sf/xg/qcs/server/web/XgQcsServerApplication.java) 启动时:
@SpringBootApplication
public class XgQcsServerApplication {public static void main(String[] args) {SpringApplication.run(XgQcsServerApplication.class, args);// Nacos 服务注册在此过程中自动完成}
}
配置加载阶段
Nacos 通过 Spring Cloud 的自动配置机制参与:
-
NacosDiscoveryAutoConfiguration
- 自动配置服务发现客户端
- 创建 NacosDiscoveryClient
-
NacosDiscoveryClientConfiguration
- 配置服务注册相关 Bean
- 启用心跳检测机制
3. 工作原理
服务注册原理
┌─────────────────┐ 1.注册请求 ┌──────────────────┐
│ 应用实例 │ ──────────────→ │ Nacos Server │
│ (xg-qcs-server) │ ←────────────── │ (10.207.22.2) │
└─────────────────┘ 2.注册响应 └──────────────────┘││ 3.定时心跳▼
┌─────────────────┐
│ 保持注册状态 │
└─────────────────┘
服务发现原理
服务消费者 → 查询Nacos → 获取服务列表 → 负载均衡 → 调用服务提供者
4. 实际应用场景
在当前项目中,Nacos 可能用于:
服务间调用
// 假设存在其他服务
@FeignClient(name = "other-service") // 服务名会注册到Nacos
public interface OtherServiceClient {@GetMapping("/api/data")String getData();
}
配置管理
虽然当前配置未显示,但 Nacos 也可用于动态配置管理:
# 可以从Nacos获取动态配置
spring.cloud.nacos.config.server-addr=10.207.22.2:8848
负载均衡
配合 Spring Cloud LoadBalancer 实现:
@RestController
public class ServiceController {@Autowiredprivate LoadBalancerClient loadBalancer;public void callService() {// 通过Nacos获取服务实例并进行负载均衡调用ServiceInstance instance = loadBalancer.choose("other-service");}
}
5. Nacos 提供的核心功能
服务注册与发现
- 自动注册服务实例
- 提供服务列表查询
- 支持健康检查
配置管理
- 集中管理应用配置
- 支持配置的动态更新
- 配置变更推送
元数据管理
- 服务元数据存储
- 路由规则配置
- 权限管理
6. 整体架构中的作用
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 服务提供者 │ │ Nacos Server │ │ 服务消费者 │
│ (xg-qcs-server) │◄──►│ (配置&注册中心) │◄──►│ (其他服务) │
└─────────────────┘ └──────────────────┘ └─────────────────┘▲│┌──────────────────┐│ 配置管理界面 │└──────────────────┘
通过 Nacos,应用实现了服务的自动注册与发现,为微服务架构提供了基础设施支持,使得服务间调用更加灵活和可靠。
服务注册与调用机制
1. 服务注册过程
当前服务(xg-qcs-server)启动时会自动向Nacos注册:
┌─────────────────────┐
│ xg-qcs-server服务 │
│ (本机服务) │
└──────────┬──────────┘│ 1. 启动时自动注册▼
┌─────────────────────┐
│ Nacos Server │
│ (10.207.22.2:8848) │
│ │
│ ┌─────────────────┐ │
│ │ 服务注册表 │ │
│ │ - xg-qcs-server │ │
│ │ - other-service1│ │
│ │ - other-service2│ │
│ └─────────────────┘ │
└─────────────────────┘
2. 服务调用过程
本地服务可以通过Nacos调用第三方服务:
┌─────────────────────┐ ┌─────────────────────┐
│ xg-qcs-server服务 │ │ 第三方服务 │
│ (本机服务) │ │ (other-service) │
└──────────┬──────────┘ └──────────▲──────────┘│ 2. 服务发现 │▼ │
┌─────────────────────┐ │
│ Nacos Server │ ──────────────┘
│ (服务注册中心) │ 3. 获取服务地址
└──────────┬──────────┘│ 4. 负载均衡调用▼
┌─────────────────────┐
│ 第三方服务实例 │
│ (实际提供服务的机器) │
└─────────────────────┘
具体实现方式
1. 通过 OpenFeign 调用
// 声明式服务调用客户端
@FeignClient(name = "other-service") // 服务名必须在Nacos中注册
public interface OtherServiceClient {@GetMapping("/api/data")Result<String> getData();@PostMapping("/api/process")Result<Boolean> processData(@RequestBody DataRequest request);
}// 在业务代码中使用
@Service
public class BusinessService {@Autowiredprivate OtherServiceClient otherServiceClient;public void doSomething() {// 通过Feign客户端调用第三方服务Result<String> result = otherServiceClient.getData();// 处理结果...}
}
2. 通过 LoadBalancerClient 调用
@Service
public class LoadBalanceService {@Autowiredprivate LoadBalancerClient loadBalancer;@Autowiredprivate RestTemplate restTemplate;public String callOtherService() {// 通过负载均衡器获取服务实例ServiceInstance instance = loadBalancer.choose("other-service");// 构造调用URLString url = String.format("http://%s:%s/api/data", instance.getHost(), instance.getPort());// 发起HTTP调用return restTemplate.getForObject(url, String.class);}
}
3. 通过 DiscoveryClient 直接发现
@Service
public class DiscoveryService {@Autowiredprivate DiscoveryClient discoveryClient;public List<ServiceInstance> getOtherServiceInstances() {// 直接从Nacos获取服务实例列表return discoveryClient.getInstances("other-service");}public List<String> getAllServiceNames() {// 获取所有已注册的服务名称return discoveryClient.getServices();}
}
调用流程详解
1. 服务发现阶段
xg-qcs-server → Nacos Server → 获取服务列表 → 负载均衡选择 → 返回服务实例
2. 服务调用阶段
xg-qcs-server → HTTP调用 → 目标服务实例 → 处理请求 → 返回响应
负载均衡机制
Nacos 集成了负载均衡功能:
// 默认使用轮询负载均衡策略
@FeignClient(name = "other-service")
public interface OtherServiceClient { }// 可以自定义负载均衡策略
@FeignClient(name = "other-service", configuration = CustomLoadBalancerConfig.class)
public interface OtherServiceClient { }
健康检查机制
┌─────────────────────┐
│ 第三方服务实例 │
└──────────┬──────────┘│ 心跳检测▼
┌─────────────────────┐
│ Nacos Server │
│ │
│ 服务状态: │
│ ✓ instance1: UP │
│ ✓ instance2: UP │
│ ✗ instance3: DOWN │
└─────────────────────┘▲│ 服务发现▼
┌─────────────────────┐
│ xg-qcs-server服务 │
│ (只会获取健康实例) │
└─────────────────────┘
实际应用示例
在当前项目中可能存在类似这样的调用:
// 调用权限服务
@FeignClient(name = "permission-service")
public interface PermissionServiceClient {@PostMapping("/api/permission/check")boolean checkPermission(@RequestBody PermissionCheckRequest request);
}// 调用数据服务
@FeignClient(name = "data-service")
public interface DataServiceClient {@GetMapping("/api/data/query")List<DataRecord> queryData(@RequestParam String condition);
}// 业务服务中使用
@Service
public class QcsBusinessService {@Autowiredprivate PermissionServiceClient permissionService;@Autowiredprivate DataServiceClient dataService;public void processData() {// 1. 检查权限(通过Nacos调用权限服务)if (permissionService.checkPermission(request)) {// 2. 获取数据(通过Nacos调用数据服务)List<DataRecord> data = dataService.queryData("some-condition");// 3. 处理业务逻辑...}}
}
总结
是的,本地服务完全可以通过Nacos实现:
- 服务注册:将自己的服务信息注册到Nacos
- 服务发现:从Nacos获取其他服务的地址信息
- 服务调用:通过负载均衡调用第三方服务
- 健康监控:Nacos自动监控服务实例的健康状态
这种方式实现了微服务架构中的松耦合,服务之间不需要知道对方的具体地址,只需要知道服务名称即可完成调用。