Nacos 简单使用笔记

Nacos 是 Alibaba 开发的, 具有服务管理, 注册与发现, 配置发布与获取功能的框架
集成了注册中心, 配置中心, 服务管理功能
Nacos 关键特性有:

  • 服务发现和服务健康监控
  • 动态配置服务
  • 动态 DNS
  • 服务及其元数据管理
    Nacos 支持了 CP + AP 协议

前置知识

注册中心

注册中心简介

配置中心

配置中心是为解决不同服务运行环境需要不同的一个微服务单元
常用的配置中心有

  • Spring cloud config
  • Apollo
  • Nacos

服务管理

动态管理实例

Nacos 启动

单机模式

  1. 下载 Nacos
  2. 在 bin 目录下执行 startup 脚本:
    startup.cmd -m standalonestartup.sh -m standalone, 其中 standalone 为单机模式启动
  3. 使用 shutdown.shshutdown.cmd 脚本关闭服务

使用 MySQL 替换 Derby

  1. 在 MySQL 中创建库, 并导入 所需表
  2. 修改 /conf 下的 application.properties 配置文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #*************** Config Module Related Configurations ***************#
    ### If use MySQL as datasource:
    spring.datasource.platform=mysql # 使用 MySQl 数据源

    ### Count of DB:
    db.num=1 # 数据库实例数量

    ### Connect URL of DB:
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user.0=nacos
    db.password.0=nacos
    # 上面的 '.0' 表示第 0 个库的连接信息, 多数据库需要配置 MySQL 主从节点

    ### Connection pool configuration: hikariCP
    db.pool.config.connectionTimeout=30000
    db.pool.config.validationTimeout=10000
    db.pool.config.maximumPoolSize=20
    db.pool.config.minimumIdle=2

集群模式

配置

修改 /conf 下的 cluster.conf 配置文件, 添加 Nacos 实例地址

启动

命令 sh startup.sh -p embedded./startup.cmd -p embedded 使用内置数据源启动 Nacos
命令 sh startup.sh./startup.cmd 使用外置数据源启动 Nacos

Nacos Client

使用版本
Spring boot 2.6.11 + Spring cloud alibaba 2021.0.4.0

配置

需要进行服务发现的实例需要在 Spring boot 启动类添加 @EnableDiscoveryClient 注解

