暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

微服务系列之Nacos配置中心

哈喽沃德先生 2020-06-15
261

Nacos 介绍



Nacos 是 Alibaba 公司推出的开源工具,用于实现分布式系统的服务发现与配置管理。英文全称 Dynamic Naming and Configuration Service,Na 为 Naming/NameServer 即注册中心,co 为 Configuration 即配置中心,Service 是指该注册/配置中心都是以服务为核心。服务(Service)是 Nacos 世界的一等公民。

官网是这样说的:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 可以更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构的服务基础设施。

使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。

Nacos 官网:https://nacos.io/zh-cn/

Github:https://github.com/alibaba/nacos


Nacos 安装


环境准备


Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行 Nacos,还需要为此配置 Maven 环境,请确保是在以下版本环境中安装使用:

  • JDK 1.8+;
  • Maven 3.2.x+。


下载源码或者安装包


可以通过源码和发行包两种方式来获取 Nacos。


源码方式


从 Github 上下载源码方式。

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin


发行包方式


您可以从 https://github.com/alibaba/nacos/releases 下载最新稳定版本的 nacos-server
包。


启动服务器


Linux/Unix/Mac


在 Nacos 的解压目录 nacos/bin
目录下启动。

启动命令(standalone 代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是 ubuntu 系统,或者运行脚本报错提示符号找不到,可尝试如下运行:

bash startup.sh -m standalone


Windows


启动命令:

cmd startup.cmd

或者双击 startup.cmd
运行文件。


访问


访问:http://localhost:8848/nacos/ ,默认用户名/密码是 nacos/nacos。


关闭服务器


Linux/Unix/Mac


sh shutdown.sh


Windows


cmd shutdown.cmd

或者双击 shutdown.cmd
运行文件。


配置 MySQL 数据库


Nacos 在 0.7
版本之前,默认使用的是嵌入式数据库 Apache Derby
来存储数据(内嵌的数据库会随着 Nacos 一起启动,无需额外安装);0.7
版本及以后,增加了对 MySQL
数据源的支持。


MySQL数据源


环境要求:MySQL 5.6.5+(生产使用建议至少主备模式,或者采用高可用数据库);


初始化 MySQL 数据库


创建数据库 nacos_config

SQL源文件地址:https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql ,或者在 nacos-server
解压目录 conf
下,找到 nacos-mysql.sql
文件,运行该文件,结果如下:


application.properties 配置


修改 nacos/conf/application.properties
文件的以下内容。

最终修改结果如下:

#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
# 指定数据源为 MySQL
spring.datasource.platform=mysql

### Count of DB:
# 数据库实例数量
db.num=1

# 数据库连接信息,如果是 MySQL 8.0+ 版本需要添加 serverTimezone=Asia/Shanghai
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai
db.user=root
db.password=1234

如果你和我一样使用的是 MySQL 8.0+ 版本,那么启动 Nacos 时肯定会报错。莫慌,在 Nacos 安装目录下新建 plugins/mysql
文件夹,并放入 8.0+ 版本的 mysql-connector-java-8.0.xx.jar,重启 Nacos 即可,启动时会提示更换了 MySQL 的 driver-class 类。


Nacos 配置入门


nacos-config-demo
聚合工程。SpringBoot 2.3.0.RELEASE
Spring Cloud Hoxton.SR5


发布配置


选择 配置管理
配置列表
页面,点击最右侧 +
按钮新建配置。


Nacos Config 使用 Data ID
Group
来确定配置。

下图显示 Data Id
product-service.yaml
,组使用默认组,并添加 yaml
格式的配置信息。

project:
name: SpringCloudAlibaba
org: Aliababa


获取配置


创建项目


我们创建聚合项目来讲解 Nacos,首先创建一个 pom 父工程。


添加依赖


pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<!-- 项目坐标地址 -->
<groupId>org.example</groupId>
<!-- 项目模块名称 -->
<artifactId>nacos-config-demo</artifactId>
<!-- 项目版本名称 快照版本SNAPSHOT、正式版本RELEASE -->
<version>1.0-SNAPSHOT</version>

<!-- 继承 spring-boot-starter-parent 依赖 -->
<!-- 使用继承方式,实现复用,符合继承的都可以被使用 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
</parent>

<!--
集中定义依赖组件版本号,但不引入,
在子工程中用到声明的依赖时,可以不加依赖的版本号,
这样可以统一管理工程中用到的依赖版本
-->

<properties>
<!-- Spring Cloud Hoxton.SR5 依赖 -->
<spring-cloud.version>Hoxton.SR5</spring-cloud.version>
<!-- spring cloud alibaba 依赖 -->
<spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
</properties>

<!-- 项目依赖管理 父项目只是声明依赖,子项目需要写明需要的依赖(可以省略版本信息) -->
<dependencyManagement>
<dependencies>
<!-- spring cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<!-- spring cloud alibaba 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

</project>


商品服务 product-service


创建项目


在刚才的父工程下创建一个 product-service
项目。


添加依赖


主要添加 spring-cloud-starter-alibaba-nacos-config
依赖。

<!-- spring cloud alibaba nacos config 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

完整依赖如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">


<!-- 继承父依赖 -->
<parent>
<artifactId>nacos-config-demo</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>product-service</artifactId>

<!-- 项目依赖 -->
<dependencies>
<!-- spring cloud alibaba nacos config 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- spring boot web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- lombok 依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>

<!-- spring boot test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

</project>


配置文件


bootstrap.yml
中配置 Nacos Server 的地址和应用名。

server:
port: 7070 # 端口

spring:
application:
name: product-service # 应用名称
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 进行配置管理,设置为 false 即可
server-addr: 127.0.0.1:8848 # Nacos Server 地址
group: DEFAULT_GROUP # 组,默认为 DEFAULT_GROUP
file-extension: yaml # 配置内容的数据格式,默认为 properties

说明:之所以需要配置 spring.application.name
,是因为它是构成 Nacos 配置管理 dataId
字段的一部分。

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

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

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


控制层


使用 Spring 的 @Value
注解来获取配置信息,${}
中对应 Nacos 配置中心配置内容的 key,:
后跟默认值。

并且通过 Spring Cloud 原生注解 @RefreshScope
实现配置自动更新。

package org.example.controller;

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

import java.util.HashMap;
import java.util.Map;

@RefreshScope
@RestController
public class ConfigController {

@Value("${project.name:}")
private String projectName;

@Value("${project.org:}")
private String projectOrg;

@GetMapping("/config")
public Map<String, Object> getConfig() {
Map<String, Object> configMap = new HashMap();
configMap.put("projectName", projectName);
configMap.put("projectOrg", projectOrg);
return configMap;
}

}


启动类


package org.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ProductServiceApplication {

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

}


测试


访问:http://localhost:7070/config 结果如下:


修改配置为以下内容,重新发布:

project:
name: SpringCloudAlibaba-Nacos
org: Aliababa


控制台打印信息如下:

c.a.c.n.c.NacosPropertySourceBuilder     : Loading nacos data, dataId: 'product-service.yaml', group: 'DEFAULT_GROUP'
b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-product-service.yaml'}]
o.s.boot.SpringApplication : No active profile set, falling back to default profiles: default
o.s.boot.SpringApplication : Started application in 3.356 seconds (JVM running for 50.676)
o.s.c.e.event.RefreshEventListener : Refresh keys changed: [project.name]


访问:http://localhost:7070/config 结果如下:


Nacos 配置核心概念


配置


为什么需要配置?概念。

在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。


配置管理


对配置的多维度管理。

系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。


配置项


一个键值对 Key = Value。

一个具体的可配置的参数与其值域(一个键值对),通常以 param-key=param-value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。


配置集


多个键值对,一般指一个配置文件。

一组相关或者不相关的配置项的集合称为配置集(多个键值对/一个配置文件)。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。


配置集 ID


给这个配置文件起一个全局唯一的 ID。

Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。


配置分组


多个配置文件放在一起,形成组,一般用于区分项目。例如,某学校多应用之间的区分,教师应用 TEACHER_GROUP,学生应用 STUDENT_GROUP。

Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。


配置快照


缓存配置信息。

Nacos 的客户端 SDK 会在本地生成配置的快照。当客户端无法连接到 Nacos Server 时,可以使用配置快照显示系统的整体容灾能力。配置快照类似于 Git 中的本地 commit,也类似于缓存,会在适当的时机更新,但是并没有缓存过期(expiration)的概念。


命名空间


区分环境,比如:dev、test、prod 等等。

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。


最佳实践


通常我们可以这样定义 Namespace,Group,DataId:

  • Namespace
    :代表不同的「环境」,如:开发、测试, 生产等;
  • Group
    :代表某个「项目」,如:XX物流项目,XX教育项目;
  • DataId
    :每个项目下往往有若干个「应用」,每个配置集(DataId)是一个应用的「主配置文件」

Namespace 命名空间


前面已经介绍过命名空间的概念,用于隔离多个环境,而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们针对企业项目实际研发流程和环境进行规划。

如某软件公司拥有开发、测试、生产三套环境,那么我们应该建立三个 Namespace 进行区分。


创建命名空间


点击左侧菜单 命名空间
,看到默认有一个 public(保留空间)
,点击右侧 新建命名空间
进行创建。


按下图的方式分别创建 dev(开发环境)
test(测试环境)
prod(生产环境)
三个命名空间。


最终结果如下:


指定命名空间


如果 spring.cloud.nacos.config.namespace
中没有指定名称空间,则使用 Nacos 的 public(保留空间)。还可以按以下方式指定自定义名称空间:

spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7

此配置必须在 bootstrap.yml 文件中。 spring.cloud.nacos.config.namespace 的值是命名空间的 ID,可以从 Nacos 控制台中检索 ID 的值。 添加配置时,请勿选择其他名称空间。 否则,将无法正确检索配置。


发布配置


选择 配置管理
配置列表
页面,选择 dev
环境,点击最右侧 +
按钮新建配置。


Nacos Config 使用 Data ID
Group
来确定配置。

下图显示 Data Id
product-service.yaml
,组使用默认组,并添加 yaml
格式的配置信息。

project:
name: SpringCloudAlibaba-DEV
org: Aliababa


获取配置


配置文件


bootstrap.yml

server:
port: 7070 # 端口

spring:
application:
name: product-service # 应用名称
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 进行配置管理,设置为 false 即可
server-addr: 127.0.0.1:8848 # Nacos Server 地址
group: DEFAULT_GROUP # 组,默认为 DEFAULT_GROUP
file-extension: yaml # 配置内容的数据格式,默认为 properties
namespace: 450a3f07-08ee-49f6-8213-9b04b06cd3cc # 对应 dev 环境


控制层


使用 Spring 的 @Value
注解来获取配置信息,${}
中对应 Nacos 配置中心配置内容的 key,:
后跟默认值。

并且通过 Spring Cloud 原生注解 @RefreshScope
实现配置自动更新。

package org.example.controller;

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

import java.util.HashMap;
import java.util.Map;

@RefreshScope
@RestController
public class ConfigController {

@Value("${project.name:}")
private String projectName;

@Value("${project.org:}")
private String projectOrg;

@GetMapping("/config")
public Map<String, Object> getConfig() {
Map<String, Object> configMap = new HashMap();
configMap.put("projectName", projectName);
configMap.put("projectOrg", projectOrg);
return configMap;
}

}


测试


访问:http://localhost:7070/config 结果如下:


Group 组


Group 组信息可以在新建配置时进行指定,如下图:


配置管理


这一小节我们通过大量配图演示控制台的相关操作。


新建/编辑/删除/查询


右侧 +
新建配置。单条编辑或删除选择操作栏中的编辑或删除。批量删除勾选以后选择左下角红色删除。


可以通过 Data Id
Group
查询配置,还可以将查询结果导出。


导入/导出/克隆


前文提到命名空间用于隔离多个环境,每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。也就是说可能大量的配置项都是相同的,个别差异的配置项需要额外修改,在这种情况下,如果一条条重新添加肯定非常不友好,我们可以通过导入导出功能实现。

比如,我们将 dev
环境下的配置先全选导出。


然后在 test
环境中导入,文件上传后将直接导入配置,请务必谨慎操作!


通过克隆也可以达到相同的效果,不同的是克隆可以额外修改 Data Id
Group
信息。


历史/回滚


选择 配置管理
历史版本
页面,通过 Data Id
Group
查询历史,可以查看每个历史版本的详情,或选择回滚至该版本。


监听查询


Nacos 提供配置订阅者,也就是监听者查询能力,同时提供客户端当前配置的 MD5 校验值,以便帮助用户更好的检查配置变更以后是否推送到 Client 端。

选择 配置管理
监听查询
页面,通过 配置或IP
Data Id
Group
查询。


权限控制


Nacos 提供了基于 RBAC 的权限控制,通过左侧 权限控制
菜单的 用户列表
角色管理
权限管理
实现,可以算是傻瓜式操作了,鼠标多点几下就会了。


公共配置


每个配置集对应一个应用,但是开发时我们可能会有一些公共配置被多个应用使用,这时候就需要扩展配置集或共享配置集来实现了。


扩展配置集


我们先创建三个配置集,如下:

Data ID: ext-config-common01.yaml
Group: DEFAULT_GROUP
Configuration format: YAML
Configuration content: common.name: common-service

Data ID: ext-config-common02.yaml
Group: GLOBAL_GROUP
Configuration format: YAML
Configuration content: global.name: global-service

Data ID: ext-config-common03.yaml
Group: REFRESH_GROUP
Configuration format: YAML
Configuration content: refresh.name: refresh-service


获取配置


配置文件


bootstrap.yml

server:
port: 7070 # 端口

spring:
application:
name: product-service # 应用名称
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 进行配置管理,设置为 false 即可
server-addr: 127.0.0.1:8848 # Nacos Server 地址
group: MALL_GROUP # 组,默认为 DEFAULT_GROUP
file-extension: yaml # 配置内容的数据格式,默认为 properties
namespace: 450a3f07-08ee-49f6-8213-9b04b06cd3cc # 对应 dev 环境
# 扩展配置集
ext-config[0]:
data-id: ext-config-common01.yaml # 配置集 id
ext-config[1]:
data-id: ext-config-common02.yaml # 配置集 id
group: GLOBAL_GROUP # 组,默认为 DEFAULT_GROUP
ext-config[2]:
data-id: ext-config-common03.yaml # 配置集 id
group: REFRESH_GROUP # 组,默认为 DEFAULT_GROUP
refresh: true # 是否支持动态刷新

总结:

  • 通过配置 spring.cloud.nacos.config.ext-config[n].data-id
    来支持多个配置集。
  • 通过配置 spring.cloud.nacos.config.ext-config[n].group
    来定制配置组。如果未指定,则使用默认组。
  • 通过配置 spring.cloud.nacos.config. config[n].refresh
    来控制该配置集是否支持配置的动态刷新。默认情况下不支持。


控制层


使用 Spring 的 @Value
注解来获取配置信息,${}
中对应 Nacos 配置中心配置内容的 key,:
后跟默认值。

并且通过 Spring Cloud 原生注解 @RefreshScope
实现配置自动更新。

package org.example.controller;

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

import java.util.HashMap;
import java.util.Map;

@RefreshScope
@RestController
public class ConfigController {

@Value("${common.name:}")
private String commonName;

@Value("${global.name:}")
private String globalName;

@Value("${refresh.name:}")
private String refreshName;

@GetMapping("/extConfig")
public Map<String, Object> getExtConfig() {
Map<String, Object> configMap = new HashMap();
configMap.put("commonName", commonName);
configMap.put("globalName", globalName);
configMap.put("refreshName", refreshName);
return configMap;
}

}


测试


访问:http://localhost:7070/extConfig 结果如下:


共享配置集


通过共享配置集的方式也可以实现公共配置的功能,唯一的区别就是共享配置集无法设置组信息,只获取 DEFAULT_GROUP。具体实现方式如下:

server:
port: 7070 # 端口

spring:
application:
name: product-service # 应用名称
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 进行配置管理,设置为 false 即可
server-addr: 127.0.0.1:8848 # Nacos Server 地址
group: MALL_GROUP # 组,默认为 DEFAULT_GROUP
file-extension: yaml # 配置内容的数据格式,默认为 properties
namespace: 450a3f07-08ee-49f6-8213-9b04b06cd3cc # 对应 dev 环境
# 共享配置集
shared-dataids: ext-config-common01.yaml,ext-config-common02.yaml,ext-config-common03.yaml # 多个配置集逗号隔开
refreshable-dataids: ext-config-common01.yaml # 哪个配置集支持动态刷新


访问:http://localhost:7070/extConfig 结果如下:


配置优先级


Spring Cloud Alibaba Nacos Config 提供了三种从 Nacos 拉取配置的功能:

  • A:通过内部相关规则(应用名、配置内容的数据格式等)自动生成相关的 Data Id 配置;
  • B:通过配置 spring.cloud.nacos.config.ext-config[n].data-id
    来支持多个配置集。同时配置多个配置集时,优先级关系根据 n
    的值决定,值越大,优先级越高;
  • C:通过配置 spring.cloud.nacos.config.shared-dataids
    配置多个共享配置集;

当三种方式同时使用时,优先级关系为:A > B > C。


Nacos 集群环境搭建


集群模式跟我们平时进行扩容是一样的,可以通过 Nginx 转发到多个节点,如下图:

如果为了方便省事,可以使用直连 ip 模式,配置中按如下编写即可:

spring:
# 配置 Nacos 配置中心
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 进行配置管理,设置为 false 即可
server-addr: 192.168.10.101:8848,192.168.10.102:8848,192.168.10.103:8848 # Nacos 服务器地址

PS:如果只是为了学习的话直接在本地启动 3 个实例,通过修改端口的方式即可。本文使用三台服务器的方式带大家搭建环境,其实这种方式反而更简单。


环境准备


Nacos 单节点,也就是我们刚才使用的 standalone
模式,默认使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况,0.7 版本以后增加了支持 MySQL 数据源能力。集群搭建的时候我们需要将 Nacos 对接 Mysql 进行数据存储。如果要搭建高可用的集群环境,至少要满足以下条件:

  • JDK 1.8+;
  • Maven 3.2.x+;
  • MySQL 5.6.5+(生产使用建议至少主备模式,或者采用高可用数据库);
  • 3个或3个以上Nacos节点才能构成集群。


下载源码或者安装包


可以通过源码和发行包两种方式来获取 Nacos。


源码方式


从 Github 上下载源码方式。

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin


发行包方式


您可以从 https://github.com/alibaba/nacos/releases 下载最新稳定版本的 nacos-server
包。


配置集群配置文件


将安装包解压。

tar -zxvf nacos-server-1.3.0.tar.gz -C usr/local/ # 解压文件至 local 目录

在 Nacos 的解压目录 nacos/conf
目录下,复制配置文件 cluster.conf.example
并重命名为 cluster.conf
,每行配置成 ip:port
。(请配置3个或3个以上节点)

192.168.10.101:8848
192.168.10.102:8848
192.168.10.103:8848


配置 MySQL 数据库


Nacos 在 0.7
版本之前,默认使用的是嵌入式数据库 Apache Derby
来存储数据(内嵌的数据库会随着 Nacos 一起启动,无需额外安装);0.7
版本及以后,增加了对 MySQL
数据源的支持。


MySQL数据源


环境要求:MySQL 5.6.5+(生产使用建议至少主备模式,或者采用高可用数据库);


初始化 MySQL 数据库


创建数据库 nacos_config

SQL源文件地址:https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql ,或者在 nacos-server
解压目录 conf
下,找到 nacos-mysql.sql
文件,运行该文件,结果如下:


application.properties 配置


修改 nacos/conf/application.properties
文件的以下内容。

最终修改结果如下:

#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
# 指定数据源为 MySQL
spring.datasource.platform=mysql

### Count of DB:
# 数据库实例数量
db.num=1

# 数据库连接信息,如果是 MySQL 8.0+ 版本需要添加 serverTimezone=Asia/Shanghai
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai
db.user=root
db.password=1234

如果你和我一样使用的是 MySQL 8.0+ 版本,那么启动 Nacos 时肯定会报错。莫慌,在 Nacos 安装目录下新建 plugins/mysql
文件夹,并放入 8.0+ 版本的 mysql-connector-java-8.0.xx.jar,重启 Nacos 即可,启动时会提示更换了 MySQL 的 driver-class 类。


启动服务器


Linux/Unix/Mac


在 Nacos 的解压目录 nacos/bin
目录下启动。

启动命令(在没有参数模式,是集群模式):

sh startup.sh


查看启动记录


可通过 /nacos/logs/nacos.log
(详细日志)或 /nacos/conf/start.out
(启动记录)的输出内容查看是否启动成功。

查看命令:

tail -f usr/local/nacos/logs/start.out

启动成功输出结果:

2020-04-29 22:47:56,204 INFO Nacos is starting...

2020-04-29 22:47:56,556 INFO Nacos logs files: usr/local/nacos/logs/

2020-04-29 22:47:56,556 INFO Nacos conf files: usr/local/nacos/conf/

2020-04-29 22:47:56,556 INFO Nacos data files: usr/local/nacos/data/

2020-04-29 22:47:56,556 INFO Nacos started successfully in cluster mode.


访问


访问以下链接,默认用户名/密码是 nacos/nacos :

  • http://192.168.10.101:8848/nacos/
  • http://192.168.10.102:8848/nacos/
  • http://192.168.10.103:8848/nacos/


从下图可以看到集群节点共有三个,其中 192.168.10.101:8848
leader


关闭服务器


Linux/Unix/Mac


sh shutdown.sh


测试


直连 ip 模式


发布配置


选择 配置管理
配置列表
页面,点击最右侧 +
按钮新建配置。

Data ID: product-service.yaml
Group: DEFAULT_GROUP
Configuration format: YAML
Configuration content: project.name: SpringCloudAlibaba
project.org: Aliababa


获取配置


bootstrap.yml

server:
port: 7070 # 端口

spring:
application:
name: product-service # 应用名称
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 进行配置管理,设置为 false 即可
server-addr: 192.168.10.101:8848,192.168.10.102:8848,192.168.10.103:8848 # Nacos 服务器地址,集群版直连 ip 模式
group: DEFAULT_GROUP # 组,默认为 DEFAULT_GROUP
file-extension: yaml # 配置内容的数据格式,默认为 properties


使用之前的控制层代码,访问:http://localhost:7070/config 结果如下:


Nginx 转发


再启动一台服务器 192.168.10.100
,安装 Nginx,配置代理转发规则。

upstream nacos {
server 192.168.10.101:8848;
server 192.168.10.102:8848;
server 192.168.10.103:8848;
}


获取配置


bootstrap.yml

server:
port: 7070 # 端口

spring:
application:
name: product-service # 应用名称
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 进行配置管理,设置为 false 即可
server-addr: 192.168.10.100:80 # Nacos 服务器地址,集群版 Nginx 转发
group: DEFAULT_GROUP # 组,默认为 DEFAULT_GROUP
file-extension: yaml # 配置内容的数据格式,默认为 properties


使用之前的控制层代码,访问:http://localhost:7070/config 结果如下:

至此 Nacos 配置中心所有的知识点就讲解结束了。


微信扫描二维码(长按识别)  关注我的公众号



文章转载自哈喽沃德先生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论