-->
侧边栏壁纸
博主头像
断钩鱼 博主等级

行动起来,活在当下

  • 累计撰写 28 篇文章
  • 累计创建 34 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Nacos安装及使用

halt
2021-11-17 / 0 评论 / 0 点赞 / 1968 阅读 / 0 字

Nacos安装及使用

介绍

Nacos 官方地址为https://nacos.io/zh-cn/index.html。由阿里开源,官方定义为:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 具备以下职能:

  • 服务发现及管理;
  • 动态配置服务;
  • 动态 DNS 服务。

Nacos 概念

参考:https://nacos.io/zh-cn/docs/concepts.html

Nacos 领域模型

数据模型

Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。

Namespace: 可以将NameSpace 分为 开发环境、测试环境、预发布环境、生产环境等 ,作为数据隔离,不同命名空间内服务不能进行通信

Group: 分组 将不同的项目分在不同的分组下

Service: 项目下的不同服务模块

DataId: 服务的配置信息Id

数据模型

服务模型

服务:可以通过nacos控制台进行健康检查开关元数据路由机制保护阈值进行配置

  • 保护阈值为 0 - 1 之间的浮点数据,当健康实例/总实例的比例低于保护阈值时,nacos会将所有的实例信息返回,从而避免服务产生雪崩
  • 例如:服务下有10个实例,高负载情况下8个实例即可满足正常请求,如果有5个实例出现问题,成为不健康实例,这时当系统在高负载状态下运行,只有5个健康实例可以使用,那么实例可能因为压力过大而停止服务,从而产生服务雪崩,这是如果有保护阈值,当触发阈值时,nacos会在消费者请求时将所有实例信息返回,这样即使有5个实例不可用,但是他们同样也分担了流量压力,从而以部分服务调用失败来换取服务的部分正常使用,不至于全部不可用,退而求其次

集群:同一个服务可以有实例构成不同的集群 配置参考

  • 可以通过nacos控制台进行健康检查模式元数据同步机制进行配置
  • 服务消费者请求时会优先提供统一集群信息,可以配置为数据中心标识,降低服务调用延迟及开销,提高性能

实例:多个实例组成集群,可以通过naocs控制台配置权重上下线元数据 ,同时可以查看ip、端口、健康状态、响应时间等信息

服务模型

配置模型

围绕配置,主要有两个关联的实体,一个是配置变更历史(History 方便配置的回滚等操作),一个是服务标签(Tag 用于打标分类,方便索引),由 ID 关联。

Namespace: 可以将NameSpace 分为 开发环境、测试环境、预发布环境、生产环境等 ,作为数据隔离

Group: 分组 将不同的项目分在不同的分组下

DataId: 服务的配置信息Id

实现配置的数据隔离

配置模型

Nacos 快速部署

我是用的Ubuntu虚拟机安装

环境准备

安装JDK

# 安装jdk
apt-get install openjdk-8-jdk
# 验证版本信息
java -version

配置JAVA_HOME

安装后 JDK 不要忘记设置 JAVA_HOME 环境变量,OpenJDK 默认安装在 /usr/lib/jvm/ 路径下,之后通过编辑 profile 设置 JAVA_HOME 环境变量。

# 编辑环境变量
vim /etc/profile
# 添加以下配置
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
# 更新环境变量
root@halt:/home/nacos# source /etc/profile
# 验证
root@halt:/home/nacos# echo $JAVA_HOME
/usr/lib/jvm/java-8-openjdk-amd64

安装Nacos

  1. 访问 Nacos GitHub:https://github.com/alibaba/nacos/releases/获取 Nacos 最新版安装包地址

  2. 使用 wget 下载

    wget https://github.com/alibaba/nacos/releases/download/2.0.3/nacos-server-2.0.3.tar.gz
    
  3. 解压安装包

    tar -xzvf nacos-server-2.0.3.tar.gz
    

    解压后 Nacos 目录结构如下:

    • bin:保存启用/关闭 Nacos Server 脚本;

    • conf:Nacos Server 配置目录;

    • data:Nacos 数据目录;

    • logs:存放日志目录;

    • target:Nacos Jar 包存放目录;

  4. 以单点方式启动 Nacos。

    # 进入脚本目录
    cd nacos/bin
    # 以单机模式启动
    bash startup.sh -m standalone
    
  5. 访问

    关闭Ubuntu虚拟机防火墙 ufw disable

    查看虚拟机地址 ip addr

    访问:http://192.168.59.102:8848/nacos

    其中,8848 端口是 Nacos 对客户端提供服务的端口,7848 是 Nacos 集群通信端口,用于Nacos 集群间进行选举,检测等

    默认用户名密码 nacos

    Nacos 控制台

