Nacos-配置管理
服务发现 配置管理
1 Nacos简介
配置中心:微服务架构的配置中心,配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置
主流的配置中心:Spring Cloud Config、Apollo、Nacos
Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案
配置:应用程序在启动和运行时需要读取一些配置中心,数据库连接参数、启动参数
- 配置是独立于程序的只读变量
- 配置伴随应用的整个生命周期
- 配置可以有多种加载方式
- 配置需要治理
Nacos特性
服务发现与服务健康检查
动态配置管理
动态DNS服务
Nacos提供基于DNS协议的服务发现能力
服务的元数据管理
2 安装Nacos Server
2.1 安装过程
省略(42条消息) 解决Nacos下载速度缓慢的问题_年少不知曲中意,再听已是曲终人-CSDN博客_nacos下载很慢
2.2 外部mysql数据库支持
单机模式时Nacos默认使用嵌入式数据库实现数据的存储,若想使用外部masql存储nacos数据:
安装数据库
初始化mysql数据库,新建数据库nacos_config,执行数据库初始化SQL文件:${nacoshome}/conf/nacos-mysql.sql
添加进nacos-server-2.0.3\nacos\conf\application.properties
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=root
3 配置管理-入门demo程序
导入jar包
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.3</version>
</dependency>
<!--这两个slf4j日志不加可能会报错-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.6</version>
</dependency>
nacos 配置管理-配置列表-新建配置
//data id
String dataId = "nacos-simple-demo.yaml";
//group
String group = "DEFAULT_GROUP";
commmon:
config1: something
新建一个SimpleDemoMain类
package test;
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 {
//使用nacos client 远程获取nacos服务上的配置
//nacos server 地址
String serverAddr = "192.168.1.92: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 config = configService.getConfig(dataId, group, 5000);
System.out.println(config);
}
}
4 Nacos配置管理基础应用
4.1 Nacos配置管理模型
对于Nacos配置管理,通过namespace、Group、 DataId能够定位到一个唯一的配置集
配置管理
系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。
配置项
一个具体的可配置的参数与其值域,通常以 param-key=param-value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。
配置集
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
配置集 ID
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
配置分组
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
4.2 命名空间管理
功能:
单用户:例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
多用户:每个用户占用一个namespace命名空间
//使用nacos client 远程获取nacos服务上的配置
//nacos server 地址
String serverAddr = "192.168.1.92:8848";
//namespace 默认为public
String namespace = "f60d904c-dd92-4171-b977-29249f96a31a";
//group
String group = "DEFAULT_GROUP";
//data id
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 config = configService.getConfig(dataId, group, 5000);
System.out.println(config);
4.3 配置管理基础功能
配置列表 发布、删除、编辑、导出、导入、克隆······
历史版本 根据dataId和namespace 查询某个配置集的历史版本,查看详情、回滚
监听查询 根据dataId和group查询有什么客户端在监听 dataId配置集
//监听,当配置有变化时获取监听
//String dataId, String group, Listener listener
configService.addListener(dataId, group, new Listener() {
@Override
public Executor getExecutor() {
return null;
}
//当配置有变化时获取监听
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println(configInfo);
}
});
while(true){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
4.4 登录管理
修改登录密码
密码采用Bcrypt加密 不可解密
nacos 2.0.3可在管理界面直接修改登录密码
关闭登录功能
application.properties文件中spring.security.enabled=false
5 Nacos配置管理应用于分布式系统
5.1 从单体架构到微服务
微服务和单体架构的区别 - zyz1 - 博客园 (cnblogs.com)
5.1.1单体架构
Web应用程序发展的早期,大部分web工程师将所有的功能模块打包到一起并放在一个web容器中运行,所有功能 模块使用同一个数据库,同时,它还提供API或者UI访问的web模块等。
尽管也是模块化逻辑,但是最终它还是会打包并部署为单体式应用,这种将所有功能都部署在一个web容器中运行 的系统就叫做单体架构(也叫:巨石型应用)。
单体架构有很多好处:
开发效率高:模块之间交互采用本地方法调用,并节省微服务之间的交互讨论时间与开发成本。
容易测试:IDE都是为开发单个应用设计的、容易测试——在本地就可以启动完整的系统。
容易部署:运维成本小,直接打包为一个完整的包,拷贝到web容器的某个目录下即可运行。 但是,上述的好处是有条件的,它适用于小型简单应用,对于大规模的复杂应用,就会展现出来以下的不足:
复杂性逐渐变高,可维护性逐渐变差 :所有业务模块部署在一起,复杂度越来越高,修改时牵一发动全身。
版本迭代速度逐渐变慢:修改一个地方就要将整个应用全部编译、部署、启动时间过长、回归测试周期过长。
阻碍技术创新:若更新技术框架,除非你愿意将系统全部重写,无法实现部分技术更新。
无法按需伸缩:通过冗余部署完整应用的方式来实现水平扩展,无法针对某业务按需伸缩。
5.1.2微服务架构
许多大型公司,通过采用微服务架构解决了上述问题。其思路不是开发一个巨大的单体式的应用,而是将应用分解 为小的、互相连接的微服务。
一个微服务一般完成某个特定的功能,比如订单服务、用户服务等等。每一个微服务都是完整应用,都有自己的业 务逻辑和数据库。一些微服务还会发布API给其它微服务和应用客户端使用。
比如,根据前面描述系统可能的分解如下:
每一个业务模块都使用独立的服务完成,这种微服务架构模式也影响了应用和数据库之间的关系,不像传统多个业 务模块共享一个数据库,微服务架构每个服务都有自己的数据库。
微服务架构的好处:
- 分而治之,职责单一;易于开发、理解和维护、方便团队的拆分和管理
- 可伸缩;能够单独的对指定的服务进行伸缩
- 局部容易修改,容易替换,容易部署,有利于持续集成和快速迭代
- 不会受限于任何技术栈
5.2 分布式应用配置管理
如何通过Nacos集中管理多个服务的配置 :
- 用户通过Nacos Server的控制台集中对多个服务的配置进行管理
- 各服务统一从Nacos Server中获取各自的配置,并监听配置的变化
5.2.1 发布配置
5.2.2 创建父工程
5.2.3 微服务service1配置
5.2.4 微服务service2配置
5.2.5支持配置的动态刷新
// 注入配置文件上下文
@Autowired private ConfigurableApplicationContext applicationContext;
@GetMapping(value = "/configs") public String getConfigs(){
return applicationContext.getEnvironment().getProperty("common.name");
}
我们通过nacos控制台更新common.name的配置值,再次访问web端点/configs,发现应用程序能够获取到最新 的配置值,说明spring-cloud-starter-alibaba-nacos-config 支持配置的动态更新。
Note 可以通过配置spring.cloud.nacos.config.refresh.enabled=false来关闭动态刷新
5.2.6 自定义 namespace与group配置
spring:
cloud:
nacos:
config:
namespace: b3404bc0‐d7dc‐4855‐b519‐570ed34b62d7
group:
在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个 namespace。
Note:该配置必须放在 bootstrap.yml文件中。此外 spring.cloud.nacos.config.namespace 的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespae,否则将会导致 读取不到正确的配置。
在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使用的是 DEFAULT_GROUP 。
Note:该配置必须放在 bootstrap.properties 文件中。并且在添加配置时 Group 的值一定要和 spring.cloud.nacos.config.group
的配置值一致。
5.2.7 自定义扩展的 Data Id 配置
server:
port: 56010
spring:
application:
name: service1
cloud:
nacos:
config:
server-addr: 192.168.1.92:8848
file-extension: yaml #dataId的名称就是application的name加file-extension
namespace: f60d904c-dd92-4171-b977-29249f96a31a
group: test
# shared-dataids: ext-config-common01.properties,ext-config-common02.properties,ext-config-common03.properties
# refreshable-dataids: ext-config-common01.properties
# 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 所在的组,不明确配置 的话,默认是 DEFAULT_GROUP。
通过 spring.cloud.nacos.config.ext-config[n].refresh
的配置方式来控制该 Data Id 在配置变更时,是 否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
Note : spring.cloud.nacos.config.ext-config[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩 展配置的 Data Id 文件扩展名没有影响。
5.2.8 配置优先级
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
- A: 通过 spring.cloud.nacos.config.shared-dataids 支持多个共享 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
通过设置 spring.cloud.nacos.config.enabled = false
来完全关闭 Spring Cloud Nacos Config
5.3 Nacos集群部署
d-dataids 支持多个共享 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
通过设置 spring.cloud.nacos.config.enabled = false
来完全关闭 Spring Cloud Nacos Config