nacos-配置中心
nacos 支持http 方式的服务调用,支持 dubbo 方式的服务调用eureka 支持 http 方式的服务调用
目录
nacos 既是 配置中心 又是 注册中心
nacos 支持http 方式的服务调用,支持 dubbo 方式的服务调用
eureka 支持 http 方式的服务调用
主流的配置中心对比
对比项目 | Spring Cloud Config | Apollo | Nacos |
配置实时推送 | 支持(Spring Cloud Bus) | 支持(HTTP长轮询1s内) | 支持(HTTP长轮询1s内) |
版本管理 | 支持(Git) | 支持 | 支持 |
配置回滚 | 支持(Git) | 支持 | 支持 |
灰度发布 | 支持 | 支持 | 不支持 |
权限管理 | 支持(依赖Git) | 支持 | 不支持 |
多集群 | 支持 | 支持 | 支持 |
多环境 | 支持 | 支持 | 支持 |
监听查询 | 支持 | 支持 | 支持 |
多语言 | 只支持Java | 主流语言,提供了Open API | 主流语言,提供了Open API |
配置格式校验 | 不支持 | 支持 | 支持 |
单机读(QPS) | 7(限流所致) | 9000 | 15000 |
单击写(QPS) | 5(限流所致) | 1100 | 1800 |
3节点读 (QPS) | 21(限流所致) | 27000 | 45000 |
3节点写 (QPS) | 5(限流所致) | 3300 | 5600 |
nacos 特性
服务发现与服务健康检查
动态配置管理
动态 DNS 服务
服务和元数据管理
安装nacos
curl工具下载地址: https://curl.se/windows/
将curl 的 D:\curl-7.74\curl-7.74.0_2-win64-mingw\bin 添加到 环境变量
官网地址: https://nacos.io/zh-cn/docs/quick-start.html
nacos下载地址: https://github.com/alibaba/nacos/releases
下载解压后,在 bin 目录下运行
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
web端访问
http://localhost:8848/nacos/#/login
账号,密码: nacos nacos
新增命名空间
配置列表
nacos数据库使用
默认使用的内置数据库
如果想使用自己的数据库,学会使用官方的文档,官方文档 https://nacos.io/zh-cn/docs/deployment.html
新增配置
Apollo的配置结构图
nacos的配置结构图
添加完配置文件后,列表页会显示 示例代码,这个时候,可以直接使用示例代码进行测试 ,如果添加的文件的命令空间不是 public ,需要手动指定命名空间,示例代码有删除的操作,查看完之后,会将该配置文件删除
创建测试项目
官网地址: Nacos Spring Cloud 快速开始 https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
nacos - springcloud-springboot 版本匹配: https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
由于父项目中引入了
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${com-alibaba-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
所以在 nacos-demo 模块中直接引入依赖,不用指定版本即可
<!-- alibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
对示例代码进行修改 后的内容,添加命名空间,注释删除操作
public static void main(String[] args) throws NacosException, InterruptedException {
//nacos 地址
String serverAddr = "127.0.0.1:8848";
// data id
String dataId = "nacos-demo.yaml";
// Group
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
// 指定命名空间, 使用的是,命名空间的id
properties.put(PropertyKeyConst.NAMESPACE, "fca23eb6-3866-4b8c-8f86-5eeb14e0599d");
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("recieve:" + configInfo);
}
@Override
public Executor getExecutor() {
return null;
}
});
boolean isPublishOk = configService.publishConfig(dataId, group, "content");
System.out.println(isPublishOk);
Thread.sleep(3000);
content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
// 删除 dataid 的配置文件
/*boolean isRemoveOk = configService.removeConfig(dataId, group);
System.out.println(isRemoveOk);
Thread.sleep(3000);*/
content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
Thread.sleep(300000);
}
查看监听列表
用户管理
通过web 界面进行管理
手动修改数据库
nacos的密码是加密的,需要将加密后的内容添加到数据库中
// 加密
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("123456"));
}
添加用户
INSERT INTO users (username, password, enabled) VALUES ('root', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
将用户添加到角色表, 角色为 管理员
INSERT INTO roles (username, role) VALUES ('root', 'ROLE_ADMIN');
分布式应用
nacos-server-0
nacos-server-1
服务配置bootstrap.yml
# bootstrap.yml 的优先级高于 application.yml ,由于,nacos配置中心使用的是 application.yml 配置
资源获取
静态获取配置
/**
* @author yangLongFei 2021-01-05-9:38
*/
@RestController
@RequestMapping("/nacos")
public class NacosController {
/**
* 这种方式,在经过nacos 修改后,无法实时获取配置信息
*/
@Value("${common.name}")
private String commonName;
@GetMapping("/getCommonName")
public String getCommonName() {
return commonName;
}
}
静态资源的动态更新
@RefreshScope // 实现配置的动态更新
/**
* @author yangLongFei 2021-01-05-9:38
*/
@RestController
@RequestMapping("/nacos")
@RefreshScope // 实现配置的动态更新
public class NacosController {
/**
* 这种方式,在经过nacos 修改后,无法实时获取配置信息
*/
@Value("${common.name}")
private String commonName;
@GetMapping("/getCommonName")
public String getCommonName() {
return commonName;
}
}
动态获取配置
/**
* @author yangLongFei 2021-01-05-9:38
*/
@RestController
@RequestMapping("/nacos")
public class NacosController {
@Autowired
private ConfigurableApplicationContext applicationContext;
/**
* 动态更新,nacos 配置文件发生修改,能够实时看到
*/
@GetMapping("/getCommonName")
public String getCommonName() {
return applicationContext.getEnvironment().getProperty("common.name");
}
}
自定义扩展data id(nacos-server-0)
使用 nacos 进行配置的时候, dataid 最好全部带上文件的后缀名称,因为nacos在进行解析的时候,会判断是否有文件的后缀名称,否则会报错
java.lang.IllegalStateException: [nacos-demo] must contains file extension with properties|yaml|yml|xml|json
at com.alibaba.cloud.nacos.parser.NacosDataParserHandler.checkDataId(NacosDataParserHandler.java:68) ~[spring-cloud-alibaba-nacos-config-2.2.0.RELEASE.jar:2.2.0.RELEASE]
由于服务本身的 data id 可以手动指定文件的扩展名,但是在扩展的dataid 的配置项中没有 file-extension 的选项,所以在添加扩展配置的时候,必须带有文件的扩展名
总结:所有的dataid在进行创建的时候,都带上文件的扩展名
扩展data id 只支持 dataId, group, refresh 这三个属性,也就是,说扩展的 data id 必须存在于同一个 namespace
# bootstrap.yml 的优先级高于 application.yml ,由于,nacos配置中心使用的是 application.yml 配置
# 项目的服务中需要使用 bootstrap.yml
server:
port: 58010 #启动端口
spring:
application:
name: nacos-server-0
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #配置中心地址
file-extension: yaml #配置中心的配置文件的后缀
namespace: fca23eb6-3866-4b8c-8f86-5eeb14e0599d #命名空间的id
group: NACOS_GROUP #配置组,不指定默认是 DEFAULT_GROUP
extension-configs[0]:
data-id: nacos-demo.yaml
# group: DEFAULT_GROUP #默认是DEFAULT_GROUP
refresh: true #是否动态刷新,默认 false
extension-configs[1]:
data-id: extension-configs-a.yaml
group: GLOBALE_GROUP
refresh: true
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping("/getCommonName")
public String getCommonName() {
String commonName = applicationContext.getEnvironment().getProperty("common.name");
String commonAge = applicationContext.getEnvironment().getProperty("common.age");
String commonSex = applicationContext.getEnvironment().getProperty("common.sex");
String commonPhone = applicationContext.getEnvironment().getProperty("common.phone");
String commonAddress = applicationContext.getEnvironment().getProperty("common.address");
String commonPort = applicationContext.getEnvironment().getProperty("common.port");
return "name: " + commonName + " age:" + commonAge + " sex:" + commonSex + " phone:" + commonPhone + " address:" + commonAddress + " port:" + commonPort;
}
共享dataid(nacos-server-0)
本身使用的时候,和 扩展data id 没有任何区别
#配置文件优先级问题: shared(下标越大优先级越高) < extension(下标越大优先级越高) < 服务本身的配置
# bootstrap.yml 的优先级高于 application.yml ,由于,nacos配置中心使用的是 application.yml 配置
# 项目的服务中需要使用 bootstrap.yml
server:
port: 58010 #启动端口
spring:
application:
name: nacos-server-0
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #配置中心地址
file-extension: yaml #配置中心的配置文件的后缀
namespace: fca23eb6-3866-4b8c-8f86-5eeb14e0599d #命名空间的id
group: NACOS_GROUP #配置组,不指定默认是 DEFAULT_GROUP
extension-configs[0]: #扩展 dataid
data-id: nacos-demo.yaml
# group: DEFAULT_GROUP #默认是DEFAULT_GROUP
refresh: true #是否动态刷新,默认 false
extension-configs[1]:
data-id: extension-configs-a.yaml
group: GLOBALE_GROUP
refresh: true
shared-configs[0]: #共享 dataid
data-id: nacos-share-config-0.yaml
group: SHARE_GROUP
refresh: true
#配置文件优先级问题: shared(下标越大优先级越高) < extension(下标越大优先级越高) < 服务本身的配置
nacos集群(windows)
windows 和 linux 的启动都是一样的,只是启动的脚本不一样, linux 是 .sh , windows 是 .cmd
启动集群
内置数据库启动
尝试了一下没有成功
外置数据库启动
MySQL数据库
下载地址: https://downloads.mysql.com/archives/installer/
数据库初始化脚本: https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql
修改配置文件
位于 conf 文件夹
- ip-address参数可以直接设置nacos的ip
nacos.inetutils.ip-address=127.0.0.1
可以设置多个数据库,主备模式
#数据库个数为2个
db.num=2
db.url.0=jdbc:mysql://192.168.44.130:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.url.1=jdbc:mysql://192.168.44.131:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456
### Default web server port:
server.port=8848
#*************** Network Related Configurations ***************#
### If prefer hostname over ip for Nacos server addresses in cluster.conf:
# nacos.inetutils.prefer-hostname-over-ip=false
### Specify local server's IP:
# nacos.inetutils.ip-address=
nacos.inetutils.ip-address=127.0.0.1
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
# 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=nacos
# db.password=nacos
#数据库个数
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.url.1=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=root
db.password=123456
多网卡IP选择
当本地环境比较复杂的时候,Nacos服务在启动的时候需要选择运行时使用的IP或者网卡。Nacos从多网卡获取IP参考Spring Cloud设计,通过nacos.inetutils参数,可以指定Nacos使用的网卡和IP地址。目前支持的配置参数有:
- ip-address参数可以直接设置nacos的ip
nacos.inetutils.ip-address=10.11.105.155
- use-only-site-local-interfaces参数可以让nacos使用局域网ip,这个在nacos部署的机器有多网卡时很有用,可以让nacos选择局域网网卡
nacos.inetutils.use-only-site-local-interfaces=true
- ignored-interfaces支持网卡数组,可以让nacos忽略多个网卡
nacos.inetutils.ignored-interfaces[0]=eth0
nacos.inetutils.ignored-interfaces[1]=eth1
- preferred-networks参数可以让nacos优先选择匹配的ip,支持正则匹配和前缀匹配
nacos.inetutils.preferred-networks[0]=30.5.124.
nacos.inetutils.preferred-networks[0]=30.5.124.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d))),30.5.124.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d)))
修改 cluster 文件
位于 conf 文件夹
修改为,各个节点的 ip:端口
#2021-01-08T15:41:57.439
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
单机启动集群
修改 server.port=8848 为相应的文件夹,其他的保持一致
启动命令
打开cmd
startup.cmd
源码地址
https://github.com/YANG-sty/study
更多推荐
所有评论(0)