Nacos集群部署

集群部署官方文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

克隆虚拟机

将虚拟机克隆成三份 地址分别为 201 202 203

  1. 修改虚拟机中的ip

    cd /etc/netplan/
    # 编辑网路配置文件
    vim vim 00-installer-config.yaml
    
    # This is the network config written by 'subiquity'
    network:
      ethernets:
        ens33:
          dhcp4: true
          addresses: [192.168.59.201/24]
          optional: true
          gateway4: 192.168.59.2
          nameservers:
            addresses: [223.5.5.5,223.6.6.6]
      version: 2
    

搭建Nacos集群

  1. 创建cluster配置文件

    在nacos下conf目录下创建cluster.conf文件里写入各个节点信息

    例如:

    192.168.59.201:8848
    192.168.59.202:8848
    192.168.59.203:8848
    
  2. 创建mysql服务器

    克隆虚拟机独立部署一个mysql nacos集群靠mysql实现节点之间的数据共享

    # 安装mysql
    apt install mysql-server
    # 开机启动
    systemctl status mysql
    # 根据提示进行设置
    mysql_secure_installation
    # 允许远程连接 登录mysql
    mysql -uroot -proot
    # 进入mysql表
    use mysql
    # 允许root远程登陆
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION;
    # 重载授权表
    FLUSH PRIVILEGES;
    

    关闭mysql绑定本地设置

    # 进入
    cd /etc/mysql/mysql.conf.d
    # 编辑mysql配置
    vim mysqld.cnf
    # 注释掉
    #bind-address           = 127.0.0.1
    
  3. 创建nacos数据库

    nacos/config/nacos-mysql.sql 脚本创建数据库

  4. 编辑nacos配置文件

    编辑数据库配置

    cd nacos/conf
    # 编辑配置
    vim application.properties
    
    #*************** Config Module Related Configurations ***************#
    ### If use MySQL as datasource:
    spring.datasource.platform=mysql
    
    ### Count of DB:
    db.num=1
    
    ### Connect URL of DB:
    db.url.0=jdbc:mysql://192.168.59.210:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user.0=root
    db.password.0=mengshuo
    

    使用 scp 将配置传到其他两个节点

    scp application.properties root@192.168.59.202:/home/nacos/nacos/conf/ root@192.168.59.203:/home/nacos/nacos/conf/

  5. 启动nacos 查看效果

    展开节点元数据可以看当前节点是 那种角色

    Nacos 集群采用 Raft 算法实现。它是一种比较简单的选举算法,用于选举出 Nacos 集群中最重要的 Leader(领导)节点。

    在 Nacos 集群中,每个节点都拥有以下三种角色中的一种。

    • Leader:领导者,集群中最重要的角色,用于向其他节点下达指令。

    • Candidate:参选者,参与竞选 Leader 的节点。

    • Follower:跟随者,用于接收来自 Leader 或者 Candidate 的请求并进行处理。

    在集群中选举出 Leader 是最重要的工作,产生选举的时机有三个:

    • 在 Nacos 节点启动后,还没有产生Leader时选举;

    • 集群成员总量变更时重新选举;

    • 当 Leader 停止服务后重新选举。

    集群状态

Nacos 配置项

SpringBootStarter 配置参考

注册中心

配置项参考:com.alibaba.cloud.nacos.NacosDiscoveryProperties 中的属性

内容&用法参考: https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery#%E5%85%B3%E4%BA%8E-nacos-starter-%E6%9B%B4%E5%A4%9A%E7%9A%84%E9%85%8D%E7%BD%AE%E9%A1%B9%E4%BF%A1%E6%81%AF

