配置管理
1.什么是配置中心?
1.1什么是配置
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着用用的生命周期。比如:数据库连接参数,启动参数等
配置主要有一下几个特点:
1.配置是独立于程序的只读变量
配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置
2.配置伴随应用的整个生命周期
配置贯穿于应用的整个生命周期,应用在启动时读取配置来初始化,在运行时根据配置调整行为。比如:启动时需要读取服务的端口号,系统在运行中需要读取定时策略执行定时任务等。
3.配置可以有多种加载方式
常见的有程序内部hard code,配置文件,环境变量,启动参数,基于数据库等
4.配置需要治理
同一份程序在不同的环境(开发、测试、生产),不通的集群(如不同的数据中心)经常需要不同的配置所以需要有完善的环境,集群配置管理。
1.2什么是配置中心
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余。如下图:
下图显示了配置中心的功能,配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置
配置中心的服务流程如下:
不同部署环境下,应用配置的隔离性
2.Nacos简介
2.1主流配置中心对比
目前市场上用的比较多的配置中心有:Spring Cloud Config. Apollo. Nacos和Disconf等。
由于Disconf不再维护 ,下面主要对比一下Spring Cloud Config、Apollo和Nacos.
从配置中心角度来看,性能方面Nacos的读写性能最高, Apollo次之, Spring Cloud Config依赖Git场景不适
合开放的大规模自动化运维API。功能方面Apollo最为完善, nacos具有Apollo大部分配置管理功能,而Spring
Cloud Config不带运维管理界面,需要自行开发。Nacos的一大优势是整合了注册中心、配置中心功能,部署和操
作相比Apollo都要直观简单,因此它简化了架构复杂度,并减轻运维及部署工作。
综合来看, Nacos的特点和优势还是比较明显的
2.2.Nacos简介
Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。
官方介绍是这样的:
Nacos致力于帮助您发现、配置和管理微服务。Nacos 提供了-组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。
Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务"为中心的现代应用架构的服务基础设施。
2.3 Nacos特性
Nacos主要提供以下四大功能:
1.服务发现与服务健康检查
Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务, Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。
2.动态配置管理
动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除 了在更新配置时重新
部署应用程序,这使配置的更改更加高效和灵活。
3.动态DNS服务
Nacos提供基于DNS协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos,上的服务以域名的方式暴露端点,让三方应用方便的查阅及发现。
4.服务和元数据管理
Nacos能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。
这里动态配置管埋的特性说明了Naocs的配置管埋能力。
3.Nacos快速入门
3.1安装Nacos Server
3.1.1预备环境准备
Nacos依赖lava环境来运行。如果您是从代码开始构建并运行Nacos ,还需要为此配置Maven环境,请确保是在
以下版本环境中安装使用:
- 64 bit OS ,支持Linux/Unix/Mac/Windows ,推荐选用Linux/Unix/Mac.
- 64 bitJDK1.8+ ;下载&配置。
- Maven3.2.x+ ;下载&配置。
3.1.2下载源码或者安装包
可以通过源码和发行包两种方式来获取Nacos.从Github上下载源码方式
git clone https://github . com/alibaba/nacos .git
cd nacos/
mvn -Prelease-nacos 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包,本教程使用nacos-server-1.1.3版本。
下载地址: https://github.com/alibaba/nacos/releases
下载后解压:
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启动方式:
启动命令:
cmd startup. cmd
或者双击startup.cmd运行文件。
启动成功,可通过浏览器访问http://127.0.0.1:8848/nacos ,打开如下nacos控制台登录页面:
默认用户名:nacos
默认用户密码:nacos
3.1.4 OPEN API配置管理测试
启动nacos成功后,可通过nacos提供的http api验证nacos服务运行是否正常。
下边我们通过curl工具来测试nacos的open api :
curl是开发中常用的命令行工具,可以用作HTTP协议测试。
本教程下载curl的windows版本: cur-7.66.0 2-win64-mingw,下载地址: htps://curl.haxx.se/windows/
下载完成进入curl-7.66.0 2-win64-mingw的bin目录,进行下边的测试,通过测试可判断nacos是否正常工作:
发布配置
curl -x POST "http://127.0.0.1:8848/nacos/v1/cs/configs?
dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
上边的命令表示向nacos发布一个配置:
可点击详情,看到配置的详细信息
获取配置
向nacos发布配置成功,就可以通过客户端从nacos获取配置信息,执行下边的命令:
curl -X GET "http://127.0.0.1: 8848/nacos/v1/cs/configs ?dataId=nacos . cfg. dataId&group=test"
3.2 Nacos配置入门
3.3.1发布配置
首先在nacos发布配置。
浏览器访问http://127.0.0.1:8848/nacos ,打开nacos控制台,并点击菜单配置管理->配置列表:
在Nacos添加如下的配置:
新建配置
Data ID: nacos-simple-demo.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容:
common:
config1: something
点击发布即可。
发布成功提示
返回配置列表页面可看到新建的配置
通过java程序,获取配置(Nacos提供了API,远程获取配置)
4 Nacos配置管理基础应用
4.1 Nacos配置管理模型
对于Nacos配置管理,通过Namespace(命名空间)、group、 Data ID能够定位到一个配置集。
此处的 service 是指的nacos服务发现功能
配置集(Data ID)
在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的ID即Data ID。
配置项
配置集中包含的一个个配置内容就是配置项。它代表一个具体的可配置的参数 与其值域,通常以key=value
的形式存在。例如我们常配置系统的日志输出级别( logLevel=INFO | WARN lERROR )就是一个配置项。
配置分组(Group)
配置分组是对配置集进行分组,通过一个有意义的字符串(如Buy或Trade )来表示,不同的配置分组下可以有相同的配置集( DataID )。
当您在Nacos.上创建一个配置时 ,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP。
配置分组的常见场景: 可用于区分不同的项目或应用,例如:学生管理系统的配置集可以定义一个group为: STUDENT_GROUP。
命名空间(Namespace)
命名空间( namespace )可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境。
因为它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group)或配置集。
最佳实践
Nacos抽象定义了Namespace、Group、 Data ID的概念,具体这几个概念代表什么,取决于我们把它们看成什么,这里推荐给大家一种用法,如下图:
Namespace: 代表不同环境,如开发、测试、生产环境。
Group: 代表某项目,如XX医疗项目、XX电商项目
Data ld: 每个项目下往往有若干个工程,每个配置集(Datald)是一个工程的主配置文件
获取某配置集的代码:
获取配置集需要指定:
1、nacos服务地址,必须指定
2、namespace ,如不指定默认public
3、group ,如不指定默认DEFAULT_ GROUP
4、datald ,必须指定
代码如下: 看懂即可不用运行。
//初始化配置服务,
String serverAddr = "127.0.0.1:8848";
String namespace = "ee247dde-d838- 425c-b371-029dab26232f"; //开发环境
//默认组
String dataId = "nacos-simple-demo.yaml";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
properties.put("namespace", namespace);
ConfigService configService = NacosFactory. createConfigService(properties);
//获取配置,并输出控制台
String content = configService.getConfig(dataId,group,5000);
System.out.println( content);
以上代码说明将从地址为127.0.0.1:8848的nacos配置中心获取配置,通过以下信息定位配置集:
namespace: ee247dde-d838-425c-b371-029dab26232f
4.2命名空间管理
4.2.1namespace隔离设计
namespace的设计是nacos基于做多环境以及多租户(多个用户共同使用nacos )数据(配置和服务)隔离的。
●从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的namespce ,以此来实现多环境的隔离。
例如,你可能有开发,测试和生产三个不同的环境,那么使用一套nacos集群可以分别建以下三个不同的namespace。
不同的环境,内容是互不影响的
如下图所示:
![单个用户使用nacos client,可通过不同的namespace来做不同环境下的配置/服务数据隔离
●从多个租户(用户)的角度来看,每个租户(用户可能会有自己的namespace,每个租户(用户)的配置数据以及注册的服务数据都会归属到自己的namespace下,以此来实现多租户间的数据隔离。
例如超级管理员分配了三个租户,分别为张三、李四和王五。分配好了之后,各租户用自己的账户名和密码登录后,创建自己的命名空间。如下图所示:
4.2.2命名空间管理
前面已经介绍过,命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产) , 酶个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace.
创建命名空间
命名空间----> 右上角新建命名空间选项---->输入命名空间名---->描述---->点击确定选项即可。
此处创建了三个命名空间:分别为开发环境、测试环境、生产环境
建立好所有namespace后,在配置管理与服务管理模块下所有页面,都会包含用于切换namespace(环境)的tab按钮,如下图:
可以通过切换不同命名空间查看到空间内存在的配置
注意:每个空间的配置是相互隔离的。
publicj介绍
如果您在编写程序获取配置集过程中没有感知到这个参数的输入,那么nacos统-会使用一个 默认的namespace作为输入, nacos config会使用一个空字符串作为默认的参数来初始化,对应界面上就是public命名空间。
Note: namesace为★★public★★是nacos的一个保留空间,如果您需要创建自己的namespace ,不要和public重名,以一个实际业务场景有具体语义的名字来命名,以免带来字面上不容易区分自己是哪一个namespace。
Note :在编写程序获取配置集时,指定的namespace参数-定要填写命名空间ID ,而不是名称
基于不同命名空间直接新建配置
4.2配置管理
Nacos支持基于Namespace和Group的配置分组管理,以便用户更灵活的根据自己的需要按照环境或者应用、模块等分组管理微服务的大量配置,在配置管理中主要提供了配置历史版本、回滚、订阅者查询等核心管理能力。
4.2.1配置列表及使用
点击Nacos控制台的配置管理->配置列表菜单,即可看到以下界面展示:
可对每个配置文件做相关操作:
详情 | 示例代码 | 编辑 | 删除 | 历史版本 | 监听查询 | 导出选中的配置 | 克隆
详情
查看配置的详细信息
示例代码
编辑
可直接编辑配置内容,发布更新即可
删除
历史版本
每对配置做修改/删除 都会将上一次的配置保存到历史记录里面,无论是对配置文件做过修改或删除都 可基于某个时间点进行回滚操作。
通过Data ID 和Group查找相应的历史版本
监听查询
Nacos提供配置订阅者即监听者查询能力,同时提供客户端当前配置的MD5校验值,以便帮助用户更好的检
查配置变更是否推送到Client端。
查询的方式
基于配置的Data ID 和Group 查询
基于IP 查询
导出配置
将配置以压缩包的方式,下载到本地
导入配置
将打包的配置压缩包,将配置上传
克隆配置功能
在不同命名空间中,可将拥有的配置可控到不同命名空间中。
此处选择克隆到哪个命名空间中
通过以下代码:
public class SimpleDemoMainL istener {
public static void main(String[] args) throws NacosException {
//nacos地址
String serverAddr = "127.0.0.1:8848";
//Data Id
String dataId = "nacos-simple-demo.yaml";
//Group
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties . put("serverAddr",serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
//获取配置,String dataId, String group, long timeoutMs
String content = configService. getConfig(dataId, group, 5000);
System.out.println(content);
//添加监听String dataId, String group, Listener listener
configService.addL istener(dataId, group, new Listener() {
public Execufor getExecutor() {
return null;
}
public void receiveConfigInfo(Strings) {
//当配置发生变化时的响应
4.3登录管理
默认密码为:nacos
修改登录密码,页面右上角nacos图标--->修改密码
输入原密码 +新密码即可修改
5. Nacos配置管理应用于F分布式系统
5.1从单体架构到微服务
5.1.1单体架构
Web应用程序发展的早期,大部分web.工程师将所有的功能模块打包到一起并放在一个web容器中运行,所有功能模块使用同一个数据库,同时,它还提供API或者Ul访问的web模块等。
尽管也是模块化逻辑,但是最终它还是会打包并部署为单体式应用,这种将所有功能都部署在一个web容器中运行的系统就叫做单体架构(也叫:巨石型应用)。
单体架构有很多好处:
开发效率高:模块之间交互采用本地方法调用,并节省微服务之间的交互讨论时间与开发成本。
容易测试: IDE都是为开发单个应用设计的、容易测试--在本地就可以启动完整的系统。
容易部署:运维成本小,直接打包为一个完整的包,拷贝到web容器的某个目录下即可运行。
但是,上述的好处是有条件的,它适用于小型简单应用,对于大规模的复杂应用,就会展现出来以下的 不足:
复杂性逐渐变高,可维护性逐渐变差: 所有业务模块部署在一起,复杂度越来越高,修改时牵一发动全身。
版本迭代速度逐渐变慢:修改- -个地方就要将整个应用全部编译、部署、启动时间过长、回归测试周期过
长。
无法按需伸缩:通过冗余部署完整应用的方式来实现水平扩展,无法针对某业务按需伸缩。
5.1.2微服务
许多大型公司,通过采用微服务架构解决了上述问题。其思路不是开发一个巨大的单体式的应用,而是将应用分解为小的、互相连接的微服务。
一个微服务-般完成某 个特定的功能,比如订单服务、用户服务等等。每一个微服务都是完整应用,都有自己的业务逻辑和数据库。一些微 服务还会发布API给其它微服务和应用客户端使用。
比如,根据前面描述系统可能的分解如下:
每一个业务模块都使用独立的服务完成,这种微服务架构模式也影响了应用和数据库之间的关系,不像传统多个业务模块共享一个数据库,微服务架构每个服务都有自己的数据库。
微服务架构的好处.
●分而治之,职责单一; 易于开发、理解和维护、方便团队的拆分和管理
●可伸缩;能够单独的对指定的服务进行伸缩
●局部容易修改,容易替换,容易部署,有利于持续集成和快速迭代
●不会受限于任何技术栈
5.2分布式应用配置管理
下图展示了如何通过Nacos集中管理多个服务的配置:
●用户通过Nacos Server的控制台集中对多个服务的配置进行管理。
●各服务统- -从Nacos Server中获取各自的配置,并监听配置的变化。
服务流量权重支持及流量保护
Nacos 为用户提供了流量权重控制的能力,同时开放了服务流量的阈值保护,以帮助用户更好的保护服务服务提供者集群不被意外打垮。如下图所以,可以点击实例的编辑按钮,修改实例的权重。如果想增加实例的流量,可以将权重调大,如果不想实例接收流量,则可以将权重设为0。
服务元数据管理
Nacos提供多个维度的服务元数据的暴露,帮助用户存储自定义的信息。这些信息都是以K-V的数据结构存储,在控制台上,会以k1=v1,k2=v2这样的格式展示。类似的,编辑元数据可以通过相同的格式进行。例如服务的元数据编辑,首先点击服务详情页右上角的“编辑服务”按钮,然后在元数据输入框输入:version=1.0,env=prod。
服务优雅上下线
Nacos还提供服务实例的上下线操作,在服务详情页面,可以点击实例的“上线”或者“下线”按钮,被下线的实例,将不会包含在健康的实例列表里。
监听者查询
Nacos提供配置订阅者即监听者查询能力,同时提供客户端当前配置的MD5校验值,以便帮助用户更好的检查配置变更是否推送到 Client 端。
修改默认用户名/密码方法
生成加密密码, 在com.alibaba.nacos.console.utils.PasswordEncoderUtil.main函数中,将 nacos 改成你要改成的密码,运行即可得到加密有算法。注意盐值是随机的,所以生成密码每次可能不一样,请不要担心。
public class PasswordEncoderUtil {
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("nacos"));
}
}
创建用户名或者密码的时候,用指定用户名密码即可。
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
关闭登录功能
由于部分公司自己开发控制台,不希望被nacos的安全filter拦截。因此nacos支持定制关闭登录功能找到配置文件 ${nacoshome}/conf/application.properties, 替换以下内容即可。
## spring security config
### turn off security
spring.security.enabled=false
management.security=false
security.basic.enabled=false
nacos.security.ignore.urls=/**
#nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**
会话时间
默认会话保持时间为30分钟。30分钟后需要重新登录认证。 暂时不支持修改该默认时间。
配置实例权重
可以通过手动配置权重来控制流量,当一个集群内两个实例,权重越高,到达该实例的请求比例越多。
配置保护阈值
保护阈值的范围是0~1
服务的健康比例 = 服务的健康实例/总实例个数
当服务健康比例 <= 保护阈值时候,无论实例健不健康都会返回给调用方
当服务健康比例 > 保护阈值的时候,只会返回健康实例给调用方服务管理-服务列表选择一个服务点击详情可以配置