Skip to content

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:8082

3.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-servicestock-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:8848

3.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:8848

3.9 验证服务注册

启动:

text
stock-service
order-service

打开 Nacos 控制台:

text
http://localhost:8848/nacos

进入:

text
服务管理 -> 服务列表

应该能看到:

text
stock-service
order-service

3.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。

Released under the MIT License.