Nacos入门随笔
什么是Nacos?
Nacos是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台(参考Nacos官网:http://nacos.io/zh-cn/docs/v2/what-is-nacos.html)。
Nacos的关键特性包括:
- 服务发现和服务健康监测
- 动态配置服务
- 动态DNS服务
- 服务及元数据管理
nacos本质是一个Web服务应用,提供了一套RestAPI供其它服务调用完成相关功能。
为什么要引入Nacos?
分布式架构需要,参考springcloud全家桶,需要一些组件各司其职,如服务注册中心(Eureka、Consul、Zookeeper)、配置中心(Spring Cloud Config)、消息总线(Bus)。
服务注册中心:将微服务注册到注册中心表,注册中心管理微服务,实时监控服务的健康状态,微服务拉取注册表,使用RPC框架(Ribbon、OpenFeign、Dubbo)调用微服务;
配置中心:将微服务的非启动配置项放在配置中心集中式管理,到达一处修改,全局生效;
消息总线:将修改的配置信息通知到所有的微服务。
而使用nacos,只需要一个组件就可以同时做服务注册中心、服务配置、服务总线,减少了服务搭建步骤,为项目构建与维护提供了便利,并且能满足高并发性能要求。
注册中心原理:
服务注册的功能体现在:
- 服务实例启动时注册到服务注册表、关闭时则注销( 服务注册 )。
- 服务消费者可以通过查询服务注册表来获得可用的实例( 服务发现 )。
- 服务注册中心需要调用服务实例的健康检查API来验证其是否可以正确的处理请求( 健康检查 )。
调用原理图:
当会员服务、订单服务启动时,调用注册接口将自身信息注册到nacos注册中心,并且定时发送心跳维持健康状态;
会员服务定时拉取注册中心的注册表做本地缓存,使用RPC框架根据注册表的微服务名称远程调用订单服务。
Nacos的服务注册与发现
1.在springCloud服务的pom文件中引入服务注册发现和配置管理的依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
注意: spring-cloud-starter-alibaba-nacos-discovery天生就集成了ribbon,所以nacos具有均衡负载功能。

2.在bootstrap.yaml中添加注册信息及配置地址信息
# nacos 配置中心信息
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos 服务端地址
username: nacos # nacos 用户名
password: nacos # nacos 用户密码
config:
file-extension: yaml # 配置文件类型 默认 properties 类型
# namespace: public # 命名空间 默认 public 如果配置了 public 循环打印clientWork日志, public 默认不配置
# group: DEFAULT_GROUP # 分组 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
# enabled: true # 通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config
# refresh-enabled: false # 默认为true,去感知nacos注册中心的配置是否变化
shared-configs: # 使用自定义配置文件时,data-id 必须加文件类型,否则报错
- data-id: com.common1.yaml
#group 默认分组 DEFAULT_GROUP
refresh: true # 感知nacos配置中心变化,默认为false不感知
extension-configs:
- data-id: com.conmon2.yaml
#group 默认分组 DEFAULT_GROUP
refresh: true
discovery:
ephemeral: true # #默认true(临时实例) 当服务宕机 就会将实例剔除掉,此时该服务对nacos来讲是AP模式
#当为false时为永久实例,服务宕机也不会剔除,与保护阈值作用起到雪崩保护,此时为CP模式
# nacos默认会根据服务名拉取默认配置文件,除默认配置文件外的文件,读取公式为${prefix}-${spring.profile.active}.${file-extension}
# 配置文件的优先级
# profile 方式 > 默认配置文件 > extension-configs ( 扩展配置,下标越大 优先级越大)> shared-configs(共享配置)
1、如果需要动态刷新的话需要在使用的类上贴上@RefreshScope注解就可以实现自动刷新了
2. Namespace和Group和DataId的关系
Nacos服务注册表结构: Map<namespace, Map<group::serviceName, Service>>
ServiceManager => private Map<String, Map<String, Service>> serviceMap = new ConcurrentHashMap<>();
Service => private Map<String, Cluster> clusterMap = new HashMap<>();
Cluster => private Set<Instance> persistentInstances = new HashSet<>(); private Set<Instance> ephemeralInstances = new HashSet<>();
默认情况:
Namespace=public,Group=DEFAULT_GROUP, 默认Cluster是DEFAULT
Nacos默认的命名空间是public,Namespace主要用来实现隔离。
比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去
Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。
Instance:微服务的实例。
nacos的项目结构:
- address模块:主要查询nacos集群中节点个数以及lP的列表。
- api模块:主要给客户端调用的api接口的抽象。
- common模块:主要是通用的工具包和字符串常量的定义。
- client模块:主要是对依赖api模块和common模块,对api的接口的实现,给nacos的客户端使用。
- cmdb模块:主要是操作的数据的存储在内存中,该模块提供一个查询数据标签的接口。
- config模块:主要是服务配置的管理,即配置中心,提供api给客户端拉去配置信息,以及提供更新配置的,客户端通过长轮询的更新配置信息.数据存储是mysql。
- naming模块:主要是作为服务注册中心的实现模块,具备服务的注册和服务发现的功能。
- console模块:主要是实现控制台的功能.具有权限校验、服务状态、健康检查等功能。
- core模块:主要是实现Spring的PropertySource的后置处理器,用于属性加载,初始化,监听器相关操作。
- distribution模块:主要是打包nacos-server的操作,使用maven-assembly-plugin进行自定义打包。
下面是各个模块的依赖关系:
服务注册发现入口是注解@EnableDiscoveryClient
@EnableDiscoveryClient有一个属性autoRegister()为ture,导入了EnableDiscoveryClientImportSelector.class;
EnableDiscoveryClientImportSelector有一个方法selectImports,获取注解属性(autoRegister),将"org.springframework.cloud.client.
serviceregistry.AutoServiceRegistrationConfiguration"放入到服务中完成自动装配,寻找AutoServiceRegistrationConfiguration这个类
AutoServiceRegistrationConfiguration这个类寻找spring.facotries配置文件,有一个com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration完成自动服务注册
服务注册流程:
服务发现流程:
上述信息来源,参考资料: 尚硅谷springcloudAlibaba第二季nacos课程、拉钩教育Nacos源码剖析课程.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理