文章目录
- 一、Nacos分布式配置中心
- 1、使用分布式配置中心的优点
- 2、Nacos配置中心和应用间的数据同步的三种模式
- 3、Namespace命名空间
- 4、DataID配置
- 5、Group配置
- 二、Nacos分布式配置中心的使用
- 1、将应用对接Nacos配置中心
- 2、Nacos实现配置动态刷新@RefreshScope
- 3、Dubbo服务对接分布式配置中心
- 三、搭建Nacos集群
- 1、Nacos集群介绍
- 2、Nacos使用MySQL实现数据持久化
- 3、Docker搭建Nacos集群及配置
- 4、使用Nginx作为负载均衡访问Nacos集群
- 总结
一、Nacos分布式配置中心
1、使用分布式配置中心的优点
- 支持配置文件的动态更新:在实际的业务开发过程中,需要动态地更新配置文件,比如切换业务功能开关、变更图片服务器地址、变更数据库连接信息等。在传统配置模式下,需要修改本地配置文件并重新打包,然后重启应用并发布,这样才能保证配置文件能够生效。但这样会导致该服务在重启阶段不可用,从而影响服务整体的可用率。
- 支持配置集中式管理:在微服务架构中,为了保证某些核心服务的高性能会部署几百个节点。如果在每个节点上都维护一个本地配置文件,则不管是对运维人员或者开发人员而言,成本都是巨大的。
- 支持多环境部署:如果通过底层框架来维护不同环境的信息,则成本也是非常高的。
2、Nacos配置中心和应用间的数据同步的三种模式
-
Pull模式:让应用开后长轮询,即定时地从配置中心拉取最新的配置信息,并更新到应用的内存中。
长轮询:一般由客户端向服务器发出一个设置较长的网络超时时间的HTTP请求,并在HTTP连接超时前,不主动断开连接;待客户端超时或有数据返回后,再次建立一个同样的HTTP请求,重复以上过程。即会持续与服务器建立连接。
-
Push模式:在配置中心的配置数据变更之后,主动推送配置数据到指定的应用,应用更新到本地内存中。
-
混合模式:应用和配置中心通过“事件机制+监听器”模式保持长连接。如果应用监听的配置信息发生了变化,则配置中心发布对应类型的事件。应用只有在监听到该事件之后,才会处理对应的配置信息,并更新到应用本地。
3、Namespace命名空间
- 在微服务体系中,一个系统往往被拆分为多个服务,每个服务都有自己的配置文件,然后每个系统往往还会准备开发环境、测试环境、正式环境。
- 用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。默认namespace=public的保留空间,不支持删除;默认情况下。
- Nacos给的最佳实践表明,最外层的namespace是可以用于区分部署环境的,比如test,dev,prod等。
即Nacos组件Namespace命名空间的主要作用是多环境下的配置隔离和管理 - 在命名空间中创建不同的部署环境
- 在配置列表中切换不同的命名空间(部署环境)
4、DataID配置
- Nacos 中的某个配置集的 ID,配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。
在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集。 - DataID的拼接格式:prefix - spring.profiles.active . file-extension
1)prefix:默认为 spring.application.name 的值。
2)spring.profiles.active:即为当前环境对应的 profile。
3)file-extension:文件后缀 - 当activeprofile为空时。DataID的拼接格式:prefix . file-extension
- 在配置列表中点击右上角的+号,即可新建配置,将application.yml文件中的配置复制到上面即可。
5、Group配置
- Nacos中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串对配置集进行分组,从而区分Data ID相同的配置集。当您在 Nacos上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP 。
- 通过Group实现环境区分
即不同的系统或微服务的配置文件可以放在一个组里。比如用户系统和订单系统的配置文件都可以放在同个组中。
二、Nacos分布式配置中心的使用
1、将应用对接Nacos配置中心
-
在父工程中,右键创建新模块cloud-nacos-config3344
-
在cloud-nacos-config3344中,添加如下依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> </dependencies>
-
在cloud-nacos-config3344中,创建主启动类NacosConfigMain3344
package com.zzx; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * 主启动类 */ @SpringBootApplication @Slf4j @EnableDiscoveryClient public class NacosConfigMain3344 { public static void main(String[] args) { SpringApplication.run(NacosConfigMain3344.class,args); log.info("********* NacosConfigMain3344 启动成功 *********"); } }
-
在cloud-nacos-config3344中,创建ConfigController
package com.zzx.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/nacos") public class ConfigController { @Value("${nacos.config}") private String config; @GetMapping("/config") public String config(){ return config; } }
-
在cloud-nacos-config3344的resources中,创建bootstrap.yml
server: port: 3344 spring: application: name: nacos-config cloud: nacos: discovery: server-addr: 192.168.126.32:8848 config: # 服务器地址 server-addr: 192.168.126.32:8848 # 默认为Public命名空间,可以省略不写 # 建立的命名空间需要指定对应的UUID namespace: aef5fb65-364c-4b6a-9d43-56d20c121301 # 指定文件后缀 file-extension: yaml #文件名 -- 如果没有配置则默认为 ${spring.appliction.name} prefix: ${spring.application.name} #指定配置群组 --如果是Public命名空间 则可以省略群组配置 group: DEFAULT_GROUP profiles: active: dev
-
在Nacos中新建一个配置nacos-config-dev.yaml,用来测试是否能从nacos中拉取配置
-
启动NacosConfigMain3344,在浏览器访问:
http://localhost:3344/nacos/config
2、Nacos实现配置动态刷新@RefreshScope
- 即在对应Controller类上面添加上一个@RefreshScope
此时在ConfigController类上面添加上一个@RefreshScope - 重启该项目,然后在Nacos上面修改配置信息
- 在浏览器测试,动态刷新是否生效:
http://localhost:3344/nacos/config
3、Dubbo服务对接分布式配置中心
-
将duubo服务的消费者和生产者的application.yml文件,配置到nacos中,然后将application.yml文件删除。
-
在cloud-dubbo-consumer-order80的resources中,创建bootstrap.yml文件,配置nacos即可
spring: main: allow-bean-definition-overriding: true allow-circular-references: true application: name: order-consumer-dubbo cloud: nacos: config: # 服务器地址 server-addr: 192.168.126.32:8848 # 默认为Public命名空间,可以省略不写 # 建立的命名空间需要指定对应的UUID namespace: aef5fb65-364c-4b6a-9d43-56d20c121301 # 指定文件后缀 file-extension: yaml #文件名 -- 如果没有配置则默认为 ${spring.appliction.name} prefix: ${spring.application.name} #指定配置群组 --如果是Public命名空间 则可以省略群组配置 group: DEFAULT_GROUP profiles: active: dev
-
在cloud-dubbo-provider-payment8001的resources中,创建bootstrap.yml文件,配置nacos即可
spring: main: allow-bean-definition-overriding: true allow-circular-references: true application: name: payment-provider-dubbo cloud: nacos: config: # 服务器地址 server-addr: 192.168.126.32:8848 # 默认为Public命名空间,可以省略不写 # 建立的命名空间需要指定对应的UUID namespace: aef5fb65-364c-4b6a-9d43-56d20c121301 # 指定文件后缀 file-extension: yaml #文件名 -- 如果没有配置则默认为 ${spring.appliction.name} prefix: ${spring.application.name} #指定配置群组 --如果是Public命名空间 则可以省略群组配置 group: DEFAULT_GROUP profiles: active: dev
-
在cloud-dubbo-consumer-order80的POM文件中,再添加如下依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
-
在cloud-dubbo-provider-payment8001的POM文件中,再添加如下依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
-
只需要启动dubbo的生产者和消费者服务即可测试
三、搭建Nacos集群
1、Nacos集群介绍
- 默认Nacos使用嵌入式数据库Derby实现数据的存储。如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
- Nacos支持三种部署模式
1)单机模式 - 用于测试和单机试用。
2)集群模式 - 用于生产环境,确保高可用。
3)多集群模式 - 用于多数据中心场景。
2、Nacos使用MySQL实现数据持久化
-
在虚拟机中使用Docker容器快速搭建MySQL:
docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
-
在navicat中连接该MySQL数据库
-
新建一个数据库nacos
-
因为Nacos是使用Docker容器部署的
1)进入到Nacos容器中:docker exec -it nacos bash
2)进入到Nacos的conf目录中:cd conf
3)查看mysql-shema.sql:cat mysql-schema.sql
4)在刚刚创建的nacos数据中新建查询,将结果复制到上面,执行运行即可
5)成功之后就会出现这些表
-
修改nacos的配置文件
1)将nacos的配置文件进行备份:cp application.properties application.properties.bak
2)修改配置文件:vim application.properties
spring.datasource.platform=mysql db.num=${MYSQL_DATABASE_NUM:1} db.url.0=jdbc:mysql://192.168.126.32:${MYSQL_SERVICE_PORT:3306}/nacos?${MYSQL_SEERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&auttoReconnect=true&useSSL=false} db.user.0=root db.password.0=123456
3)重启nacos:docker restart nacos
,可能需要等几分钟才能访问,然后配置用MySQL数据库进行集中存储后,会直接从存储在Derby嵌入式数据库,改成存储在MySQL数据库中。
3、Docker搭建Nacos集群及配置
- 使用Docker创建三个Nacos,使用不同的端口号,模拟搭建Nacos集群(确保mysql已经启动)
1)docker run -it -e PREFER_HOST_MODE=192.168.126.32 -e MODE=cluster -e NACOS_SERVERS="192.168.126.32:8848 192.168.126.32:8858 192.168.126.32:8868" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.126.32 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -p 8848:8848 -p 9848:9848 -p 9849:9849 --name nacos1 --restart=always nacos/nacos-server:v2.2.0
2)docker run -it -e PREFER_HOST_MODE=192.168.126.32 -e MODE=cluster -e NACOS_SERVERS="192.168.126.32:8848 192.168.126.32:8858 192.168.126.32:8868" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.126.32 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -p 8858:8858 -p 9858:9858 -p 9859:9859 --name nacos2 --restart=always nacos/nacos-server:v2.2.0
3)docker run -it -e PREFER_HOST_MODE=192.168.126.32 -e MODE=cluster -e NACOS_SERVERS="192.168.126.32:8848 192.168.126.32:8858 192.168.126.32:8868" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.126.32 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -p 8868:8868 -p 9868:9868 -p 9869:9869 --name nacos3 --restart=always nacos/nacos-server:v2.2.0
- 修改nacos2的默认端口
1)进入到nacos2容器中:docker exec -it nacos2 bash
2)进入到nacos2的conf目录中:cd conf
3)修改nacos配置文件:vim application.properties
4)退出容器:server.port=${NACOS_APPLICATION_PORT:8858}
ctrl + p + q
- 修改nacos3的默认端口
1)进入到nacos3容器中:docker exec -it nacos3 bash
2)进入到nacos3的conf目录中:cd conf
3)修改nacos配置文件:vim application.properties
4)退出容器:server.port=${NACOS_APPLICATION_PORT:8868}
ctrl + p + q
- 重启nacos2、nacos3:
docker restart nacos2/3
,浏览器访问8848、8858、8868端口的nacos服务
4、使用Nginx作为负载均衡访问Nacos集群
-
安装Nginx环境:
yum -y install gcc make automake pcre-devel zlib zlib-devel openssl openssl-devel
-
下载nginx:
http://nginx.org/download/nginx-1.22.1.tar.gz
-
将nginx通过mobax上传到/opt目录下,解压到/usr/local目录中:
tar -zxvf /opt/nginx-1.22.1.tar.gz -C /usr/local
-
安装Nginx:
1)检查生成.md文件:/usr/local/nginx-1.22.1/configure
2)编译安装nginx:make && make install
-
修改nginx.conf文件:
vim /usr/local/nginx/conf/nginx.conf
#定义upstream名字,下面会引用 upstream nacos{ #指定后端服务器地址 server 192.168.126.32:8848; server 192.168.126.32:8858; server 192.168.126.32:8868; } server { listen 80; server_name localhost; location / { proxy_pass http://nacos; #引用upstream } }
-
启动nginx:
/usr/local/nginx/sbin/nginx
-
在浏览器访问nginx:
http://192.168.126.32/nacos
总结
- 即Namespace可以实现部署环境的区分,而DataID可以实现微服务的区分,而Group可以将多个微服务归属于同一个组。
- SpringBoot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application。也就是说从nacos拉取配置后,bootstrap.yml配置会被application.yml的相同配置覆盖掉。即低优先级覆盖高优先级。
- SpringCloudConfig需要启动Config服务,而Nacos不需要启动Nacos,直接配置即可。但是需要每个项目都引入Nacos的Config依赖。即SpringCloudConfig是作为一个微服务注册到Eureka中,由其他微服务去间接调用,但是Nacos的Config是每个微服务都可以直接配置调用。