CSDN
https://download.csdn.net/download/weixin_44624117/35877729
B站视频源:
https://www.bilibili.com/video/BV1VJ411X7xX?p=1
文件:
https://download.csdn.net/download/weixin_44624117/35878702
Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。
目前市面上用的比较多的配置中心有:Spring Cloud Confifig、Apollo、Nacos和Disconf等。
官网
https://nacos.io/
Linux(centos 7.5)服务器安装JDK(1.8)
Maven在Windows和Linux下安装
下载地址
https://github.com/alibaba/nacos/releases/tag/1.4.2
服务器下载
wget https://codechina.csdn.net/weixin_44624117/software/-/raw/master/software/nacos-server-1.4.2.tar.gz
解压文件
tar -zxvf /root/nacos-server-1.4.2.tar.gz -C /usr/local/
进入启动目录
cd /usr/local/nacos/bin/
启动服务(单机)
sh ./startup.sh -m standalone
页面访问地址:
http://8.131.239.157:8848/nacos/index.html
默认账号密码(默认:nacos)
nacos
通过dataId
、group
,共同获取conten。
dataId
group
content
1、存入数据
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
1、获取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
2.执行建表sql文件
文件位置
/usr/local/nacos/conf/nacos-mysql.sql
3.3.修改${nacoshome}/conf/application.properties文件,增加支持mysql数据源配置
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
db.user=root
db.password=1581145
修改配置文件:
vim /usr/local/nacos/conf/application.properties
3.4重启Nacos
cd /usr/local/nacos/bin/
sh ./shutdown.sh
sh ./startup.sh -m standalone
重新登录刷新页面既可。
版本过高,依赖日志文件没找到,降低依赖的版本既可。
解决方式:
<dependency>
<groupId>com.alibaba.nacosgroupId>
<artifactId>nacos-clientartifactId>
<version>1.1.3version>
dependency>
Exception in thread "main" ErrCode:-400, ErrMsg:endpoint is blank
地址没找到Nacos地址,serverAdder
写错了。
解决方式
Properties properties = new Properties();
properties.put("serverAdder",serverAddr);
命名空间(Namespace)(默认Public)
命名空间(namespace)
可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或 配置集。
配置分组(Group)
配置分组是对配置集进行分组,通过一个有意义的字符串(如 Buy 或 Trade )来表示,不同的配置分组下可以有相同的配置集(Data ID)。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不同的项目或应用,例如:学生管理系统的配置集。可以定义一个group为:STUDENT_GROUP
。
配置集(Data ID)
在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的ID即Data ID。
配置项
配置集中
包含的一个个配置内容就是配置项
。它代表一个具体的可配置的参数与其值域,通常以 key=value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。
最佳实践:
Namespace:代表不同环境,如开发、测试、生产环境。
Group:代表某项目,如XX医疗项目、XX电商项目
DataId:每个项目下往往有若干个工程,每个配置集(DataId)是一个工程的主配置文件
获取某配置集代码:
// 初始化配置服务,
String serverAddr = "127.0.0.1:8848";
//指定命名空间(默认public)
String namespace = "ee247dde‐d838‐425c‐b371‐029dab26232f";
//开发环境
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);
1.隔离设计
namespace 的设计是 nacos 基于此做多环境以及多租户(多个用户共同使用nacos)数据(配置和服务)隔离的。
从一个租户(用户)的角度来看:如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的
namespce,以此来实现多环境的隔离。
从多个租户(用户)的角度来看:每个租户(用户)可能会有自己的 namespace,每个租户(用户)的配置数据以及注
册的服务数据都会归属到自己的 namespace 下。
2.新建命名空间
命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace。
1. 多配置格式编辑器
Nacos支持 YAML、Properties、TEXT、JSON、XML、HTML 等常见配置格式在线编辑、语法高亮、格式校验,帮助用户高效编辑的同时大幅降低格式错误带来的风险。
2. 编辑DIFF
Nacos支持编辑DIFF能力,帮助用户校验修改内容,降低改错带来的风险。
3. 导出配置集合
4. 导入配置集合
5. 配置集克隆
点击左下角 克隆 按钮,将会弹出克隆对话框,此功能可用于将配置迁移到其他Namespace
。
Nacos通过提供配置版本管理及其一键回滚能力,帮助用户改错配置的时候能够快速恢复,降低微服务系统在配置管理上的可用性风险。
需要输入Data ID
和Group
,查询历史版本。
回滚历史版本
添加守护线程,监听Nacos当前配置是否变更,假如有变化,则推送到服务器中。
package com.lydms.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 dmo02 {
public static void main(String[] args) throws NacosException {
String serverAddr = "127.0.0.1:8848";
String dataId = "com.lydms";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAdder", serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
String config = configService.getConfig(dataId, group, 5000);
System.out.println(config);
//添加监听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(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
当Nacos页面进行数据修改时,会推送到服务器上。
Nacos当前版本支持简单的登录功能,默认用户名/密码为: nacos/nacos
。
在入门程序中加入如下以来:
<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-coreartifactId>
<version>5.5.1version>
dependency>
编写PasswordEncoderUtil类,生成加密后的密码,采用BCrypt加密方法在每次生成密码时会加随机盐,所 以生成密码每次可能不一样。
package com.lydms.nacos.com.lydms.utils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
public class PasswordEncoderUtil {
public static void main(String[] args) {
// $2a$10$sjlSLf3rVI0SlUkjunGWIecnow.XovvK61bzdHDiJIAAfzqpPrOLK
System.out.println(new BCryptPasswordEncoder().encode("123"));
}
}
创建用户名或者密码的时候,用指定用户名密码即可。
将上边程序输出的密码更新到数据库。
INSERT INTO users ( username, PASSWORD, enabled )
VALUES
( 'nacos1', '$2a$10$SmtL5C6Gp2sLjBrhrx1vj.dJAbJLa4FiJYZsBb921/wfvKAmxKWyu', TRUE );
INSERT INTO roles ( username, role )
VALUES
( 'nacos1', 'ROLE_ADMIN' );
由于部分公司自己开发控制台,不希望被nacos的安全fifilter拦截。因此nacos支持定制关闭登录功能找到配置文件
${nacoshome}/conf/application.properties
, 替换以下内容即可。
将下面这几项置为false既可
spring.security.enabled=false
management.security=false
security.basic.enabled=false
nacos.security.ignore.urls=/**
server.port=8090
#配置名称
spring.application.name=service1
#配置文件
spring.cloud.nacos.config.file-extension=yaml
# 配置中心地址
spring.cloud.nacos.config.server‐addr=8.131.239.157:8848
#配置文件所属命名空间(namespace)
spring.cloud.nacos.config.namespace=9fd002c2-a268-4eaa-8ada-c42d52954e25
#配置文件所处组(group)
spring.cloud.nacos.config.group=TEST_GROUP
# 一、自定义扩展 Data Id
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.ext‐config[0].data-id=common01.properties
# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.ext‐config[1].group=GLOBALE_GROUP
spring.cloud.nacos.config.ext‐config[1].data-id=common02.properties
# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.ext‐config[2].group=REFRESH_GROUP
spring.cloud.nacos.config.ext‐config[2].data-id=common03.properties
spring.cloud.nacos.config.ext‐config[2].refresh=true
# 二、自定义共享 Data Id
#多个共享 Data Id 的配置
spring.cloud.nacos.config.shared-dataids=common01.properties,common02.properties,common03.properties
#自动刷新配置
spring.cloud.nacos.config.refreshable-dataids=common01.properties
@value注解问题:
@value
注解,不能及时同步Nacos服务器端的更新。ConfigurableApplicationContext
,进行数据同步。1. 更新Nacos配置
2. 添加获取上下文
@GetMapping(value = "/configs")
public String getConfigs() {
return applicationContext.getEnvironment().getProperty("common.name");
}
3. 更新后刷新页面
刷新页面后,发现服务器端配置更新以后,本地的配置也随时进行更新。
nameSpace:默认使用的是 Nacos 上 Public 这个。
spring.cloud.nacos.config.namespace=b3404bc0‐d7dc‐4855‐b519‐570ed34b62d7
该配置必须放在 bootstrap.yml文件中。此外 spring.cloud.nacos.config.namespace 的值是 namespace对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespace,否则将会导致读取不到正确的配置。
在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 。如果
需要自定义自己的 Group,可以通过以下配置来实现:
group: 默认使用的是 DEFAULT_GROUP
。
spring.cloud.nacos.config.group=TEST_GROUP
Nacos Confifig可支持自定义 Data Id 的配置。
通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
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 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。数据源:
更新配置文件:
server.port=8090
spring.application.name=service1
# 配置中心地址
spring.cloud.nacos.config.server‐addr=8.131.239.157:8848
spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.namespace=9fd002c2-a268-4eaa-8ada-c42d52954e25
spring.cloud.nacos.config.group=TEST_GROUP
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.ext‐config[0].data-id=common01.properties
# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.ext‐config[1].group=GLOBALE_GROUP
spring.cloud.nacos.config.ext‐config[1].data-id=common02.properties
# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.ext‐config[2].group=REFRESH_GROUP
spring.cloud.nacos.config.ext‐config[2].data-id=common03.properties
spring.cloud.nacos.config.ext‐config[2].refresh=true
编写获取配置文件内容代码;
package com.lydms.start;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SumCommon {
@Autowired
ConfigurableApplicationContext applicationContext;
@GetMapping("/somecommon")
public String someCommon() {
String commonName01 = applicationContext.getEnvironment().getProperty("common.name01");
String commonName02 = applicationContext.getEnvironment().getProperty("common.name02");
String commonName03 = applicationContext.getEnvironment().getProperty("common.name03");
return "commonName01: " + commonName01 + ", commonName02: " + commonName02 + ", commonName03: " + commonName03;
}
}
结果:
当跟新完成3个文件数据源后,发现只有commonName03
数值更新。
refresh
配置了自动更新。GLOBALE_GROUP
默认组的数据也不更新。spring.cloud.nacos.config.shared-dataids
:支持多个共享 Data Id 的配置,多个之间用逗号隔开。spring.cloud.nacos.config.refreshable-dataids
:支持哪些共享配置的 Data Id 在配置变化时,应用中是否可动态刷新, 感知到最新的配置值,多个 Data Id 之间用逗号隔开。如果没有明确配置,默认情况下所有共享配置的 Data Id 都不支持动态刷新。#多个共享 Data Id 的配置
spring.cloud.nacos.config.shared-dataids=common01.properties,common02.properties,common03.properties
#自动刷新配置
spring.cloud.nacos.config.refreshable-dataids=common01.properties
spring.cloud.nacos.config.shared-dataids
支持多个共享 Data Id 的配置。spring.cloud.nacos.config.ext-config[n].data-id
的方式支持多个扩展 Data Id 的配置,多个Data Id 同时配置时,他的优先级关系是spring.cloud.nacos.config.ext-config[n].data-id
其中 n 的值越大,优先级越高。=当三种方式共同使用时,优先级关系是:C > B >A 。
通过设置spring.cloud.nacos.confifig.enabled = false
来完全关闭 Spring Cloud Nacos Confifig
spring.cloud.nacos.confifig.enabled = false
3个或3个以上Nacos节点才能构成集群。
1、修改集群配置问题
有nacos目录的conf目录下,有文件cluster.conf.example
,将其命名为cluster.conf
。
# ip:port
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
2、修改部署的端口IP(多台部署忽略)
server.port=8850
# 本机实际IP
nacos.inetutils.ip‐address=10.121.294.193
3、集群模式启动
cd /usr/local/nacos/bin
启动服务
sh ./startup ‐m cluster
4、部署成功结果展示
在配置中心地址中加入多个集群部署配置的IP:port
既可。
#配置名称
spring.application.name=service1
#配置文件
spring.cloud.nacos.config.file-extension=yaml
# 配置中心地址
spring.cloud.nacos.config.server‐addr=8.131.239.157:8848,8.131.239.157:8849,8.131.239.157:8850
于数据库,生产环境下建议至少主备模式。通过修改/conf/application.properties
文件,能够使 nacos拥有多个数据源。
spring.datasource.platform=mysql
db.num=2
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&autoReconnect=true
db.url.1=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&autoReconnect=true db.user=root
db.password=root
查看增加的配置
需新建Maven项目项目获取配置
1、pom.xml
<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.0modelVersion>
<groupId>com.lydmsgroupId>
<artifactId>nacos-start-dmoartifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>com.alibaba.nacosgroupId>
<artifactId>nacos-clientartifactId>
<version>1.1.3version>
dependency>
dependencies>
project>
2、代码
package com.lydms.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 start {
public static void main(String[] args) throws NacosException {
String serverAddr="127.0.0.1:8848";
String dataId="com.lydms";
String group="DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr",serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
String config = configService.getConfig(dataId, group, 5000);
System.out.println(config);
}
}
新增Service1的Nacos配置:
Namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4 #开发环境
Data ID: service1.yaml
Group : TEST_GROUP
配置格式: YAML
配置内容: common:
name: service1 config
1. bootstrap.yaml
server:
port: 8090 #启动端口 命令行注入
spring:
application:
name: service1
cloud:
nacos:
config:
#enabled: false #关闭配置
server-addr: 8.131.239.157:8848 # 配置中心地址
file-extension: yaml #dataid 的名称就是application的name加file-extension service1.yaml
namespace: 9fd002c2-a268-4eaa-8ada-c42d52954e25 # 开发环境 指定 具体的namespace
group: TEST_GROUP # 测试组
2. pom.xml
<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.0modelVersion>
<groupId>com.lydmsgroupId>
<artifactId>service1artifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>2.1.7.RELEASEversion>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
<version>2.1.0.RELEASEversion>
dependency>
dependencies>
project>
3. 启动类
package com.lydms.start;
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;
@RestController
@SpringBootApplication
public class startUp {
@Value("${common.name}")
private String commonName;
public static void main(String[] args) {
SpringApplication.run(startUp.class, args);
}
@GetMapping("/test")
public String getConfigName() {
System.out.println(commonName);
return commonName;
}
}
4. 页面请求结果
下图是官方推荐的集群方案,通过域名 + VIP模式的方式来实现。客户端配置的nacos,当Nacos集群迁移时,客户端配置无需修改。
启动2个没有问题,启动3个就有问题。
原因:
JVM内存占用过大,2个服务器还够用,单台启动多个就不够用。
解决:
修改启动时JVM配置。
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then
JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"
fi
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
当配置完成以后,配置文件更新为bootstrap.yml
后,还是无法获取nacos
中配置文件。
可能是bootstrap加载有问题,使用重写bootstrap
加载依赖,就能完成配置文件导入。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bootstrapartifactId>
dependency>