目录
一、快速入门
1.1 发布配置
浏览器访问http://127.0.0.1:8848/nacos,打开nacos控制台,并点击菜单配置管理->配置列表:
Data ID: nacos‐simple‐demo.yamlGroup : DEFAULT_GROUP配置格式 : YAML配置内容: common:config1: something
但是我在发布的时候,出现了“发布失败,请检查参数是否正确”错误
可能原因:
1、MySQL版本与nacos版本不对应,1.4.0以下使用的mysql驱动是8.0以下的,1.4.0以上使用的驱动就是8.0以上的,使nacos和数据库的版本对应。
2、检查自己的mysql数据库是否有错误,我用的是这个sql文件导入的,如果是这个文件导入的话,记得看第三条
3、可以阅读下面这篇文章Docker部署nacos 添加配置文件提示: 发布失败。请检查参数是否正确。_侣行gxn的博客-CSDN博客_发布失败。请检查参数是否正确。
4、建议使用nacos稳定版本,下面是nacos官方文档,可以在里面下载
1.2 nacos client远程获取配置
1.2.1 导入坐标
首先自己创建一个maven工程使用,导入下面依赖(因为我的版本是2.1.1,所以我导入的是2.1.1)
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.1</version>
</dependency>
1.2.2 程序代码
获取某配置集的代码 :获取配置集需要指定:1 、 nacos服务地址,必须指定 比如: 127.0.0.1:88482 、 namespace ,如不指定默认 public3 、 group ,如不指定默认 DEFAULT_GROUP4 、 dataId,必须指定 比如: nacos-simple-demo.yaml
public class SimpleDemoMain {
public static void main(String[] args) {
// 使用nacos client远程获取nacos服务上的配置信息
// nacos server地址
String serverAddr = "127.0.0.1:8848";
// data id
String dataId = "nacos-simple-demo.yaml";
// group
String group = "DEFAULT_GROUP";
// Properties指定服务的地址,key Value的形式,记住,key的形式不能写错
Properties properties = new Properties();
// 此时ConfigService对象就知道能从哪里获取配置
properties.put("serverAddr",serverAddr);
// 获取配置
// createConfigService()创建配置服务的对象,我们选择传入一个Properties对象
ConfigService configService = null;
try {
configService = NacosFactory.createConfigService(properties);
// 这一步其实就是获取配置 参数:String dataId,String group,long timeoutMs超时时间
// 获取配置的时候我们指定dataId与group之后,ConfigService就能获取到信息的配置内容
String contont = configService.getConfig(dataId, group,5000);
System.out.println(contont);
} catch (NacosException e) {
throw new RuntimeException(e);
}
}
}
如果运行了上面程序出现了上图所示错误,可以再加一个self4j的maven坐标
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.3</version>
</dependency>
成功运行之后就是下面的结果:
二、Nacos配置管理基础应用
2.1 Nacos配置管理模型
对于Nacos配置管理,通过Namespace、group、DataId能够定位到一个配置集。
下面的service指的是服务发现,我们以后再学
2.1.2 配置集(Data Id)
在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如一个配置集可能包含了数据源、线程池、日志级别等配置项。
每个配置集都可以定义一个有意义的名称,就是配置集的ID即Data Id
就比如说我们之前发布的配置中的Data Id是nacos-simple-demo.yaml,即nacos-simple-demo.yaml是配置集
每个配置文件对应一个DataId
2.1.3 配置项
common:
config: something
2.1.4 配置分组 (Group)
配置分组是对配置集进行分组(可以把几个配置文件归类成一组),通过一个有意义的字符串(如Buy或Trade)来表示,不同的配置分组下可以有相同的配置集(DataID)。
当您在Nacos上创建一个配置 时,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP。
配置分组的常见场景:可用于区分不同的项目或应用(一般一个项目或应用一个组),例如:学生管理系统的配置集可以定义一个group为:STUDENT_GROUP。
2.1.5 命名空间(Namespace)
命名空间(namespace)可用于进行不同环境的配置隔离(我们完全可以定义两套命名空间,而且这两套命名空间是相互隔离的)。
例如可以隔离开发环境、测试环境和生产环境,因为它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。
不同的命名空间下,可以存在相同名称的配置分组(Group)或配置集。
2.1.6 最佳实践(总结)
Namespace :代表不同 环境 ,如开发、测试、生产环境(每一个环境我们都可以创建一个Namespace)。Group :代表某 项目 ,如 XX 医疗项目、 XX 电商项目DataId :每个项目下往往有若干个 工程 ,每个配置集 (DataId) 是一个工程的 主配置文件
2.2 命名空间管理
2.2.1 namespace隔离设计
-
从一个租户 ( 用户 ) 的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的 namespce,以此来实现多环境的隔离。例如,你可能有开发,测试和生产三个不同的环境,那么使用一套nacos集群可以分别建以下三个不同的 namespace 。
-
从多个租户 (用户)的角度来看,每个租户(用户)可能会有自己的namespace(每个用户的配置信息互不影响), 每个租户 ( 用户 ) 的配置数据以及注册的服务数据都会归属到自己的namespace 下,以此来实现多租户间的数据隔离。例如超级管理员分配了三个租户,分别为张三、李四和王五。分配好了之后,各租户用自己的账户名和密码登录后,创建自己的命名空间。如下图所示:
2.2.2 命名空间管理
下面这个public就是命名空间
如下图所示,我们成功的创建了命名空间"prod" ,然后每个命名空间都会有一个id
我们写代码的时候,要指定命名空间就要指定命名空间id,命名空间id可以在下图中复制
String namespace ="2f820239-915b-417c-9002-ead05543ea3d";
然后我们再回到配置列表我们会发现多了一个命名空间"prod"
此时prod命名空间并没有配置(我们也可以在下面这个位置获取到命名空间ID)
namespace 为 public 是 nacos 的一个保留空间,如果您需要创建自己 namespace ,不要和 public重名,以一个实际业务场景有具体语义的名字来命名,以免带来字面上不容易区分自己是哪一个 namespace。在编写程序获取配置集时,指定的 namespace 参数一定要填写 命名空间 ID ,而不是名称如果我们编写代码的时候并没有指定namespace,那默认就是public
2.3 测试命名空间
2.3.1 发布新配置集
发布成功后是下面这个样子
2.3.2 获取新配置项
public class SimpleDemoMain {
public static void main(String[] args) {
// 使用nacos client远程获取nacos服务上的配置信息
// nacos server地址
String serverAddr = "127.0.0.1:8848";
// 命名空间 默认public
String namespace = "2f820239-915b-417c-9002-ead05543ea3d";
// data id
String dataId = "nacos-simple-demo.yaml";
// group
String group = "DEFAULT_GROUP";
// Properties指定服务的地址,key Value的形式,记住,key的形式不能写错
Properties properties = new Properties();
// 此时ConfigService对象就知道能从哪里获取配置
properties.put("serverAddr",serverAddr);
properties.put("namespace",namespace);
// 获取配置
// createConfigService()创建配置服务的对象,我们选择传入一个Properties对象
ConfigService configService = null;
try {
configService = NacosFactory.createConfigService(properties);
// 这一步其实就是获取配置 参数:String dataId,String group,long timeoutMs超时时间
// 获取配置的时候我们指定dataId与group之后,ConfigService就能获取到信息的配置内容
String contont = configService.getConfig(dataId, group,5000);
System.out.println(contont);
} catch (NacosException e) {
throw new RuntimeException(e);
}
}
}
2.4 监听查询功能操作
2.4.1 监听查询功能介绍
客户端去查询服务端的配置信息,当信息有变化的时候,服务端会通知客户端的
但是如果我们的客户端(代码)一直在运行不停止,相当于我们在监听着服务端的内容变化,那么当服务端的配置文件发生改变,那服务端就可以主动通知客户端来获取配置文件的内容
2.4.2 代码功能展示
public class SimpleDemoMain {
public static void main(String[] args) {
// 使用nacos client远程获取nacos服务上的配置信息
// nacos server地址
String serverAddr = "127.0.0.1:8848";
// 命名空间 默认public
String namespace = "2f820239-915b-417c-9002-ead05543ea3d";
// data id
String dataId = "nacos-simple-demo.yaml";
// group
String group = "DEFAULT_GROUP";
// Properties指定服务的地址,key Value的形式,记住,key的形式不能写错
Properties properties = new Properties();
// 此时ConfigService对象就知道能从哪里获取配置
properties.put("serverAddr",serverAddr);
properties.put("namespace",namespace);
// 获取配置
// createConfigService()创建配置服务的对象,我们选择传入一个Properties对象
ConfigService configService = null;
try {
configService = NacosFactory.createConfigService(properties);
// 这一步其实就是获取配置 参数:String dataId,String group,long timeoutMs超时时间
// 获取配置的时候我们指定dataId与group之后,ConfigService就能获取到信息的配置内容
String contont = configService.getConfig(dataId, group,5000);
System.out.println(contont);
// 添加监听器 参数: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);
}
});
} catch (NacosException e) {
throw new RuntimeException(e);
}
// 让这个程序不结束
while(true){
try{
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
我们首先启动的时候,控制台的效果是下面这个样子的
我们打开可视化界面,在“监听查询模块”我们发现了下面的信息
改变下面的内容
当我们将内容发布出去后,idea控制台就会出现了下面的变化
2.5 登录管理
Nacos版本支持简单的登录功能
默认用户名nacos,默认密码nacos
2.5.1 修改默认用户名/密码
Nacos使用的是BCryptPasswordEncoder加密的方式,把明文的格式转化成BCrypt加密形式
如下图所示,下面就是默认的用户名和密码,password便是BCrypt加密形式
2.5.2 BCrypt的maven坐标
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring‐security‐core</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
2.5.3 代码实现修改密码
编写PasswordEncoderUtil类,生成加密后的密码,采用BCrypt加密方法在每次生成密码时会加随机盐,所以生成密码每次可能不一样。
盐(Salt),在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”。
随机盐(salt)增加密码存储安全
public class PasswordEncoderUtil {
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("123")); }
}
当我们获取到加密之后的密码,我们可以使用Java代码修改密码,也可以在navicat中直接修改密码
2.5.4 新增用户名和密码
INSERT INTO users (username, password, enabled) VALUES ('nacos1','$2a$10$SmtL5C6Gp2sLjBrhrx1vj.dJAbJLa4FiJYZsBb921/wfvKAmxKWyu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos1', 'ROLE_ADMIN');