SpringCloud Alibaba(二) - Nacos(nacos)

1 简介

Nacos 全称 Dynamic Naming and Configuration Service

1.1 Nacos 简介

  • Nacos 致力于发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助用户快速实现动态服务发现、服务配置、服务元数据及流量管理;
  • Nacos 帮助用户更敏捷和容易地构建、交付和管理微服务平台;
  • Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

1.2 Nacos 特点

  • 服务发现和服务健康监测

Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层和应用层 的健康检查;对于复杂的云环境和网络拓扑环境提供了 agent 上报模式和服务端主动检测2种健康检查模式。

  • 动态配置服务

Nacos 以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

  • 动态 DNS 服务

Nacos 的动态 DNS 服务支持权重路由,更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。

  • 服务及其元数据管理

Nacos 提供管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

1.3 安装Nacos

1.3.1 安装环境

  • Windows 64位
  • java 1.8.0_301
  • Maven 3.8.2

1.3.2 下载并安装

下载源码:

git clone https://github.com/alibaba/nacos.git

安装到本地仓库:

cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U 

1.3.3 启动Nacos

cd distribution/target/nacos-server-$version/nacos/bin
# Windows
startup.cmd

注:Linux 启动 Nacos使用:

# Linux
./startup.sh -m standalone

1.3.4 访问服务

打开浏览器访问:http://localhost:8848/nacos 登录 Nacos 控制台,默认用户名为 nacos,密码为 nacos:

1.3.5 错误记录

启动 Nacos 可能会报如下错误:

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat

原因是因为 Nacos 是默认的以集群模式启动

需要修改 startup.cmd 里面第 26 行为单机模式:

修改后,重新启动 Nacos 即可成功

1.4 Docker 安装 Nacos

从 git 上 clone 项目 naocs-docker:

git clone https://github.com/nacos-group/nacos-docker.git

Nacos支持三种部署模式:

  • 单机模式 - 用于测试和单机试用(单机模式支持mysql)
  • 集群模式 - 用于生产环境,确保高可用
  • 多集群模式 - 用于多数据中心场景

选择单机部署模式且不使用 mysql,进入 naocs-docker 目录:

cd nacos-docker/example
docker-compose -f standalone-derby.yaml up

开启 firewall 防火墙端口:

firewall-cmd --zone=public --add-port=8848/tcp --permanent
firewall-cmd --reload

访问 http://(安装Nacos机器的IP):8848/nacos,登录 Nacos 控制台,默认用户名为 nacos,密码为 nacos:

2 配置与使用 Nacos

2.1 在 Spring 项目中引入 Nacos 客户端

2.1.1 Nacos Discovery(服务发现)

添加 pom 文件依赖:

<!-- 服务发现 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在 application.yml 添加配置:

server:
  port: 8080

spring:
  application:
    name: auth-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

启动类中添加注解 @EnableDiscoveryClient 开启服务注册发现功能:

package club.lacerate.auth;

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

@SpringBootApplication
@EnableDiscoveryClient
public class AuthAPP {

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

2.1.2 Nacos Config(配置管理)

添加 pom 文件依赖:

<!-- 配置管理 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

在 bootstrap.yml 添加配置:

spring:
  profiles:
    active: dev
  application:
    name: auth-service

  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: properties

:spring.application.name ,是构成 Nacos 配置管理 dataId 字段的一部分;在 Nacos Spring Cloud 中,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.2Nacos 命名空间

命名空间用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离。

2.2.1 添加命名空间

在 nacos web 管理页面中添加一个名字叫 dev 的命名空间:

配置列表里就会出现一个命名空间为 dev 的配置分组:

2.2.2 服务中指定命名空间

在 bootstrap.yml 修改配置:

spring:
  profiles:
    active: dev
  application:
    name: auth-service

  cloud:
    nacos:
      config:
        namespace: cd44bb16-edda-4082-a0c7-e578fc781d75
        server-addr: localhost:8848
        file-extension: properties

2.3 Nacos 动态配置

系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动;一个具体的可配置的参数与其值域,通常以 param-key=param-value 的形式存在。

  • 配置集 ID

配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包的命名规则保证全局唯一性;

  • 配置分组

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

:未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP。

2.3.1 添加配置项

选择 dev 命名空间,新建配置:

添加一个 Data ID 为 auth-service-dev.properties 的配置项,Group 设置为 DEV_GROUP,配置格式选择 Properties,配置内容写入

author.name=foley
author.age=26

2.3.2 服务中指定命名空间

在 bootstrap.yml 修改配置:

spring:
  profiles:
    active: dev
  application:
    name: auth-service

  cloud:
    nacos:
      config:
        group: DEV_GROUP
        namespace: cd44bb16-edda-4082-a0c7-e578fc781d75
        server-addr: localhost:8848
        file-extension: properties

:服务发现配置中也需要修改命名空间

2.3.2 服务中读取配置

使用 @RefreshScope 和 @Value 来读取对应的配置:

package club.lacerate.auth.controller;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RefreshScope
@RestController
@RequestMapping("/test")
public class TestController {

    @Value("${author.name:none}")
    private String name;
    @Value("${author.age:0}")
    private String age;

    @RequestMapping("/get")
    public String get() {
        return name + ": " + age;
    }

}

:冒号后边的是默认值

2.3.3 测试

使用 ApiPost 访问接口,结果如下:

在 nacos 上修改配置的内容:

使用 ApiPost 再次访问接口,结果如下:

2.3.4 配置回滚

nacos 提供30天以内的配置的历史版本及回滚功能:

2.4 服务管理

Nacos 开放服务发现控制台,提供给用户基本的运维页面,能够查看、编辑当前注册的服务:

  • 服务详情:

  • 服务流量权重支持:

Nacos 提供了流量权重控制的能力,同时开放了服务流量的阈值保护;如:可以点击实例的编辑按钮,修改实例的权重。

  • 服务元数据管理:

Nacos 提供多个维度的服务元数据的暴露,帮助用户存储自定义的信息。这些信息都是以 K-V 的数据结构存储;如编辑服务的元数据,先点击服务详情页右上角的“编辑服务”按钮,然后在元数据输入框输入:”key1”=“value1”。

  • 服务上下线:

Nacos 提供服务实例的上下线操作,在服务详情页面,可以点击实例的“上线“或者”下线“按钮进行上下线。

  • 保护阈值

设置为 0-1 之间的浮点数,代表⼀个⽐例值(当前服务健康实例数/当前服务总实例数);当服务健康实例数/总实例数 < 保护阈值时,保护阈值会被触发,nacos 将会把该服务所有的实例信息(健康的+不健康的)全部提供给消费者,消费者可能访问到不健康的实例,可能会导致请求失败,牺牲了⼀些请求,保证了整个系统的⼀个可⽤。

2.5 用户角色管理

Nacos 提供用户角色权限管理:

  • 创建用户:

  • 绑定角色:

  • 添加权限: