Nacos 是阿里巴巴新推出的开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。是 注册中心 + 配置中心 的组合。
Nacos官方文档:什么是 Nacos
安装包下载地址:Releases · alibaba/nacos · GitHub
等价于: Nacos = Eureka + Config
1. Nacos注册中心
1.1 注册中心的意义:
注册中心解决了服务发现的问题。在没有注册中心时候,服务间调用需要知道被调方的地址或者代理地址。当服务更换部署地址,就需要修改调用当中指定的地址或者修改代理配置。而有了注册中心之后,每个服务在调用时候只需要知道服务名称,地址都会通过注册中心同步过来。
目前市面上的注册中心:
1)Eureka(原生,2.0遇到瓶颈,停止维护)
2)Zookeeper(支持,专业的独立产品。例如:dubbo)
3)Consul(原生,GO语言开发)
4)Nacos(阿里巴巴)
Nacos 的特性:
服务发现和服务健康监测:支持基于DNS和基于RPC的服务发现,支持对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求;
动态配置服务:动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置;
动态 DNS 服务:动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务;
服务及其元数据管理:支持从微服务平台建设的视角管理数据中心的所有服务及元数据。
1.2 常用的注册中心
对比 | Nacos | Eureka | Consul | Zookeeper |
一致性协议 | 支持AP和CP模型 | AP模型 | CP模型 | CP模型 |
健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | Keep Alive |
负载均衡策略 | 权重/metadata/Selector | Ribbon | Fabio | - |
雪崩保护 | 有 | 有 | 无 | 无 |
自动注销实例 | 支持 | 支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS | HTTP | HTTP/DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 |
跨注册中心同步 | 支持 | 不支持 | 支持 | 不支持 |
SpringCloud集成 | 支持 | 支持 | 支持 | 不支持 |
Dubbo集成 | 支持 | 不支持 | 不支持 | 支持 |
k8s集成 | 支持 | 不支持 | 支持 | 不支持 |
目前常用的注册中心是Nacos和eureka
1.3 Nacos与eureka的区别:
共同点:
都支持服务注册和服务拉取。
都支持服务提供者心跳的方式做健康检测。
不同点:
nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式(一般情况下都使用临时实例,主动检测消费的服务器资源较大,服务器压力大)。
临时实例心跳不正常会被剔除,非临时实例则不会被剔除。
nacos支持服务列表变更的消息推送模式,服务列表更新及时。
nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;eureka采用AP方式。(经过配置 spring.cloud.nacos.discovery.ephemeral=true #false为永久实例,true表示临时实例开启,注册为临时实例,默认是true)
2. Nacos配置中心
2.1. 什么是配置中心
系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,分散中还包含着冗余。对于在微服务时代,会有大量的重复实例,所以配置中心就诞生了。配置中心解决了在分布式场景下多环境配置文件的管理和维护。
2.2. 理解配置中心
1. 用户在配置中心更新配置信息。
2. 服务A和服务B、C等及时得到配置更新通知,从配置中心获取配置。
2.3. Nacos配置注意事项
1)Nacos配置文件名:bootstrap.yml
配置文件加载的优先级(由高到低)
bootstrap.properties ->bootstrap.yml -> application.properties -> application.yml
2)动态刷新配置类信息
方式一:读取某个属性使用@Value注解,并在对应的配置类上添加@RefreshScope
@RefreshScope //刷新配置注解
public class Config {@Value("${config.age}")
private String age;}
方式二:直接使用@ConfigurationProperties 读取配置
@ConfigurationProperties(prefix = "config")
public class Config {
private String age;}