Skip to content

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方式

引入

xml
<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>
yaml
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

服务分级存储模型

服务调用尽可能选择本地集群的服务,跨集群调用延迟较高

本地集群不可访问时,再去访问其它集群

  • 指定服务集群
yaml
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
    • 优先使用本地服务,然后随机选择本地服务
    • 如果本地服务死亡,则会选择远端服务,并且会报告跨集群调用警告
yaml
userservice: 
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cLoud.nacos.ribbon.NacosRuLe
  • 权重,通过 web界面设置
    • Nacos控制台可以设置实例的权重值,0~1之间
    • 同集群内的多个实例,权重越高被访问的频率越高
    • 权重设置为0则完全不会被访问

服务环境隔离

yaml
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 # 指定命名空间

临时实例

yaml
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
yaml
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节点