Nacos-配置管理
Nacos有两种功能,一个是配置管理(配置中心),另一个服务发现
官网:https://nacos.io/zh-cn/docs/sdk.html
快速开始:https://nacos.io/zh-cn/docs/quick-start.html
撑握的知识点
1)能够说出配置中心的概念以及使用场景
2)了解主流配置中心
3)理解Nacos的功能特性
4)撑握Nacos的快速入门方法
5)撑握Nacos安装方式
6)理解Nacos配置管理的核心概念及数据模型
7)撑握使用Nacos控制台进行配置管理的操作方法。
8)撑握Nacos分布式系统应用的方法
9)撑握Nacos集群部署方式
1. 什么是配置中心
1.1 什么是配置
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整 个生命周期,比如:数据库连接参数,启动参数等。
配置主要有以下几个特点
-
配置是独立于程序的只读变量
-
配置伴随应用的整个生命周期
-
配置可以有多种加载方式
常见的有程序内部hard code,配置文件,环境变量,启动参数,基于数据库等
-
配置需要治理
同一程序在不同的环境(开发、测试、生产),不同的集群(如不同的数据中心)经常需要有不同的配置,所以需要有完善的环境,集群配置管理。
1.2什么是配置中心
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余 如下图:
下图显示了配置中心的功能,配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
2 Nacos简介
2.1 什到是Nacos
Nacos是阿里开源的一个项目,用于进行微服务架构的配置管理,以及服务发现,包括服务治理等解决方案
目前市面上用的比较多的配置中心有:Spring Cloud Config、Apollo、Nacos和Disconf,由于Disconf不再维护,下面主要对比一下Spring Cloud config、Apollo和Nacos
性能最好的的 nacos
2.2 主流配置中心对比
2.3 Nacos 简介
Nacos是阿里开源的一个项目,用于进行微服务架构的配置管理,以及服务发现,包括服务治理等综合型解决方案
官网地址:https://nacos.io
官方介绍是这样的:
nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务"为中心的现代应用架构的服务基础设施。
2.4 Nacos特性
-
服务发现和服务健康检测
Nacos支持基于DNS和基于RPC的服务发现。服务提供者使用原生SDK、OpenApi、或一个独立的Agent TODO注册Service 后,服务消费者可以使用DNS TODO或HTTP&API 查找和发现服务。
Nacos提供对服务的实时的健康检查,阻止向不健康主机或服务实例发送请求。
Nacos支持传输层(PING或TCP)和应用层(如 HTTP、MySQL、用户自定义)的健康检查。
对于复杂的云环境和网络拓扑环境中服务的健康检查,Nacos提供了agent上报模式和服务端主动检测2种健康检查模式。
Nacos还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
-
动态配置服务
动态配置服务可以让您中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了动态变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
nacos 提供了一个简洁易用的UI帮助您管理所有的服务和应用的配置。
nacos还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您列安全地在生产环境中管理配置变更和降低配置变更带来的风险。
-
动态DNS服务
动态DNS服务支持权重路由,让您更容易地实现中间层负载均衡,更灵活的路由策略。
流量控制以及数据中心内网的简单DNS解析服务。
动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现API的风险。
Nacos 提供了一些简单的DNS APIS TODO 帮助您管理服务的关联域名和可用的IP:PORT列表。
-
服务及元数据管理
Nacos能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的SLA以及最首要的metrics统计数据。
3 Nacos 快速入门
官网:https://nacos.io/zh-cn/docs/sdk.html
快速开始:https://nacos.io/zh-cn/docs/quick-start.html
3.1安装Nacos Server
3.1.1 预备环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
-
64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
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
下载地址:https://github.com/alibaba/nacos/releases
G:\nacos-server-2.0.3\nacos
3.1.3 启动服务器
G:\nacos-server-2.0.3\nacos\bin>startup.cmd -m standalone
"nacos is starting with standalone"
,--.
,--.'|
,--,: : | Nacos 2.0.3
,`--.'`| ' : ,---. Running in stand alone mode, All function modules
| : : | | ' ,'\ .--.--. Port: 8848
: | \ | : ,--.--. ,---. / / | / / ' Pid: 11924
| : ' '; | / \ / \. ; ,. :| : /`./ Console: http://192.168.1.2:8848/nacos/index.html
' ' ;. ;.--. .-. | / / '' | |: :| : ;_
| | | \ | \__\/: . .. ' / ' | .; : \ \ `. https://nacos.io
' : | ; .' ," .--.; |' ; :__| : | `----. \
| | '`--' / / ,. |' | '.'|\ \ / / /`--' /
' : | ; : .' \ : : `----' '--'. /
; |.' | , .-./\ \ / `--'---'
'---' `--`---' `----'
2021-10-24 11:09:52,021 INFO Bean 'org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler@30f4b1a6' of type [org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2021-10-24 11:09:59,251 INFO Bean 'methodSecurityMetadataSource' of type [org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2021-10-24 11:10:00,318 INFO Tomcat initialized with port(s): 8848 (http)
2021-10-24 11:10:00,994 INFO Root WebApplicationContext: initialization completed in 21540 ms
2021-10-24 11:10:12,235 INFO Initializing ExecutorService 'applicationTaskExecutor'
2021-10-24 11:10:12,444 INFO Adding welcome page: class path resource [static/index.html]
2021-10-24 11:10:14,193 INFO Creating filter chain: Ant [pattern='/**'], []
2021-10-24 11:10:14,298 INFO Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@6c6366cf, org.springframework.security.web.context.SecurityContextPersistenceFilter@f679798, org.springframework.security.web.header.HeaderWriterFilter@19650aa6, org.springframework.security.web.csrf.CsrfFilter@12d1f1d4, org.springframework.security.web.authentication.logout.LogoutFilter@44c13103, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@59d77850, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1daf3b44, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@55a88417, org.springframework.security.web.session.SessionManagementFilter@2d82408, org.springframework.security.web.access.ExceptionTranslationFilter@7a389761]
2021-10-24 11:10:14,967 INFO Initializing ExecutorService 'taskScheduler'
2021-10-24 11:10:14,999 INFO Exposing 16 endpoint(s) beneath base path '/actuator'
2021-10-24 11:10:15,263 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'
2021-10-24 11:10:15,270 INFO Nacos started successfully in stand alone mode. use embedded storage
2021-10-24 11:10:25,834 INFO Initializing Servlet 'dispatcherServlet'
2021-10-24 11:10:25,850 INFO Completed initialization in 16 ms
用户名:nacos
密码:nacos
3.1.4 OPEN API 配置管理测试
启动nacos成功后,可通过nacos提供的http api 验证nacos服务运行是否正常。
下边我们通过curl工具来测试nacos的open api:
curl是开发中常用的命令行工具,可以用作Http协议测试。
本教程下载url的windows版本:curl-7.66.0_2-win64-mingw,
curl 命令执行:G:\javaDevloper\curl-7.79.1-win64-mingw\bin
下载完进入这个目录:G:\javaDevloper\curl-7.79.1-win64-mingw\bin>
发布配置
G:\javaDevloper\curl-7.79.1-win64-mingw\bin>curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
true
# 发布配置成功了
G:\javaDevloper\curl-7.79.1-win64-mingw\bin>
上边的命令表示向nacos发布一个配置:
点击详情
获取配置
向nacos发布配置成功,就可以通过客户端从nacos获取配置信息,执行下边的命令
G:\javaDevloper\curl-7.79.1-win64-mingw\bin>curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
HelloWorld
G:\javaDevloper\curl-7.79.1-win64-mingw\bin>
3.1.5 关闭服务器
linux 下 执行
shutdown.sh
windows下执行
cmd shutdown.cmd
或才双击 shutdown.cmd运行文件。
3.1.6 外部MySQL数据库支持。
单机模式时nacos默认使用嵌入式数据库实现数据的存储,若想使用外部mysql存储nacos数据,需要进行以下步骤
-
安装数据库,版本要求:5.6.5+,mysql 8 以下
-
初始化mysql数据,新建数据库nacos_config,数据库初始化文件:${nacoshome}/conf/nacos-mysql.sql
-
修改${nacoshome}/conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql)添加mysql数据源的url,用户名和密码。
# db mysql
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
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.0=root
db.password.0=123456
执行:G:\nacos-server-2.0.3\nacos\conf\nacos-mysql.sql
重新启动
G:\nacos-server-2.0.3\nacos\bin>startup.cmd -m standalone
"nacos is starting with standalone"
,--.
,--.'|
,--,: : | Nacos 2.0.3
,`--.'`| ' : ,---. Running in stand alone mode, All function modules
| : : | | ' ,'\ .--.--. Port: 8848
: | \ | : ,--.--. ,---. / / | / / ' Pid: 16356
| : ' '; | / \ / \. ; ,. :| : /`./ Console: http://192.168.1.2:8848/nacos/index.html
' ' ;. ;.--. .-. | / / '' | |: :| : ;_
| | | \ | \__\/: . .. ' / ' | .; : \ \ `. https://nacos.io
' : | ; .' ," .--.; |' ; :__| : | `----. \
| | '`--' / / ,. |' | '.'|\ \ / / /`--' /
' : | ; : .' \ : : `----' '--'. /
; |.' | , .-./\ \ / `--'---'
'---' `--`---' `----'
2021-10-25 17:57:01,389 INFO Bean 'org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler@5298dead' of type [org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2021-10-25 17:57:01,400 INFO Bean 'methodSecurityMetadataSource' of type [org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2021-10-25 17:57:03,193 INFO Tomcat initialized with port(s): 8848 (http)
2021-10-25 17:57:04,165 INFO Root WebApplicationContext: initialization completed in 18883 ms
2021-10-25 17:57:15,193 INFO Initializing ExecutorService 'applicationTaskExecutor'
2021-10-25 17:57:15,378 INFO Adding welcome page: class path resource [static/index.html]
2021-10-25 17:57:17,974 INFO Creating filter chain: Ant [pattern='/**'], []
2021-10-25 17:57:18,131 INFO Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@8a2a6a, org.springframework.security.web.context.SecurityContextPersistenceFilter@53ed09e8, org.springframework.security.web.header.HeaderWriterFilter@3ee69ad8, org.springframework.security.web.csrf.CsrfFilter@42714a7, org.springframework.security.web.authentication.logout.LogoutFilter@55a88417, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1daf3b44, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@8f2098e, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@772861aa, org.springframework.security.web.session.SessionManagementFilter@1a6cf771, org.springframework.security.web.access.ExceptionTranslationFilter@3ce53f6a]
2021-10-25 17:57:18,981 INFO Initializing ExecutorService 'taskScheduler'
2021-10-25 17:57:19,029 INFO Exposing 16 endpoint(s) beneath base path '/actuator'
2021-10-25 17:57:19,352 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'
2021-10-25 17:57:19,361 INFO Nacos started successfully in stand alone mode. use external storage
3.2 Nacos 配置入门
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
Note:注意dataid是以properties(默认的文件扩展名方式)为扩展名,这里是yaml
第一步:点击新增配置
3.2.2 Nacos客户端获取配置
新建一个maven 项目
我们需要新增 一个名为com.yanshi.article的项目
<groupid>org.example</groupid>
<artifactid>com.yanshi.article</artifactid>
<version>1.0-SNAPSHOT</version>
添加group ID 为 com.alibaba.nacos
和artifact ID 为 nacos-client
的 starter.用于 实现项目中使用 Nacos来实现应用的外部化配置
引入nacos客户端依赖
<dependencies>
<dependency>
<groupid>com.alibaba.nacos</groupid>
<artifactid>nacos-client</artifactid>
<version>2.0.3</version>
</dependency>
</dependencies>
如果运行时出现日志相关错误可以在pom.xml中添加如下内容
<dependency>
<groupid>org.slf4j</groupid>
<artifactid>slf4j-api</artifactid>
<version>1.7.22</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupid>org.slf4j</groupid>
<artifactid>slf4j-log4j12</artifactid>
<version>1.7.22</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupid>org.slf4j</groupid>
<artifactid>slf4j-simple</artifactid>
<version>1.7.22</version>
</dependency>
项目结构
获取配置内容
package com.yanshi.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;
/**
* @author chaoyue
* @version 1.0
*/
public class SimpleDemoMain {
public static void main(String[] args) throws NacosException {
//使用nacos client 远程获取nacos服务上的配置信息
// nacos service 地址
String serverAddr="127.0.0.1:8848";
//dataId
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("测试");
//获取数据源
System.out.println(content);
}
}
#测试
common:
config1: something
发布配置到配置中心,各应用程序通过nacos 提供的API,远程获取配置。
4 Nacos配置管理基础应用
4.1 Nacos配置管理模型
对于Nacos配置管理,通过Namespace、group、Data ID 能够定位到一个配置集。
配置集(DataId)
在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含系统的各种配置信息,例如,一个配置集可能包含了数据源、线程池,日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的ID即DataId.
配置项
key-value格式
配置集中包含一个个配置内容就是配置项。 它代表一个具体的可配置的参数与其值 域,通常以key=value的形式存在。例如我们配置系统的日志输出级别(logLevel=INFO|WARN|ERROR)就是一个配置项。
配置分组(Group)
配置分组是对配置集进行分组,通过一个有意义的字符串(eg. Buy 或 Trade)来表示,不同的配置分组下可以有相同的配置集(Data Id). 当您在Nacos上创建一个配置时,如果未写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP.配置分组的常见场景,可用于区分不同的项目或应用,例如,学生管理系统 的配置集可以定义为:STUDENT_GROUP
命名空间
不同环境进行隔离
命令空间(namespace)可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境、和生产环境。因为它们的配置可能各不相同,或者隔离不一的用户,不同开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(group)或配置集。
最佳实践
nacos抽象定义了Namespace、Group、DataId的概念。
NameSpace:代表不同环境,如开发、测试、生产环境
Group:代表某项目 如 XXX电商项目,XXX金融项目
DataId:每个项目下往往有若干个工程,每个配置集(DataId)是一个工程的主配置文件。
获取某配置集代码
获取配置集需要指定:
1、nacos服务地址,必须指定
2、namespace,如不指定默认public
3、group,如不指定默认DEFAULT_GROUP
4、dataId,必须指定
代码如下
//初始化配置服务
String serverAddr="127.0.0.1:8848";
String namespace="ee247dde-d838-425c-b371-029dab26232f" ;//开发环境,namespace的id
String group="DEFAULT_GROUP";
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
group
:DEFAULT_GROUP
DataId
:nacos-simple-demo.yaml
注意namespace
需要指定id
4.2 命名空间管理
4.2.1 namespace隔离设计
namespace的设计是nacos基于此做多环境以及多(租)用户(多个用户共现使用nacos)数据(配置和服务)隔离的。
- 从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的namespace,以此来实现多环境的隔离。例如你可以有开发,测试,和生产三个不同的环境,那么使用一套nacos集群可以分别建以下三个不同的namespace。如下图所示。
- 从多个租户(用户)的角度来看,每个租户(用户)可能会有自己的namespace每个租户(用户)的配置数据以及注册的微服务数据都会归属自己的namespace下,以此来实现多租户间的数据隔离。例如超级管理员分配了三个租户,分别为张三、李四和王五。分配好了之后,各租户用自己的帐户名和密码登录后,创建自己的命名空间,如下图所示:
多个用户使用nacos client,可通过自己租户下的namespace来初始化,不同租户下的不同namespace是不可见的。
4.2.2 命名空间管理
创建dev 、test、prod
编写程序时,没有写输入命名空间这个参数,nacos
统一使用一个默认值作为namespace
作为输入, nacos config
会使用一个空字符串作为默认的参数来初始化,对应界面上就是public命名空间。
namespace 为public是nacos的一个保留空间,如果您需要创建自己的namespace,不要和public重名
指定的namespace参数一定要写命名空间ID,而不是名称。
运行下边程序测试新建测试环境命名空间
//使用nacos client 远程获取nacos服务上的配置信息
//namespace
String namespace="df741c60-8b59-45c5-8cb3-1d4caeafbf5f"; //dev
// nacos service 地址
String serverAddr="127.0.0.1:8848";
//dataId
String dataId="nacos-simple-demo.yaml";
//Group
String group="DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr",serverAddr);
properties.put("namespace",namespace);
ConfigService configService = NacosFactory.createConfigService(properties);
//获取配置,String dataId,String group,long timeoutMs
String content = configService.getConfig(dataId, group, 5000);
System.out.println("测试");
//获取数据源
System.out.println(content);
4.2配置管理
4.2.1配置列表
导入
导出
克隆
4.2.2历史版本
历史版本可以一键回滚。
点击回滚
4.2.3监听查询
nacos提供配置订阅者即监听者查询能力,同时提供客户端当前配置的MD5校验值,以便帮助用户更好的检查配置变更是否推送到Client端。
能过以下代码可对某配置进行监听:
package com.yanshi.nacos;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import java.util.Properties;
import java.util.concurrent.Executor;
public class SimpleDemoMainListener {
public static void main(String[] args) throws NacosException {
//nacos地址
String serverAddr="127.0.0.1:8848";
//Group
String group="DEFAULT_GROUP";
//namespace
String namespace="df741c60-8b59-45c5-8cb3-1d4caeafbf5f";
//dataId
String dataId="nacos-simple-demo.yaml";
Properties properties = new Properties();
properties.put("serverAddr",serverAddr);
properties.put("namespace",namespace);
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.addListener(dataId, group, new Listener() {
public Executor getExecutor() {
return null;
}
public void receiveConfigInfo(String s) {
//当前配置发生变化时,获取通知。
System.out.println(s);
}
});
//测试让主线程不退出,因为订阅配置是守护线程,主线程退出守护线程就会退出。正式代码中无需下面代码
while (true){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
设置了监听后,改变了内容,客户端就会收到值。
客户端收到值
nacos配置管理,当服务端发生变化时,服务端会把变化传送给客户端
4.3 登录管理
nacos当前版本支持简单的登录功能,默认用户名/密码为: nacos/nacos.
修改默认用户名/密码方法
1.生成加密密码
在pom.xml中加入
<!--导入加密包-->
<dependency>
<groupid>org.springframework.security</groupid>
<artifactid>spring-security-core</artifactid>
<version>5.4.6</version>
</dependency>
编写PasswordEncoderUtil
类,生成加密后的密码,采用BCrypt加密方法在每次生成密码时加随机盐,所以生成密码每次可能不一样。
public class PasswordEncoderUtil {
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("123"));
}
}
添加一个新用户,
INSERT INTO `nacos`.`users`(`username`, `password`, `enabled`) VALUES ('chaoyue', '$2a$10$pxpKLSO5eIlACMyj1Fq/tOEO7mKOH.nhjEwztsUf0UKAm4ap59/bS', 1);
INSERT INTO `nacos`.`roles`(`username`, `role`) VALUES ('chaoyue', 'ROLE_ADMIN');
退出nacos
用户名:chaoyue
密码:123
4.4 关闭登录
内部使用 登录麻烦,现在设置无须登录。
G:\nacos-server-2.0.3\nacos\conf
application.properties
spring.security.enabled=false
management.security=false
spring.basic.enabled=false
nacos.security.ignore.urls=/**
5 Nacos配置管理应用于分布式系统
5.1 从单体架构到微服务
微服务架构使用Nacos作为配置中心
5.1.1 单体架构
all in one 所有功能模块使用同一个数据库,同时,它还提供API或者UI访问的web模块等。
尽管也是模块化逻辑,但是最终它还是会打包并部署为单体应用,这种将所有功能部署在一个web容器中运行的系统就叫做单体架构(也叫巨石应用)。
单体架构有很多好处
开发效率高:模块之间交互采用本地方法调用,并节省微服务之间的交互讨论时间与开发成本。
容易测试:本地就可以启动完整的系统
容易部署:单个web容器运行
复杂性逐渐变高,可维护性逐渐变差 复杂性越来越高,修改时牵一发动全身
版本迭代速度逐渐变慢:修改一个地方就要将整 个应用全部编译、部署、启动时间过长,回归测试周期过长。
5.1.2微服务
将应用中独立的业务模块分出来,建立自己的数据库与自己的业务逻辑。每一个服务称为微服务。
每一个业务模块,使用独立的服务完成。这种微服务架构模式也影响了应用和数据库之间的关系,微服务架构每个服务都有自己的数据库。
微服务架构的好处:
- 分而治之,职责单一,易于开发、理解和维护、方便团队拆分和管理
- 可伸缩:能够单独的对指定的服务进行伸缩。
- 局部容易修改,容易替换,容易部署,有利于持续集成和快速迭代。
- 不会受限于任何技术栈。
5.2分布式应用配置管理
下图展示了如何通过Nacos集中管理多个服务的配置
-
用户通过Nacos Server 的控制台集中对多个微服务的配置进行管理。
-
各微服务统一从Nacos Server中获取各自的配置,并且监听配置的变化。
nacos server 地址:http://192.168.1.2:8848/nacos
5.2.1 发布配置
首先在nacos发布配置,我们规划了两个服务service1,service2,并且想对两个服务的配置进行集中维护。
浏览器访问http://127.0.0.1:8848/nacos,打开nacos控制台,并点击菜单配置管理->配置列表:在nacos添加如下配置:
service1/nacos-logistics
service2/nacos-users
TEST_GROUP
5.2.2他建父工程
为规范版本先创建父工程,指定依赖的版本
springboot 与springcloud版本对应关系
父工程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.yanshi.nacos</groupid>
<artifactid>nacos-config</artifactid>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>nacos-logistics</module>
<module>nacos-users</module>
</modules>
<properties>
<project.build.sourceencoding>UTF-8</project.build.sourceencoding>
<project.reporting.outputencoding>UTF-8</project.reporting.outputencoding>
<java.version>1.8</java.version>
<spring-cloud-alibaba-dependencies.version>2.2.6.RELEASE</spring-cloud-alibaba-dependencies.version>
<spring-cloud-dependencies.version>Hoxton.SR12</spring-cloud-dependencies.version>
<spring-boot-dependencies.version>2.2.13.RELEASE</spring-boot-dependencies.version>
<spring-boot-maven-plugin.version>2.4.7</spring-boot-maven-plugin.version>
</properties>
<dependencymanagement>
<dependencies>
<!--spring-cloud-alibaba-->
<dependency>
<groupid>com.alibaba.cloud</groupid>
<artifactid>spring-cloud-alibaba-dependencies</artifactid>
<version>${spring-cloud-alibaba-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud-->
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-dependencies</artifactid>
<version>${spring-cloud-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springboot-->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-dependencies</artifactid>
<version>${spring-boot-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencymanagement>
<!--构建打包工具-->
<build>
<plugins>
<plugin>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-maven-plugin</artifactid>
<version>${spring-boot-maven-plugin.version}</version>
</plugin>
</plugins>
</build>
</project>
5.2.3 微服务nacos-logistics配置
如何使用** 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
是什么:
Spring Cloud Alibaba Nacos Discovery 是spring Cloud Alibaba的子项目,而Spring Cloud Alibaba 是阿里巴巴公司提供的开源的基于Spring cloud 的微服务套件集合,它致力于提供微服务开发的一站式解决方案。可以Spring cloud 是一套微服务开发的标准,spring cloud alibaba 与spring cloud Netflix 是实现。 使用Spring Cloud Alibaba 方案,开发者只需要添加一些注解和少量配置,就可以将Spring Cloud应用接入阿里分布式应用解决方案,通过阿里中间件来讯速构建分布式应用系统。
由于Nacos
是啊里的中间件,因此,若开发springcloud
微服务应用,使用Spring Cloud Alibaba Nacos Config
来集成Nacos
的配置管理功能是比较明智的选择。
**(1) pom.xml **
创建nacos-logistics
pom.xml
<parent>
<artifactid>nacos-config</artifactid>
<groupid>com.yanshi.nacos</groupid>
<version>1.0-SNAPSHOT</version>
</parent>
<modelversion>4.0.0</modelversion>
<artifactid>nacos-logistics</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>
(2) bootstrap.yml配置
nacos-logistics
由于使用的是外部配置中心,所以需要得命名 bootstrap.yml
server:
port: 56010 #启动端口命令行注入
spring:
application:
name: nacos-logistics
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #配置中心地址
file-extension: yaml
namespace: df741c60-8b59-45c5-8cb3-1d4caeafbf5f # 开发环境
group: TEST_GROUP #测试组
以上配置文件说明应将从地址 127.0.0.1:8848 配置中心获取配置,通过以下信息定位配置
namespace: df741c60-8b59-45c5-8cb3-1d4caeafbf5f # 开发环境
group: TEST_GROUP #测试组
Data Id : nacos-users.yaml
若没有指定 Group 则默认为DEFAULT_GROUP
(3) 启动配置客户端
新增Spring Boot 启动类,并增加获取配置的web访问端点/configs,通过标准的spring @Value方式。
完整的代码如下
package com.yanshi.logistics;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class LogisticsApplication {
public static void main(String[] args) {
SpringApplication.run(LogisticsApplication.class,args);
}
//通过value注解读取配置信息
@Value("${common.name}")
private String configLogistics;
@GetMapping(value = "/configs")
public String getConfigLogistics(){
//读取配置信息
return configLogistics;
}
}
5.2.4 微服务nacos-users配置
(1) pom.xml
创建nacos-users
<parent>
<artifactid>nacos-config</artifactid>
<groupid>com.yanshi.nacos</groupid>
<version>1.0-SNAPSHOT</version>
</parent>
<modelversion>4.0.0</modelversion>
<artifactid>nacos-users</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>
bootstrap.yaml
server:
port: 56011 #启动端口命令行注入
spring:
application:
name: nacos-users
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #配置中心地址
file-extension: yaml # dataId 的名称就是application的name+file-extension即nacos-users.yaml
namespace: df741c60-8b59-45c5-8cb3-1d4caeafbf5f # 开发环境
group: TEST_GROUP #测试组
以上配置文件说明应将从地址 127.0.0.1:8848 配置中心获取配置,通过以下信息定位配置
namespace: df741c60-8b59-45c5-8cb3-1d4caeafbf5f # 开发环境
group: TEST_GROUP #测试组
Data Id : nacos-users.yaml
若没有指定 Group 则默认为DEFAULT_GROUP
整过过程请参考 nacos-logistics的配置
package com.yanshi.users;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class UsersApplication {
public static void main(String[] args) {
SpringApplication.run(UsersApplication.class,args);
}
//通过value注解读取配置信息
@Value("${common.name}")
private String configUsers;
@GetMapping(value = "/configs")
public String getConfigLogistics(){
return configUsers;
}
}
5.2.5支持配置的动态更新
若要实现动态配置更新,只需进行如下改造:
public class UsersApplication {
public static void main(String[] args) {
SpringApplication.run(UsersApplication.class,args);
}
// //通过value注解读取配置信息
// @Value("${common.name}")
// private String configUsers;
//注入配置文件上下文
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping(value = "/configs")
public String getConfigLogistics(){
//读取配置信息
// return configUsers;
return applicationContext.getEnvironment().getProperty("common.name");
}
}
Note 可以通过配置Spring.cloud.nacos.config.refresh.enabled=false来关闭动态或者开启动态刷新。
5.2.6 自定义namespace与group配置
支持自定义namespace的配置
没有处定义命令空间,默认使用的是nacos上public这个namespace.如果需要自定义的命名空间,可以通过以下配置来实现:
spring:
cloud:
nacos:
config:
namespace: df741c60-8b59-45c5-8cb3-1d4caeafbf5f # 开发环境
namespace 的id值 可以在nacos的控制后台获取。
支持自定义Group配置
在没有明确指定${spring.cloud.nacos.config.group} 配置情况下,默认用的是DEFAULT_GROUP.如果需要自定义的Group,可以通过以下配置来实现:
spring:
cloud:
nacos:
config:
group: TEST_GROUP
5.2.7自定义扩展的DataId配置
spring:
application:
name: nacos-logistics
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 #动态刷新配置
ext-config-common01.properties
ext-config-common02.properties
ext-config-common03.properties
验证功能:
@GetMapping(value = "/configs2")
public String getConfigLogistics2(){
//读取配置信息
//return configLogistics;
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;
}
5.2.6自定义共享DataId配置
spring:
application:
name: nacos-logistics
cloud:
nacos:
config:
shared-dataids: ext-config-common01.properties,ext-config-common02.properties,ext-config-common03.properties
refreshable-dataids: ext-config-common01.properties
共享的只能读出 DEFAULT_GROUP 组中的内容
5.2.7配置的优先级
第一种:dataId 自动生成:dataId 的名称就是application的name+file-extension即nacos-logistics.yaml
第二种:自定义扩展的DataId 通过 spring.cloud.nacos.conifg.ext-config[n].data-id
的方式支持多个扩展Data Id 的配置。其中n值 越大优先级越高。
ext-config[0]:
data-id: ext-config-common01.properties
ext-config[1]:
data-id: ext-config-common02.properties
group: GLOBALE_GROUP
ext-config[2]:
data-id: ext-config-common03.properties
group: REFRESH_GROUP
refresh: true #动态刷新配置
第三种:共享的DataId,通过 spring.cloud.nacos.config.shared-dataids
DEFAULT_GROUP
shared-dataids: ext-config-common01.properties,ext-config-common02.properties,ext-config-common03.properties
refreshable-dataids: ext-config-common01.properties
当三种方式同时使用的优先级:第一种>第二种>第三种
service1 config 15 beijing 2020-1-1 lisisiff
service1 config 25 beijing 2020-1-1 lisisiff
5.2.8 完全关闭配置
完全关闭Spring Cloud Nacos Config
spring.cloud.nacos.config.enabled=false
config:
enabled: false # 关闭配置
5.3 Nacos集群部署
5.3.1集群部署
3个或3个以上Nacos节点才能构建集群
(1) 安装3个以上Nacos
我们可以复制之前已经解压好的nacos文件侠,分别使名为 nacos 、nacos1、nacos2
nacos 下的文件需要修改 G:\nacos-server-2.0.3\nacos01\conf\application.properties,同理 nacos02的也需要修改,改为8850
server.port=8849
(2)配置集群配置文件
在所有nacos目录的 conf目录下,有文件cluster.conf.example,将其命名为cluster.conf,并将每行配置成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
application.properties
nacos.inetutils.ip-address=127.0.0.1
(3) 集群模式启动
分别执行nacos目录的bin目录下的startup
G:\nacos-server-2.0.3\nacos\bin>startup -m cluster
第二个窗口
G:\nacos-server-2.0.3\nacos1\bin>startup -m cluster
第三个窗口
G:\nacos-server-2.0.3\nacos2\bin>startup -m cluster
5.3.2客户端配置
bootstrap.yaml
spring:
application:
name: nacos-logistics
cloud:
nacos:
config:
#enabled: false # 关闭配置
server-addr: 127.0.0.1:8848,127.0.0.1:8860,127.0.0.1:8850 #配置中心地址
1) 我可以让8848 下线
2)紧接着重新启动 Provider 这时马上请求 consummer的/service 出现错误,发现consummer与provier通信已经出现问题。但经过短暂的进间后,通信恢复。
通过以上测试我们可以看到,通过以上的集群部署已经达到了高可用的效果。
5.3.3 生产环境部署建议
客户端配置的nacos 当nacos集群迁移时,客户端配置无需修改。
至于数据库,生产环境建义到少用主从模式,通过修改 ${nachosome}/conf/application.properties能够使nacos拥有多个数据源
# db mysql
spring.datasource.platform=mysql
### Count of DB:
db.num=2
### Connect URL of DB:
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.url.1=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
6 小结
1、nacos 是啊里开源的一个项目,不光有配置管理还有服务发现。
2、nacos 配置管理功能,主要应用于微服务架构当中的配置中心的构建。配置中心就是对配置文件单独的对配置文件进行统一管理。
3、nacos具体的使用方法,简先要清楚nacos配置管理模型(namespace、group、dataId,能定位到一个配置集)
4、namespace 用于隔离配置文件和服务发现 例如可以用 namespace来隔离开发环境、测试环境、生产环境,Group可以对应一个maven工程项目,Dataid 对应每一个工程项目的配置文件。
5、nacos配置管理应用到分布式系统开发中,即微服务架构。采用 spring cloud alibaba nacos 的规范和依赖。我可以很方便的通过 spring boot 或spring cloud 来读取nacos中的配置信息。
6、配置时我们要发知道nacos的地址,如果是集群的话我们要指定多个地址,指定域名和配置文件,默认的配置文件名是 (应用程序名称+文件扩展名)这个优先级最高。其次是扩展的配置文件。nacos还可以管理Dubbo服务。