Nacos
P:分区容错性:指的分布式系统中的某个节点或者网络分区出现了故障的时候,整个系统仍然能对外提供满足一致性和可用性的服务。也就是说部分故障不影响整体使用。
事实上我们在设计分布式系统是都会考虑到bug,硬件,网络等各种原因造成的故障,所以即使部分节点或者网络出现故障,我们要求整个系统还是要继续使用的
(不继续使用,相当于只有一个分区,那么也就没有后续的一致性和可用性了)
**A:可用性:**一直可以正常的做读写操作。简单而言就是客户端一直可以正常访问并得到系统的正常响应。用户角度来看就是不会出现系统操作失败或者访问超时等问题。
C:一致性:在分布式系统完成某写操作后任何读操作,都应该获取到该写操作写入的那个最新的值。相当于要求分布式系统中的各节点时时刻刻保持数据的一致性。
C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
如何选择使用何种模式? 一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和Dubbo服务 ,都适用于AP模式,AP模式为了服务的可用性而减弱了一致性,因此AP模式下只支持注册临时实例。 如果需要在服务级别编辑或者存储配置信息,那么CP是必须的,K8S服务和DNS服务则适用于CP模式 CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
区别
- Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
- Nacos与Eureka的区别
- Nacos支持 服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持 服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式, 当集群中存在非临时实例时,采用CP模式; Eureka采用AP方式
引入
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<exclusions>
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
spring:
application:
name: gateway # nacos的服务名称
profiles:
active: dev # 开发环境,这里是dev
cloud:
nacos:
server-addr: 192.168.1.210:8848 # nacos地址
config:
file-extension: yaml # 文件后缀名
discovery:
ip: 10.1.72.80
服务分级存储模型
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高
本地集群不可访问时,再去访问其它集群
- 指定服务集群
spring:
cloud:
nacos:
server-addr: 192.168.1.210:8848 # nacos地址
config:
file-extension: yaml # 文件后缀名
discovery:
ip: 10.1.72.80
cluster-name: ah # 指定集群
- 指定服务的负载均衡 NacosRuLe
- 优先使用本地服务,然后随机选择本地服务
- 如果本地服务死亡,则会选择远端服务,并且会报告跨集群调用警告
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cLoud.nacos.ribbon.NacosRuLe
- 权重,通过 web界面设置
- Nacos控制台可以设置实例的权重值,0~1之间
- 同集群内的多个实例,权重越高被访问的频率越高
- 权重设置为0则完全不会被访问
服务环境隔离
spring:
application:
name: minio-service # nacos的服务名称
profiles:
active: dev # 开发环境,这里是dev
cloud:
nacos:
server-addr: 192.168.1.210:8848 # nacos地址
config:
file-extension: yaml # 文件后缀名
discovery:
ip: 10.1.72.80
cluster-name: ah
namespace: 2f5cb781-95d8-4e11-a33b-78cf367450c5 # 指定命名空间
临时实例
spring:
application:
name: minio-service # nacos的服务名称
profiles:
active: dev # 开发环境,这里是dev
cloud:
nacos:
server-addr: 192.168.1.210:8848 # nacos地址
config:
file-extension: yaml # 文件后缀名
discovery:
ip: 10.1.72.80
cluster-name: ah
namespace: 2f5cb781-95d8-4e11-a33b-78cf367450c5
ephemeral: false # 设置非临时实例
配置文件管理
不是所有的配置都适合放到配置中心,维护起来比较麻烦建议将一些关键参数, 需要运行时调整的参数放到nacos配置中心,一般都是自定义配置
- bootstrap.yml
spring:
application:
name: minio-service # nacos的服务名称
profiles:
active: dev # 开发环境,这里是dev
cloud:
nacos:
server-addr: 192.168.1.210:8848 # nacos地址
config:
file-extension: yaml # 文件后缀名
discovery:
ip: 10.1.72.80
cluster-name: ah
namespace: 2f5cb781-95d8-4e11-a33b-78cf367450c5
ephemeral: false # 设置非临时实例
自动刷新
Nacos中的配置文件变更后,微服务无需重启就可以感知。
- 在@Value注入的变量所在类上添加注解 @RefreshScope
- 使用@ConfigurationProperties注解
多环境共享
微服务启动时会从nacos读取多个配置文件:
- [spring.application.name]-[spring.profiles.active].yaml, 例如: userservice-dev.yaml
- [spring.application.namel.yaml, 例如: userservice.yaml
无论profile如何变化,[spring.application.name].yaml这个文件- -定会加载, 因此多环境共享配置可以写入这个文件
优先级
服务名-profile.yamI > 服务名称.yaml >本地配置
集群
- 启动多个实例,通过MySQL共享配置
- 通过Nginx负载均衡Nacos节点