配置项Key默认值说明
服务端地址spring.cloud.nacos.discovery.server-addrNacos Server 启动监听的ip地址和端口
服务名spring.cloud.nacos.discovery.service${spring.application.name}给当前的服务命名
服务分组spring.cloud.nacos.discovery.groupDEFAULT_GROUP设置服务所处的分组
权重spring.cloud.nacos.discovery.weight1取值范围 1 到 100,数值越大,权重越大
网卡名spring.cloud.nacos.discovery.network-interface当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
注册的IP地址spring.cloud.nacos.discovery.ip优先级最高
注册的端口spring.cloud.nacos.discovery.port-1默认情况下不用配置,会自动探测
命名空间spring.cloud.nacos.discovery.namespace常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
AccessKeyspring.cloud.nacos.discovery.access-key当要上阿里云时,阿里云上面的一个云账号名
SecretKeyspring.cloud.nacos.discovery.secret-key当要上阿里云时,阿里云上面的一个云账号密码
Metadataspring.cloud.nacos.discovery.metadata使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
日志文件名spring.cloud.nacos.discovery.log-name
集群spring.cloud.nacos.discovery.cluster-nameDEFAULT配置成Nacos集群名称
接入点spring.cloud.nacos.discovery.enpointUTF-8地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成Ribbonribbon.nacos.enabledtrue一般都设置成true即可
是否开启Nacos Watchspring.cloud.nacos.discovery.watch.enabledtrue可以设置成false来关闭 watch

配置中心

配置项参考: com.alibaba.cloud.nacos.NacosConfigProperties 中的属性

用法参考:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

下图中配置从 com.alibaba.cloud.nacos.NacosConfigProperties 摘取,自己总结的可能有错 仅供参考

配置项Key默认值说明
服务端地址spring.cloud.nacos.config.server-addrNacos Server 启动监听的ip地址和端口
dataId名称spring.cloud.nacos.config.name定义dataId
配置分组spring.cloud.nacos.config.groupDEFAULT_GROUP设置服务所处的分组
命名空间spring.cloud.nacos.config.namespace设置服务所在命名空间
配置文件后缀spring.cloud.nacos.config.file-extensionproperties配置文件后缀
用户名spring.cloud.nacos.config.username配置中心用户名
密码spring.cloud.nacos.config.password配置中心密码
编码spring.cloud.nacos.config.encodeUTF-8配置编码格式
前缀spring.cloud.nacos.config.prefix${spring.application.name}配置 dataId 前缀
查询配置超时时间spring.cloud.nacos.config.timeout3000从 nacos 获取配置超时时间
连接错误最大数量spring.cloud.nacos.config.max-retry 可容忍的服务器重连错误的最大数量
获取长轮询超时时间spring.cloud.nacos.config.config-long-poll-timeout 获取配置长轮询超时时间
获取配置失败重试时间spring.cloud.nacos.config.config-retry-time 获取配置失败重试时间
是否自定义配置拉取和监听spring.cloud.nacos.config.enable-remote-sync-configfalse如果想在程序第一次开始获取配置的时候自己拉取,并且注册的监听器用于以后的配置更新 设置为true
接入点spring.cloud.nacos.config.endpointNacos的端点,服务的域名,通过它可以动态获取服务器地址。
accessKeyspring.cloud.nacos.config.access-key命名空间的访问密钥
secretKeyspring.cloud.nacos.config.secret-key命名空间的密钥
上下文路径spring.cloud.nacos.config.context-path nacos 配置服务器的上下文路径
集群名称spring.cloud.nacos.config.cluster-nameDEFAULT集群名称
共享配置信息spring.cloud.nacos.config.shared-configs一组共享配置。例如: spring.cloud.nacos.config.shared-configs[0]=xxx
扩展配置信息spring.cloud.nacos.config.extension-configs一组扩展配置 .eg: spring.cloud.nacos.config.extension-configs[0]=xxx
是否自动刷新配置spring.cloud.nacos.config.refresh-enabledtrue刷新配置的主开关,默认打开

下文引用自官方Wiki

支持自定义扩展的 Data Id 配置

Spring Cloud Alibaba Nacos Config 从 0.2.1 版本后,可支持自定义 Data Id 的配置。关于这部分详细的设计可参考 这里。 一个完整的配置案例如下所示:

spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common01.properties

# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP

# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[2].refresh=true

