Nacos 服务注册与发现 Discovery
3.1 Nacos Discovery 是什么?
Nacos Discovery 是服务注册与发现组件。
它解决的问题是:
text
服务提供者在哪里?
服务消费者如何找到服务提供者?
多个实例怎么负载均衡?
服务下线后消费者如何感知?3.2 服务注册原理
假设有一个库存服务:
text
stock-service启动后,它会把自己的信息注册到 Nacos:
text
服务名:stock-service
IP:192.168.1.10
端口:8082
健康状态:UP
元数据:version、zone、group 等Nacos 内部会维护服务实例列表:
text
stock-service
├── 192.168.1.10:8082
├── 192.168.1.11:8082
└── 192.168.1.12:80823.3 服务发现原理
订单服务调用库存服务时,不需要写死 IP:
text
http://192.168.1.10:8082/stock/reduce而是使用服务名:
text
http://stock-service/stock/reduce调用流程:
text
order-service
↓
根据服务名 stock-service 查询实例列表
↓
负载均衡选择一个实例
↓
发起 HTTP 请求
↓
stock-service 返回结果3.4 Nacos Discovery 依赖
在 order-service 和 stock-service 中都要引入:
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>如果是 Web 服务,还需要:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>3.5 stock-service 配置
stock-service/application.yml:
yaml
server:
port: 8082
spring:
application:
name: stock-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:88483.6 stock-service 启动类
java
package com.demo.stock;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class StockServiceApplication {
public static void main(String[] args) {
SpringApplication.run(StockServiceApplication.class, args);
}
}3.7 stock-service 测试接口
java
package com.demo.stock.controller;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/stock")
public class StockController {
@GetMapping("/info")
public String info() {
return "stock-service is running";
}
@PostMapping("/reduce")
public String reduce(@RequestParam("productId") Long productId,
@RequestParam("count") Integer count) {
return "扣减库存成功,productId=" + productId + ", count=" + count;
}
}3.8 order-service 配置
order-service/application.yml:
yaml
server:
port: 8081
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:88483.9 验证服务注册
启动:
text
stock-service
order-service打开 Nacos 控制台:
text
http://localhost:8848/nacos进入:
text
服务管理 -> 服务列表应该能看到:
text
stock-service
order-service3.10 Discovery 常见配置
yaml
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: public
group: DEFAULT_GROUP
username: nacos
password: nacos说明:
text
server-addr:Nacos 地址
namespace:命名空间,用于环境隔离
group:分组,用于服务隔离
username/password:Nacos 鉴权账号密码3.11 命名空间 namespace
常见环境:
text
dev
test
prod可以在 Nacos 中创建不同 namespace:
text
dev namespace
test namespace
prod namespace然后不同环境服务注册到不同 namespace 中。
示例:
yaml
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: dev-namespace-id注意:
text
namespace 配置的是命名空间 ID,不是命名空间名称。3.12 group 分组
group 可以用于进一步隔离服务。
示例:
yaml
spring:
cloud:
nacos:
discovery:
group: DEV_GROUP常见用法:
text
DEFAULT_GROUP
DEV_GROUP
TEST_GROUP
PROD_GROUP消费者和提供者要能互相发现,通常需要在同一个 group。