Spring Cloud 系列之 Alibaba Nacos 配置中心
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 配置中心所有的知识点就讲解结束了。
本文采用 知识共享「署名-非商业性使用-禁止演绎 4.0 国际」许可协议
。
大家可以通过 分类
查看更多关于 Spring Cloud
的文章。
🤗 您的点赞
和转发
是对我最大的支持。
📢 扫码关注 哈喽沃德先生
「文档 + 视频」每篇文章都配有专门视频讲解,学习更轻松噢 ~
https://mrhelloworld.com