可以看到:

  • 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的配置方式来支持多个 Data Id 的配置。
  • 通过 spring.cloud.nacos.config.extension-configs[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
  • 通过 spring.cloud.nacos.config.extension-configs[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高。
spring.cloud.nacos.config.extension-configs[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。

通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。

为了更加清晰的在多个应用间配置共享的 Data Id ,你可以通过以下的方式来配置:

# 配置支持共享的 Data Id
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml

# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1

# 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
spring.cloud.nacos.config.shared-configs[0].refresh=true

可以看到:

  • 通过 spring.cloud.nacos.config.shared-configs[n].data-id 来支持多个共享 Data Id 的配置。
  • 通过 spring.cloud.nacos.config.shared-configs[n].group 来配置自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
  • 通过 spring.cloud.nacos.config.shared-configs[n].refresh 来控制该Data Id在配置变更时,是否支持应用中动态刷新,默认false。

配置的优先级

Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。

  • A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
  • B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
  • C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置

当三种方式共同使用时,他们的一个优先级关系是:A < B < C

完全关闭配置

通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config

接入Nacos

最简单的接入

接入Nacos注册中心

详细请参考Wiki: https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery

添加依赖

<!-- boot启动依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 端点监控 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--  Nacos注册中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

添加配置

spring:
  application:
    name: simple-service
  cloud:
    # nacos 配置
    nacos:
      # 注册中心配置
      discovery:
        # 注册中心地址 多个以逗号隔开
        server-addr: 192.168.59.201:8848,192.168.59.202:8848,192.168.59.203:8848
# 端点监控
management:
  endpoints:
    web:
      exposure:
        include: "*"

启用服务注册与发现

@EnableDiscoveryClient

package top.mengshuo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * simpleService 启动类
 *
 * @author mengshuo
 * @since 2021-11-16
 */
@EnableDiscoveryClient
@SpringBootApplication
public class SimpleServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(
            SimpleServiceApplication.class, args);
    }
}

查看服务列表

服务列表

接入Nacos配置中心

详情请参考Wiki: https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

添加依赖

<!-- Nacos配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

添加配置

创建bootstrap.yml 配置文件,properties 文件也可

同时可以按照环境进行区分创建 dev、prod 等,待正式发布时无需修改,直接通过启动参数指定为prod环境,无需再修改为正式环境的配置中心地址等配置

  • bootstrap.yml 配置

    spring:
      application:
        name: simple-service
      profiles:
        active: dev
    
  • bootstrap-dev.yml 配置

    spring:
      cloud:
        nacos:
          config:
            # 配置中心地址
            server-addr: 192.168.59.102:8848
            # nacos config dataId 的后缀,也是配置内容的文件扩展名
            file-extension: yaml
    
  • bootstrap-prod.yml 配置

    spring:
      cloud:
        nacos:
          config:
            # 配置中心地址
            server-addr: 192.168.59.202:8848
            # nacos config dataId 的后缀,也是配置内容的文件扩展名
            file-extension: yaml
    

Nacos配置中心添加配置

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

同时还可以设置分组、命名空间等配置

我直接将application.yml中的配置移动到nacos中 本地配置文件删除 依然可以正常启动并注册到注册中心

naocs配置中心

动态刷新配置

@Configuration
@RefreshScope

  1. 创建自定义系统配置类

    package top.mengshuo.config;
    
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.context.annotation.Configuration;
    
    import java.io.Serializable;
    
    /**
     * @author mengshuo
     * @since 2021-11-16
     */
    @Data
    @ConfigurationProperties(prefix = "system")
    @Configuration
    @RefreshScope
    public class SystemConfig implements Serializable {
        private static final long serialVersionUID = 6537627716715024027L;
    
        private String name;
        private String desc;
    
    }
    
    
  2. 创建测试接口

    package top.mengshuo.controller;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import top.mengshuo.config.SystemConfig;
    
    import javax.annotation.Resource;
    
    /**
     * @author mengshuo
     * @since 2021-11-16
     */
    @RequestMapping("/config")
    @RestController
    public class ConfigController {
    
        @Resource
        private SystemConfig systemConfig;
    
        @GetMapping("/info")
        public SystemConfig getConfig(){
            return this.systemConfig;
        }
    }
    
    
  3. nacos配置中心添加配置

    system: 
      name: ${spring.application.name}
      desc: 123456
    
  4. 修改配置并进行对比

    system: 
      name: ${spring.application.name}
      desc: 654321
    
  5. 测试结果

    修改前

    修改后

0
博主关闭了所有页面的评论