Nacos 简单使用笔记Nacos 是 Alibaba 开发的, 具有服务管理, 注册与发现, 配置发布与获取功能的框架 集成了注册中心, 配置中心, 服务管理功能 Nacos 关键特性有:
服务发现和服务健康监控
动态配置服务
动态 DNS
服务及其元数据管理 Nacos 支持了 CP + AP 协议
前置知识 注册中心 注册中心简介
配置中心 配置中心是为解决不同服务运行环境需要不同的一个微服务单元 常用的配置中心有
Spring cloud config
Apollo
Nacos
服务管理 动态管理实例
Nacos 启动 单机模式
下载 Nacos
在 bin 目录下执行 startup 脚本: startup.cmd -m standalone
或 startup.sh -m standalone
, 其中 standalone
为单机模式启动
使用 shutdown.sh
或 shutdown.cmd
脚本关闭服务
使用 MySQL 替换 Derby
在 MySQL 中创建库, 并导入 所需表
修改 /conf 下的 application.properties 配置文件1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 spring.datasource.platform =mysql # 使用 MySQl 数据源 db.num =1 # 数据库实例数量 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 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 password: DEV username: DEV discovery: server-addr: ${spring.cloud.nacos.server-addr} username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} namespace: DEV group: Patrick register-enabled: false cluster-name: Local metadata: operator: Patrick ip: 127.0 .0 .1 enabled: true access-key: endpoint: ephemeral: true fail-fast: true failure-tolerance-enabled: false heart-beat-interval: 10000 heart-beat-timeout: 10000 instance-enabled: true ip-delete-timeout: 10000 ip-type: IPv4 log-name: naming.log nacos-properties: key: value naming-load-cache-at-start: false network-interface: 127.0 .0 .1 port: -1 secret-key: secure: false service: ${spring.application.name} watch-delay: 30000 watch: enabled: true weight: 1 config: file-extension: yml prefix: ${spring.application.name} import-check: enabled: true access-key: cluster-name: Local config-retry-time: 5s config-long-poll-timeout: 5s context-path: /nacos enable-remote-sync-config: false enabled: true encode: UTF-8 endpoint: extension-configs: - classpath:/ext.yml group: DEV max-retry: 10 name: provider-dev.yml namespace: DEV environment: password: ${spring.cloud.nacos.password preference: local ram-role-name: refresh-behavior: all_beans refresh-enabled: true secret-key: server-addr: ${spring.cloud.nacos.server-addr} shared-configs: - optional:nacos:mysql-config.yml timeout: 5000 username: ${spring.cloud.nacos.username} loadbalancer: nacos: enabled: false profiles: active: dev config: import: - optional:nacos:${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} management: endpoint: nacosdiscovery: cache: time-to-live: 0ms enabled: true nacosconfig: cache: time-to-live: 0ms enabled: 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) ) 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); } }