依赖项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
application.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
spring:
application:
name: consumer
cloud:
nacos:
server-addr: 127.0.0.1:9000 # Nacos 服务器地址
password: DEV # Nacos 密码
username: DEV # Nacos 用户名
discovery:
server-addr: ${spring.cloud.nacos.server-addr} # Nacos 服务发现地址. 默认为 ${spring.cloud.nacos.server-addr}
username: ${spring.cloud.nacos.username} # Nacos 服务发现用户名. 默认为 ${spring.cloud.nacos.username}
password: ${spring.cloud.nacos.password} # Nacos 服务发现密码. 默认为 ${spring.cloud.nacos.password}
namespace: DEV # 命名空间
group: Patrick # 组. 默认为 DEFAULT_GROUP
register-enabled: false # 是否注册该实例. 默认为 ture
cluster-name: Local # 集群名称. 默认为 DEFAULT
metadata: # 附加的注册元数据
operator: Patrick
# ---------------------------------------- 不常用配置 ---------------------------------------- #
ip: 127.0.0.1 # 手动设置IP, 默认为自动识别
enabled: true # 是否进行服务发现. 默认为 true
access-key: # 服务发现命名空间访问密钥
endpoint: # 服务的域名, 通过该域名可以动态获取服务器地址
ephemeral: true # 是否是临时实例. 默认为 true. 若要进行雪崩保护, 建议关闭
fail-fast: true # 如果为 true, 则在服务注册失败抛出异常, 否则记录错误. 默认为 true
failure-tolerance-enabled: false # 是否启用 nacos 容错. 如果启用, 则当发生异常时, nacos将返回缓存的值. 默认为 false
heart-beat-interval: 10000 # 心跳间隔(时间单位: 毫秒). 缺省即可
heart-beat-timeout: 10000 # 心跳超时时间(时间单位: 毫秒). 缺省即可
instance-enabled: true # 实例是否可用. 默认为 true
ip-delete-timeout: 10000 # IP超时时间(时间单位: 毫秒). 缺省即可
ip-type: IPv4 # IP地址类型. 默认为 IPv4
log-name: naming.log # Nacos日志名称. 缺省即可. 默认为 naming.log
nacos-properties:
key: value
naming-load-cache-at-start: false # 是否在应用程序启动时从本地缓存命名加载. 默认为 false
network-interface: 127.0.0.1 # 注册网络接口的IP. 默认为空
port: -1 # 要为服务实例注册的端口, 如果自动检测端口工作正常, 则无需设置该端口. 默认为 -1
secret-key: # 服务发现密钥
secure: false # 实例是否是 https 类型. 默认为 false
service: ${spring.application.name} # 实例注册名称. 默认是 ${spring.application.name}
watch-delay: 30000 # 从 Nacos 拉取服务的请求的延迟时间. 默认是 30000
watch:
enabled: true # 当为 true 时, 服务会在启动时会创建一个线程池, 该线程定期去查询服务端的信息列表, 查询请求不会立刻返回, 而是等待 spring.cloud.nacos.discovery.watch-delay, 若在等待时间内, 服务端信息列表发生变化, 则该请求立刻返回响应, 通知客户端拉取服务端的服务信息列表, 若没有变化, 则最后该请求返回响应, 客户端服务列表不变, 之后次发送请求. 默认为 ture
weight: 1 # 实例权重. 默认为 1
config:
file-extension: yml
# ---------------------------------------- 不常用配置 ---------------------------------------- #
prefix: ${spring.application.name} # 配置文件前缀
import-check:
enabled: true # 导入配置文件. 默认为 true, 需要填写 spring.config.import
access-key: # 配置管理命名空间访问密钥
cluster-name: Local # 集群名称
config-retry-time: 5s # 获取配置失败重试时间
config-long-poll-timeout: 5s # 获取配置长轮询超时时间
context-path: /nacos # 配置管理路径, 缺省即可
enable-remote-sync-config: false # 主配置 开启注册监听器预加载配置服务 (除非特殊业务需求,否则不推荐打开该参数). 默认为 false
enabled: true # 是否开启配置管理. 默认为 true
encode: UTF-8 # 配置编码. 默认为 UTF-8
endpoint: # Nacos的端点, 服务的域名, 通过它可以动态获取服务器地址
extension-configs: # 扩展配置
- classpath:/ext.yml
group: DEV # 组
max-retry: 10 # 服务器重新连接错误的最大数量
name: provider-dev.yml # Nacos 配置 ID, 缺省即可
namespace: DEV # 命名空间
environment:
password: ${spring.cloud.nacos.password # Nacos 密码. 默认为 ${spring.cloud.nacos.password
preference: local # 配置首选项 值为 local 或 remote. 默认为 local
ram-role-name: # 阿里云 RAM 用户名
refresh-behavior: all_beans # ConfigurationPropertiesBean刷新行为, 取值为 all_beans 或 specific_bea. 默认为 all_beans
refresh-enabled: true # 是否刷新配置. 默认为 true
secret-key: #命名空间密钥
server-addr: ${spring.cloud.nacos.server-addr} # Nacos 配置中心地址, 默认是 ${spring.cloud.nacos.server-addr}
shared-configs: # 共享配置
- optional:nacos:mysql-config.yml
timeout: 5000 # 获取配置超时时间
username: ${spring.cloud.nacos.username} # 配置中心用户名. 默认为 ${spring.cloud.nacos.username
loadbalancer:
nacos:
# ---------------------------------------- 不常用配置 ---------------------------------------- #
enabled: false # 是否集成LoadBalancer. 默认为 false
profiles:
active: dev # 运行环境. 可以被命令行开关覆盖
config:
import: # 需要拉取的配置文件列表
- optional:nacos:${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# optional 指 jar 包外部文件, 若为 classpath 则指 jar 包内部文件; nacos 指使用 nacos 获取
management:
# ---------------------------------------- 不常用配置 ---------------------------------------- #
endpoint:
nacosdiscovery:
cache:
time-to-live: 0ms # Nacos 服务发现可以缓存响应的最长时间. 默认为 0ms
enabled: true # 是否启用 nacos discovery 端点. 默认为 true
nacosconfig:
cache:
time-to-live: 0ms # Nacos 配置管理可以缓存响应的最长时间. 默认为 0ms
enabled: true # 是否启用 nacos config 端点. 默认为 true

远程调用

远程调用介绍

注解

注解名称 作用
@RefreshScope 热刷新被 @Value 类变量

负载均衡

LoadBalancer

LoadBalancer 实现了轮询和随机两种负载均衡策略, Nacos 中实现了 LoadBalancer 的负载均衡策略

负载均衡策略

  • RandomLoadBalancer org.springframework.cloud.loadbalancer.core.RandomLoadBalancer 随机策略
  • RoundRobinLoadBalancer org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer 轮询策略, 这是LoadBalancer 默认的策略
  • NacosLoadBalancer com.alibaba.cloud.nacos.loadbalancer.NacosLoadBalancer Nacos 负载均衡策略, 优先选取同集群实例群, 之后进行权重随机选取
  • 自定义策略
    实现 org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer 接口可以自定义负载均衡策略
Nacos 负载均衡策略

将配置文件中的 spring.cloud.loadbalancer.nacos.enabled 属性设置为 true 即可, 或者使用配置类进行注入

配置

全局配置
Config.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

@Configuration
public class Config {

@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}
}

自定义策略需要在 Spring boot 启动类添加 @LoadBalancerClients(defaultConfiguration = Config.class) 注解, 其中 Config 类为包含 ReactorLoadBalancer Bean 的配置类

局部配置

使用 @LoadBalancerClients 配合 @ LoadBalancerClient 注解可实现细粒度的负载均衡配置

LoadBalancerConfig.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

@Configuration
@LoadBalancerClients(
@LoadBalancerClient(name = "provider", configuration = LoadBalancerConfig.class)
) // 只有一个服务时, 使用 @LoadBalancerClient 即可
public class LoadBalancerConfig {
@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}
}