zoukankan      html  css  js  c++  java
  • Nacos 学习记录

    Nacos 学习记录 - 使用

    一、基础概念

    1、命名空间

    用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。

    Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

    2、配置集 ID - Data ID

    Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。

    Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。

    Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。

    3、配置分组 - Group

    Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。

    当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。

    配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。

    4、配置快照

    Nacos 的客户端 SDK 会在本地生成配置的快照。当客户端无法连接到 Nacos Server 时,可以使用配置快照显示系统的整体容灾能力。

    配置快照类似于 Git 中的本地 commit,也类似于缓存,会在适当的时机更新,但是并没有缓存过期(expiration)的概念。

    二、注册中心 

    三、配置中心

    首先,在 nacos 服务端新建配置

    1、配置文件命名规则

    dataId 的完整格式如下:

    ${prefix}-${spring.profiles.active}.${file-extension}

    说明:

    prefix: 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。

    spring.profiles.active: 即为当前环境对应的 profile。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

    file-exetension: 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型

    2、内容

    配置跟配置文件扩展名对应类型的配置内容。

    例如:

    .properties 文件

    .yml 文件

    其次,在 spring-cloud 项目中配置 bootstrap.yml 文件 

    注意:

    1、项目中不要配置 application.yml,application-dev.yml,application.properties,application-dev.properties 配置文件;

    2、file-extension 项要与 nacos 中对应的配置文件的扩展名一致。

    3、@RefreshScope 实时刷新

    @RefreshScope注解能帮助我们做局部的参数刷新,但侵入性较强,需要开发阶段提前预知可能的刷新点,并且该注解底层是依赖于cglib进行代理的。

    配置 bootstrap.yml 文件如下:

    server:
      port: 9001
    
    spring:
      application:
        name: user-service
      profiles:
        active: dev
    
    ---
    #开发环境配置
    spring:
      profiles: dev
      cloud:
        nacos:
          discovery:
            server-addr: xx.xxx.xx.xxx:8848
            ip: xx.xxx.xx.xxx
          # ${prefix}-${spring.profile.active}.${file-extension}
          config:
            server-addr: xx.xxx.xx.xxx:8848
            file-extension: yml
            enabled: true

    问题:

    一、Nacos微服务注册地址为内网IP的解决办法

    解决办法:配置固定IP 和 端口号

    spring.cloud.nacos.discovery.ip = 本机公网IP
    spring.cloud.nacos.discovery.port = 服务端口

    二、配置缓存

    待续。。。

    集群选举

    一致性算法:Nacos集群采用 raft 算法来实现

    选举说明:

    在Raft中,节点有三种角色:

    • Leader:负责接收客户端的请求
    • Candidate:用于选举Leader的一种角色(竞选状态)
    • Follower:负责响应来自Leader或者Candidate的请求

    选举分为两个节点

    • 服务启动的时候
    • leader挂了的时候

      所有节点启动的时候,都是follower状态。 如果在一段时间内如果没有收到leader的心跳(可能是没有leader,也可能是leader挂了),那么follower会变成Candidate。然后发起选举,选举之前,会增加 term,这个 term 和 zookeeper 中的 epoch 的道理是一样的。

      follower会投自己一票,并且给其他节点发送票据vote,等到其他节点回复在这个过程中,可能出现几种情况

    • 收到过半的票数通过,则成为leader
    • 被告知其他节点已经成为leader,则自己切换为follower
    • 一段时间内没有收到过半的投票,则重新发起选举

      约束条件在任一term中,单个节点最多只能投一票

    选举的几种情况 :

    第一种情况,赢得选举之后,leader会给所有节点发送消息,避免其他节点触发新的选举

    第二种情况,比如有三个节点A B C。A B同时发起选举,而A的选举消息先到达C,C给A投了一票,当B的消息到达C时,已经不能满足上面提到的约束条件,即C不会给B投票,而A和B显然都不会给对方投票。A胜出之后,会给B,C发心跳消息,节点B发现节点A的term不低于自己的term,知道有已经有Leader了,于是转换成follower

    第三种情况, 没有任何节点获得majority投票,可能是平票的情况。加入总共有四个节点(A/B/C/D),Node C、Node D同时成为了candidate,但Node A投了NodeD一票,NodeB投了Node C一票,这就出现了平票 split vote的情况。这个时候大家都在等啊等,直到超时后重新发起选举。如果出现平票的情况,那么就延长了系统不可用的时间,因此raft引入了 randomizedelection timeouts来尽量避免平票情况.

    心跳机制

    待续。。。

    参考资料:

    官方文档

    官方示例

    Nacos Spring Cloud 快速开始

    Nacos服务注册地址为内网IP的解决办法

    Nacos 集群选举原理

    Spring Cloud Alibaba Nacos(心跳与选举)

    Nacos注册中心设计分析-CP模式

    Nacos注册中心设计分析-AP模式

  • 相关阅读:
    向内的寻找
    了解潜意识
    NOI2014 Day1
    NOI2011 Day1
    NOI2012 Day2
    NOI2012 Day1
    NOI2013 Day2
    NOI2013 Day1
    拉格朗日乘数法
    NOI2015 Day2
  • 原文地址:https://www.cnblogs.com/wangwangfei/p/13404738.html
Copyright © 2011-2022 走看看