本文摘自B站黑马程序员视频课件,如有侵权,请联系删除。
Nacos
- 1.什么是配置中心
-
- 1.1 什么是配置
- 1.2 什么是配置中心
- 2. Nacos简介
-
- 2.1 简单介绍
- 2.2 Nacos特性
- 3. Nacos快速入门
-
- 3.1安装Nacos Server
-
- 3.1.1 预备环境准备
- 3.1.2下载源码或安装包
- 3.1.3 启动服务器
- 3.1.4 OPEN API配置管理测试
- 3.1.5 关闭服务器
- 3.1.6 外部mysql数据库支持
- 3.2Nacos配置入门
-
- 3.2.1发布配置
- 3.2.2 Nacos客户端获取配置
- 4.Nacos配置管理基础应用
-
- 4.1Nacos配置管理模型
- 4.2命名空间管理
-
- 4.2.1namespace隔离设计
- 4.2.2命名空间管理
- 4.2.2 命名空间管理
- 4.3配置管理
- 5.Nacos配置管理应用于分布式系统
-
- 5.1从单体架构到微服务
-
- 5.1.1 单体架构
- 5.1.2 微服务
- 5.2 分布式应用配置管理
-
- 5.2.1 发布配置
- 5.2.2创建父工程
- 5.2.3微服务service1配置
- 5.2.4微服务service2配置
- 5.2.5支持配置的动态更新
- 5.2.6自定义namespace与group配置
- 5.2.7自定义扩展的Data Id配置(推荐使用)
- 5.2.8自定义共享的Data Id配置
- 5.2.9配置的优先级
- 5.2.10完全关闭配置
- 5.3Nacos集群配置
-
- 5.3.1集群部署
- 5.3.2客户端配置
- 5.3.3生产环境部署建议
1.什么是配置中心
1.1 什么是配置
应用程序在启动和运行时往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期。比如数据库连接参数,启动参数等。
配置主要有以下几个特点:
- 配置是独立于应用程序的只读变量
- 配置对于程序是只读的,程序通过读取配置来改变自己的行为,但程序不应该去改变配置。
- 配置伴随应用程序的整个生命周期
- 配置贯穿于程序的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。比如:启动时需要读取服务的端口号,系统在运行过程中需要读取定时策略来执行定时任务。
- 配置可以有多种加载方式
- 常见的有内部硬编码、配置文件、环境变量、启动参数、基于数据库等。
- 配置需要治理
- 同一程序在不同的环境(开发、测试、生产)、不同的集群(如不同的数据库)经常需要不同的配置,所以需要有完善的环境、集群配置管理。
1.2 什么是配置中心
在微服务架构中,当一个系统从单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余,如下图:
下图显示了配置中心的功能,配置中心将配置从各应用中剥离出来,对配置进行统一 管理,应用自身不需要自己去管理配置。
2. Nacos简介
Nacos官网:https://nacos.io/
Nacos中文文档:https://nacos.io/zh-cn/docs/what-is-nacos.html
2.1 简单介绍
Nacos是阿里的一个开源项目,它是针对微服务架构中的
服务发现、配置管理、服务治理的综合型解决方案.
官方介绍:
2.2 Nacos特性
Nacos主要提供以下四大功能:
-
服务发现与服务健康检查
Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。
-
动态配置管理
动态配置允许在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新部署应用程序,这样使配置的更改更加高效和灵活。
-
动态DNS服务
Nacos提供基于DNS协议的服务发现能力,旨在支持异构语言的服务发现,支持将在Nacos上的服务以域名的方式暴露端点,让三方应用方便的查阅及发现。
-
服务和元数据管理
Nacos能让您从微服务平台建设的视角管理数据中心的所有服务和元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。
3. Nacos快速入门
3.1安装Nacos Server
3.1.1 预备环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;下载 & 配置。
- Maven 3.2.x+;下载 & 配置。
3.1.2下载源码或安装包
你可以通过源码和发行包两种方式来获取 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
下载编译后压缩包方式
您可以从 最新稳定版本 下载
nacos-server-$version.zip
包。
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
3.1.3 启动服务器
Nacos默认端口是8848,需要保证8848端口没有被其他端口占用
进入安装程序的bin目录:
Linux/Unix/Mac启动方式
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令(standalone代表着单机模式运行,非集群模式):
cmd startup.cmd -m standalone
3.1.4 OPEN API配置管理测试
启动Nacos成功后,可通过Nacos提供的http api验证Nacos服务运行是否正常
提示:curl可有可无,win+R =》cmd ,也可以
下边我们通过curl工具来测试Nacos的open api
curl是开发中常用的命令行工具,可以用作HTTP协议测试
下载地址:https://curl.se/download.html
下载解压完成后,进入该文件的bin目录,进行下边的测试,通过测试可判断Nacos是否正常工作
访问地址:http:127.0.0.1:8848/nacos
账号密码:均为nacos
发布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
上边的命令表示向Nacos发布一个配置
测试效果
获取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
3.1.5 关闭服务器
直接关闭黑窗口即可
Linux/Unix/Mac
sh shutdown.sh
Windows
cmd shutdown.cmd
或者双击shutdown.cmd运行文件。
3.1.6 外部mysql数据库支持
单机模式时nacos默认使用嵌入式数据库实现数据的存储,若想是使用外部mysql存储nacos数据,需要进行以下步骤:
- 安装数据库,版本要求:5.6.5+,mysql8以下
- 初始化mysql数据库,新建数据库nacos,数据库初始化文件:${nacoshome}/conf/nacos-mysql.sql
- 修改${nacoshome}/conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql)。添加mysql数据源的url、用户名和密码
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user=root db.password=123456
3.2Nacos配置入门
3.2.1发布配置
首先在nacos发布配置
浏览器访问http://127.0.0.1:8848/nacos,打开nacos控制台,并点击菜单配置管理=》配置列表
在nacos添加如下配置:
Data Id:nacos-simple-demo.yaml
Group :DEFAULT_GROUP
配置格式:YAML
配置内容:common:
config1: something
**注意:**dataId是以properties(默认的文件扩展名方式)为扩展名,这里使用yaml
第一步,点击新增配置(在表格右上角,点击 “+” )
最后点击发布,返回配置列表,可以看到刚才发布的配置。
3.2.2 Nacos客户端获取配置
新建一个名为nacos-simple-demo的项目,坐标如下
<groupId>nacos-simple-demo</groupId>
<artifactId>nacos-simple-demo</artifactId>
<version>1.0-SNAPSHOT</version>
添加以下依赖,用于实现项目中使用nacos来实现应用的外部化配置。
pom.xml
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.3</version>
</dependency>
新建类,代码如下所示:
package com.dang.nacos;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;
import java.util.Properties;
public class SimpleDemoMain {
public static void main(String[] args) throws NacosException {
//目的:使用naco-client远程获取nacos上的配置信息
//nacos地址
String serverAddr = "http://127.0.0.1:8848";
//DataId
String dataId = "nacos-simple-demo.yaml";
//Group
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
//serverAddr不能写错
properties.put("serverAddr",serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
//获取配置,String datsId,String grouop,long timeoutMs
String content = configService.getConfig(dataId,group,5000);
System.out.println(content);
}
}
测试结果
4.Nacos配置管理基础应用
4.1Nacos配置管理模型
对于nacos配置管理,通过namespace、group、dataId能定位到一个配置集
配置集(DataId)
在系统中,一个配置文件就是一个配置集,一个配置集可以包含系统的各种配置信息。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项,每个配置集都可以定义一个有意义的名称,就是配置集的ID,即Data Id。
配置项
配置集中包含的一个个配置内容就是配置项。它代表一个具体的可配置的参数与其值域,通常以key=value的形式存在。例如我们在系统中配置的日志输出级别(logLevel=INFO|WARN|ERROR)就是一个配置项。
配置分组(Group)
配置分组就是对配置集进行分组,通过一个有意义的字符串(如Buy或Trade)来表示,不同的配置分组可以有相同的配置集(Data Id)。当您在Nacos上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP。配置分组的常见场景:可用于区分不同的项目或应用,例如,学生管理系统的配置集可以定义为一个Group为:STUDENT_GROUP。
命名空间(Namespace)
命名空间(namespace)可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同的配置分组(Group)或配置集。
最佳实践
Nacos抽象定义了namespace、group、dataId的概念,具体这几个概念代表什么,取决于我们把它们看成什么,这里推荐给大家一种用法,如下图:
Namespace:代表不同环境。如开发、测试和生产
Group:代表某项目。XXX医疗项目,XXX电商项目
DataId:每个项目下往往有多个工程,每个配置集(DataId)是一个工程的主配置文件。
4.2命名空间管理
4.2.1namespace隔离设计
获取某配置集的代码:
获取配置集需要指定:
- nacos服务地址,必须指定
- namespace,如不指定则默认public
- group:如不指定则默认DEFAULT_GROUP
- dataId:必须指定
代码如下:
看懂即可,不用运行
//初始化配置服务
String serverAddr = "127.0.0.1:8848";
String namespace = "ee247dde-d838-425c-b371-029dab26232f";//开发环境
String group = "DEFAULT_GROUP"; //默认分组
String dataId = "nacos-simple-demo.yaml";
Properties peoperties = new Properties();
properties.put("serverAddr",ServerAddr);
peoperties.put("namespace")
ConfigService configService = NacosFactory.createConfigService(properties);
//获取配置,String datsId,String grouop,long timeoutMs
String content = configService.getConfig(dataId,group,5000);
System.out.println(content);
以上代码说明将从地址为127.0.0.1:8848的nacos配置中心获取配置,通过以下信息定位配置集
namespace:ee247dde-d838-425c-b371-029dab26232f
注意:namespace需要指定id
group:DEFAULT_GROUP
dataId:nacos-simple-demo.yaml
4.2.2命名空间管理
namespace的设计是nacos基于此做多环境以及多租户(多个用户共同使用nacos)数据**(配置和服务)**隔离的。
- 从一个租户的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的namespace,以此来实现多环境的隔离。例如,你可能有开发、测试和生产三个不同的环境,那么使用一套nacos集群可以分别创建以下三个不同的namespace。如下图所示。
单个用户使用nacos client,可通过不同的namespace来做不同环境下的配置/服务 数据隔离
- 从多个租户(用户)的角度来看,每个租户可能会有自己的namespace,每个租户的配置数据以及注册的服务数据都会归属到自己的namespace,以此来实现多租户间的数据隔离。例如超级管理员分配了三个租户,分别是张三、李四和王五,分配好了以后,哥租户用自己的账号名和密码登录后,创建自己的命名空间,如下图所示:
4.2.2 命名空间管理
前面已经介绍过,命名空间是用于隔离多个环境的(如开发、测试、生产),而没个应用在不同环境下的同一个配置(如数据库数据源)的值是不一样的。因此,我们应该针对企业项目实际研发流程、环境及进行规划。如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对着三个环境分别建立三个namespace。
在命名空间菜单中,表格右上角的”新建命名空间“即可创建新的命名空间。命名空间名和描述必填。然后切换到配置管理=》配置列表,左上角可以切换命名空间。
4.3配置管理
略,操作比较简单,就是对菜单功能的联练习。
5.Nacos配置管理应用于分布式系统
5.1从单体架构到微服务
5.1.1 单体架构
Web应用发展的早期,大部分web工程师将所有的功能模块打包并放在t一个web容器中运行,所有功能模块使用同一个数据库,同时,它还提供API或者UI访问的web模块等。
尽管也是模块化逻辑,但是它最终还是会打包并部署为单体式应用,这种将所有功能都部署在一个web容器中运行的系统就叫做单体架构(也叫:巨石型应用)。
单体架构有很多好处:
开发效率高:模块之间采用本地方法调用,并节省微服务之间的交互讨论时间与开发成本。
容易测试:IDE都是为开发单体应用设计的、容易测试,在本地就可以启动完整的系统。
容易部署:运维成本小,直接打包为一个完整的包,拷贝到web容器的某个目录即可运行。
但是,上述的好处是有条件的,它适用于小型简单应用,对于大规模的复杂应用,就会展现以下的不足:
复杂性逐渐变高,可维护性逐渐变差:所有的业务模块部署在一块,复杂度越来越高,修改时牵一发动全身
版本迭代速度逐渐变慢:修改一个地方就需要将整个应用全部编译、部署、启动时间长、回归测试周期长
阻碍技术创新:若更新技术框架,除非你愿意将系统全部重写,无法实现部分技术更新。
无法按需伸展:通过冗余部署完整应用的方式来实现水平扩展,无法针对某业务按需伸展。
5.1.2 微服务
许多大型公司,通过采用微服务架构解决了上述问题。其思路不是开发一个巨大的单体式的应用,而是将应用拆分成小的、互相连接的微服务。
一个微服务一般完成某个特定的功能,比如订单服务、用户服务等。每一个微服务都是一个完整应用,都有自己的逻辑和数据库,一些微服务还会发布API给其他微服务和应用客户端使用。
比如,根据前面描述系统可能的分解如下:
每一个业务模块都使用独立的服务完成,这种架构模式也影响了应用和数据库之间的关系,不像传统多个业务模块共享一个数据库,微服务架构每个服务都有自己的数据库。
微服务架构的好处:
- 分而治之,职责单一,易于开发、理解和维护、方便团队的拆分和管理
- 可伸缩,能够单独对指定的服务进行伸缩
- 局部容易修改,容易替代、部署,有利于持续集成和快速迭代
- 不会受限于任何技术栈
5.2 分布式应用配置管理
下图展示了如何通过Nacos集中管理多个服务的配置
- 用户通过Nacos Server的控制台集中对多个服务的配置进行管理。
- 各服务统一从Nacos Server中获取各自的配置,并监听配置的变化。
5.2.1 发布配置
首先在Nacos发布配置,我们规划了两个服务service1,service2,并且想要对这两个服务的配置进行集中维护。
浏览器访问:http://127.0.0.1:8848/nacos,打开nacos控制台,并点击菜单配置管理=》配置列表
在Nacos下添加如下的配置
service1
Namespace:bb65aeb9-ff16-4ad4-a65c-545767dfcd29 #dev环境,每个人的namespace不一定相同
Data ID :service1.yaml
Group :TEST_GROUP
配置格式 :YAML
配置内容 :common:
name: sevice1 config
新建配置,见3.2.1发布配置
service2
Namespace:bb65aeb9-ff16-4ad4-a65c-545767dfcd29 #dev环境,每个人的namespace不一定相同
Data ID :service2.yaml
Group :TEST_GROUP
配置格式 :YAML
配置内容 :common:
name: sevice2 config
新建配置,见3.2.1发布配置
5.2.2创建父工程
为了规范依赖的版本,这里创建父工程,指定依赖的版本
父工程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>com.dang</groupId>
<artifactId>com.dang</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>service1</module>
<module>service2</module>
</modules>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
5.2.3微服务service1配置
本小节,我们将演示如何使用Spring Cloud Alibaba Nacos Config在Spring Cloud应用中集成Nacos,通过 Spring Cloud原生方式快捷的获取配置内容。
Spring Cloud是什么
Spring Cloud是一系列框架的有序集合,它利用Spring Boot的开发白理性巧妙地简化了分布式系统基础设施的开发,如服务注册发现、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,集成最多的组件要属NetFlix公司,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留下了一套简单易懂‘易部署和维护的分布式系统开发工具包。
Spring Cloud Alibaba Nacos Config是什么:
Spirng Cloud Alibaba Nacos Discovery是Spring Cloud Alibaba的子项目,而Spring Cloud是阿里巴巴公司提供的开源的基于Spring Cloud的微服务套件合集,它致力于提供违反服务开发的一站式解决方案,可以理解为Spring Cloud是一套微服务开发的标准,Spring Cloud Alibaba与Spring Cloud Netflix是实现/使用Spring Cloud Alibaba的方案,开发者只需要添加一些注解和少量配置,就可以将Spring Cloud应用接入阿里分布式 应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。
由于Nacos是阿里的中间件。因此 ,若开发Spring Cloud微服务应用,使用Spring Cloud Alibaba Nacos Config来集成Nacos的配置管理功能是比较明智的选择。
(1)新建项目service1
首先新增一个名为service1工程,并添加group ID为com.alibaba.cloud和artifact ID为spring-cloud-starter-alibaba-nacos-config的starter。
<?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>com.dang</artifactId>
<groupId>com.dang</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service1</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
(2)bootstrap.yml配置
server:
port: 56010
spring:
application:
name: service1
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #配置中心地址
file-extension: yaml #dataid的名称就是application的name加上fiel-extension =》service1.yaml
namespace: bb65aeb9-ff16-4ad4-a65c-545767dfcd29 #开发环境
group: TEST_GROUP #测试组
以上配置文件说明该应用将从地址为127.0.0.1:8848配置中心获取配置,通过以下信息定位配置集
namespace: bb65aeb9-ff16-4ad4-a65c-545767dfcd29 #开发环境
group: TEST_GROUP #测试组
Data Id: service1.yaml
Note:spring-cloud-starter-alibaba-nacos-config在加载配置的时候,记载了以data id为 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{file-extension:properties}的基础配置。对应以上的配置,它会去nacos server中加载data id为service1/yaml的配置集。
Note:若没有指定spring.cloud.nacos.config.group配置,则默认俄日DEFAULT_GROUP。
(3)启动配置客户端
新增Spring Boot启动类,并增加获取的web访问端点/service1,通过标准的spring @Value方式。
package com.dang;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author dangxj
*/
@SpringBootApplication
@RestController
public class Service1Bootstrap {
public static void main(String[] args) {
SpringApplication.run(Service1Bootstrap.class,args);
}
@Value("${common.name}")
private String service1;
@GetMapping("/service1")
public String getConfig1(){
return service1;
}
}
5.2.4微服务service2配置
service2的创建流程与service1一致:
**注意:**spring boot启动端口要避免重复,spring.application.name为sevice2.
server:
port: 56020
spring:
application:
name: service2
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #配置中心地址
file-extension: yaml #dataid的名称就是application的name加上fiel-extension =》service2.yaml
namespace: bb65aeb9-ff16-4ad4-a65c-545767dfcd29 #开发环境
group: TEST_GROUP #测试组
5.2.5支持配置的动态更新
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping("/service1")
public String getConfig1(){
String content = applicationContext.getEnvironment().getProperty("common.name");
System.out.println(content);
return content;
}
我们通过nacos控制台更新common.name的配置值,再次访问webweb端点/service1,发现应用程序能够获取到最新的配置值,说明spring-cloud-starter-alibaba-nacos-config支持配置的动态更新。
Note:可以通过配置 spring.cloud.nacos.config.refresh.enabled=false来关闭动态刷新
5.2.6自定义namespace与group配置
支持自定义的namespace的配置
在没有明确指定${spring.cloud.nacos.config.group}配置的情况下,默认使用的是DEFAULT_GROUP。如果需要自定义自己的Group,可以通过以下的配置来实现:
spring:
cloud:
nacos:
config:
namespace: b3404bc0-d7dc-4855-b519-570ed34b62d7
Note:该配置必须放在bootstrap.yml文件中。此外spring.clcoud.nacos.config.namespace的值是namespace对应的id,id值可以在NAcos的控制台获取。并且在添加配置是注意不要选择其他的namespace。否则会导致读取不到正确的配置。
支持自定义Group的配置
在没有明确指定${spring.cloud.nacos.config.group}配置的情况下,默认使用的是DEFAULT_GROUP。如果需要自定义租户的Group,可以通过以下配置来实现:
spring:
cloud:
nacos:
config:
group: DEVELOP_GROUP
Note:该配置必须放在bootstrap.properties文件中。并且在添加配置时Group的值一定要和spring.cloud.nacos.config.group的配置值一致。
5.2.7自定义扩展的Data Id配置(推荐使用)
Spring Cloud Alibaba Nacos Config可支持自定义Data Id的配置。一个完整的配置案例如下所示:
下边我们在service2微服务下配置扩展。
spring:
applicaiton:
name: service2
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
# config external configuration
# 1. Data Id在默认的组DEFAULT_GROUP,不支持配置的动态刷新
ext-config[0]:
data-id: ext-config-common01.properties
#2.Data id不在默认的组,不支持动态刷新
ext-config[1]:
data-id: ext-config-common02.properties
group: GLOBALE_GROUP
#3.Data Id既不在默认的组,也支持动态刷新
ext-config[2]:
data-id: ext-config-common03.properties
group: REFRESH_GROUP
refresh: true
可以看到
- 通过spring.cloud.nacos.config.ext-config[n].data-id的配置方式来支持多个Data Id的配置。
- 通过spring.cloud.nacos.config.ext-config[n].group的配置方式自定义Data Id所在的组,不明确配置的话,默认是DEFALUT_GROUP。
- 通过spring.cloud.nacos.config.config[n].refresh的配置方式来控制该Data Id在配置变更时,是否支持应用中可动态刷新 ,感知到最新的配置值,默认是不支持的,
Note:spring.cloud.nacos.config.ext-config[n].data-id的值必须带文件扩展名,文件扩展名既可支持properties,又可支持yaml/yml。此刻spring.cloud.nacos.file-extension的配置对自定义扩展配置的Data Id文件扩展名没有影响。
通过自定义扩展的Data Id配置,既可以解决多个应用配置共享的问题,又可以支持一个应用有多个配置文件。
测试:
配置ext-config-common01.properties:
配置:
配置ext-config-common03.properties:
编写测试代码:
@GetMapping("/configs2")
public String getConfigs2(){
String name = applicationContext.getEnvironment().getProperty("common.name");
String age = applicationContext.getEnvironment().getProperty("common.age");
String address = applicationContext.getEnvironment().getProperty("common.address");
String birthday = applicationContext.getEnvironment().getProperty("common.birthday");
String fullname = applicationContext.getEnvironment().getProperty("common.fullname");
return name+"-"+age+"-"+address+"-"+birthday+"-"+fullname;
}
重启应用,访问http://127.0.0.1:56010/configs2,观察配置是否获取成功
输出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wi7jhWEr-1612405073988)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1612336054953.png)]
5.2.8自定义共享的Data Id配置
为了更加清晰的在多个应用间配置共享的Data Id,你可以通过以下的方式来配置:
spring:
cloud:
nacos:
config:
shared-dataids: ext-config-common01.properties,ext-config-common02.properties
refreshable-datails: ext-config-common01.properties
可以看到:
- 通过spring.cloud.nacos.shared-dataids来支持多个共享Data Id的配置,多个之间用逗号隔开。
- 通过spring.cloud.nacos.config.refreshable-datails来支持哪个共享配置的Data Id在配置变化时,应用中是否可动态刷新,感知到最新的配置值,多个Data Id之间用逗号隔开,如果没有明确的配置,默认情况下所有共享配置的Data Id都不支持动态更新。
Note:上属配置信只支持DEFAULT_GROUP,通过spring.cloud.nacos.config.shared-datails来支持多个共享 配置的Data Id时,多个共享配置之间一个优先级的关系我们约定:按照配置出现的先后顺序,即后面的优先级要高于前面。
5.2.9配置的优先级
Spring Cloud Alibaba Nacos Config目前提供了三种配置能力从Nacos拉取相关的配置。
- A:通过spring.cloud.nacos.config.shared-datails支持多个Data Id的配置 。
- B:通过spring.cloud.nacos.config.ext-config[n].data-id的方式支持多个扩展Data Id的配置,多个Data Id同时配置时,他们的优先级关系是spring.cloud,nacos.config.ext-config[n].data-id其中n的值越大 ,优先级越高。
- C:通过内部相关规则(应用名,扩展名)自动生成的Data Id配置
当三种方式共同使用时,他们的一个优先级关系是:C>B>A
测试,屏蔽共享dataId,放开ext-config,如下:
spring:
application:
name: service2
cloud:
nacos:
config:
修改ext-common03.properties:
通过测试发现多个DataId同时配置时,他们的优先级关系是:spring.cloud.nacos.config.ext-config[n].data-id其中n值越大,优先级越高。
5.2.10完全关闭配置
通过设置spring.cloud.nacos.config.enable = false来完全官博Spring Cloud Nacos Config。
5.3Nacos集群配置
5.3.1集群部署
3个或3个以上Nacos节点才构成集群
(1)安装3个以上Nacos
我们可以复制之前已经解压好的nacos文件夹,分别命名为nacos、nacos1、nacos2
(2)配置集群配置文件
在所有nacos目录的conf目录下,有文件cluster.conf.example,将其命名为cluster,并将每行配置成ip:port。(请配置3个或3个以上节点)
# ip:port
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
由于以上是单机演示,需要更改nacos的conf目录下application.properties中的server.port,防止端口冲突。
如果服务器有多个ip也要指定具体的ip地址,如:nacos.inetutils.ip-address=127.0.0.1
例如:
sever.port=8850
nacos.inetutils.ip-address=127.0.0.1
(3)集群模式启动
分别执行nacos目录下的startup:
startup -m cluster
在任意一个nacos的控制台中,可以看到以下内容(这里与课件不符,不知道为啥):
5.3.2客户端配置
所有客户端,分别指定nacos集群中的若干节点:
spring:
application:
name: xxxx
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
测试,使用快速上手的例子:
(1)关掉127.0.0.1:8848 nacos Leader实例 发现Leader被成功选举至127.0.0.1:8850
(2)紧接着重新启动Provider,这时马上请求consumer的/service出现错误,发现consumer与provider通信已经出现问题,但是经过短暂的时间后,通信恢复。
经过测试,我们可以看到,通过以上的集群部署已经达到了高可用的效果。
5.3.3生产环境部署建议
下图是官方推荐的集群方案,通过域名+VIP模式的方式来实现,客户端配置的nacos,当Nacos集群迁移时,客户端配置无需修改。
至于数据库,生产环境下建议至少主备模式,通过修改${nacosname}/conf/application.properties文件,能够使nacos拥有多个数据源。
spring.datasource.platform=mysql
db.num=2
db.url.0=jdbc:mysql//127.0.0.1:3306/nacos?characterEncoding=utf8&autoReconnect=true
db.url.1=jdbc:mysql//127.0.0.1:3306/nacos?characterEncoding=utf8&autoReconnect=true
db.user=root
db.password=123456