二、Nacos做配置中心与集群搭建
程序员文章站
2022-03-23 16:24:09
...
一、Nacos作为配置中心
1、基础配置
1、新建一个Module
项目名:cloudalibaba-config-nacos-client3377
2、pom配置
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web + actuator-->
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2、yml配置
需要配置两个yml,Nacos同SpringCloud Config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常运行。springboot中配置文件的加载是存在优先级顺序的,
bootstrap优先级高于application
bootstrap配置:
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册中心地址
config:
server-addr: 192.168.241.135:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
application配置:
spring:
profiles:
active: dev
3、主启动类
@SpringBootApplication
@EnableDiscoveryClient//服务发现
public class NacosClient3377 {
public static void main(String[] args) {
SpringApplication.run(NacosClient3377.class,args);
}
}
4、业务类
@RefreshScope
@RestController
@RequestMapping("config")
public class NacosClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("info")
public String getConfigInfo() {
return configInfo;
}
}
通过Spring Cloud原生注解
@RefreshScope
实现配置自动更新
2、在Nacos中添加配置信息
1、官网说明: https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
2、Nacos中的
dataid
的组成格式与SpringBoot
配置文件中的匹配规则3、说明:之所以需要配置
spring.application.name
,是因为它是构成 Nacos 配置管理dataId
字段的一部分。4、在 Nacos Spring Cloud 中,
dataId
的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix:
spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active:即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当
spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
file-exetension:为配置内容的数据格式,可以通过配置项
spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。5、最后格式
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} # 就是Nacos管理界面配置列表的Data Id项的值
Nacos中新增配置
1、在Nacos界面的配置列表中新建一个配置
2、查看
3、测试
启动测试前先需要查看nacos客户端-配置管理-配置管理栏目下有没有对应的yaml配置文件后再启动
调用接口:http://localhost:3377/config/info,获取到配置中心配置的值
3、分类配置
多环境多项目管理,实际开发中一个系统会准备dev开发环境,test测试环境,prod生产环境
1、命名空间
1、Namespace、Group、Data Id之间的关系
类似package(包名)和类名,最外层的namespace是可以用于区分部署环境的,Group和Data Id逻辑上区分两个目标对象。
2、关系图
3、说明
默认情况NameSpace是public,Group是DEFAULT_GROUP,Cluster是DEFAULT。
Nacos默认的命名空间是public,NameSpace主要用来实现隔离。比如开发有三个环境:开发、测试、生产,我们就可以建三个NameSpace,不同的NameSpace之间是隔离的。
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去。
Service就是微服务,一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。比如说为了容灾,将Service微服务分别部署到北京和武汉的机房,这时就可以给武汉的微服务起一个集群名称(WH),给北京的微服务也起一个集群名称(BJ),还可以让同一个机房的微服务互相调用,以提升性能。
Instance是每一个微服务的实例。
4、分类配置之Data Id方案
指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置
1、默认空间+默认分组+不同的Data Id,新建一个Data Id
2、修改application.yml切换为测试环境配置
spring:
profiles:
# active: dev
active: test
3、访问接口测试
浏览器输入地址:http://localhost:3377/config/info,能正确加载测试环境配置
5、分类配置之Group方案
1、在Nacos上新建一个Group
2、在bootstrap.yml中配置group
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 192.168.241.135:8848 #服务注册中心地址
config:
server-addr: 192.168.241.135:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
group: TEST_GROUP # 分组默认值DEFAULT_GROUP
3、在application.yml中切换为测试环境配置
spring:
profiles:
# active: dev
active: test
4、启动测试
访问接口地址:http://localhost:3377/config/info,能够读取到TESTGROUP组中的配置信息
6、分组配置之Namespace方案
1、新建一个test的命名空间
2、回到服务列表查看
3、配置管理选择test新增一个配置
4、在bootstrap.yml中配置namespace
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 192.168.241.135:8848 #服务注册中心地址
config:
server-addr: 192.168.241.135:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
group: TEST_GROUP # 分组默认值DEFAULT_GROUP
namespace: a175ca82-3270-4406-99ee-310408e40781 # 命名空间默认值public的命名空间ID值
5、启动测试
访问接口地址:http://localhost:3377/config/info,能够读取到test命名空间下TESTGROUP组中的配置信息
六、Nocal集群和持久化配置
1、概述
1、官网说明:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
2、集群部署架构图
因此开源的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面。
http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。
http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。
http://nacos.com:port/openAPI 域名 + VIP模式,可读性好,而且换ip方便,推荐模式。
注:Nacos使用嵌入式数据库实现数据的存储,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性的问题的,为了解决这个问题,
Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
2、Nacos支持三种部署模式
1、单机模式:用于测试和单机试用。
2、集群模式:用于生产环境,确保高可用。
3、多集群模式:用于多数据中心场景。
说明:
单机模式支持MySQL,在0.7版本之前,在单机模式时
nacos
使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
3、derby到mysql切换配置步骤
Nacos默认自带的是嵌入式数据库derby
1、找到nacos-mysql.sql文件
# 进入nacos安装目录下的conf中找到nacos-mysql.sql文件
cd /usr/local/program/nacos/conf
# 登陆mysql
mysql -uroot -p123456
# 新建一个数据库
CREATE DATABASE nacos_config;
# 选中数据库
use nacos_config;
# 执行脚本
source /usr/local/program/nacos/conf/nacos-mysql.sql
# 退出mysql
exit;
2、application.properties中添加mysql数据源的url、用户名和密码
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.241.135:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
3、重启nacos
# 进入bin目录下
cd /usr/local/program/nacos/bin
# 停止nacos
./shutdown.sh
# 启动单机nacos
./startup.sh -m standalone
4、访问nacos
可以看到是个全新的空记录界面,以前是记录进derby,现在是存储进mysql数据库
4、配置集群
说明:linux下启动后默认为集群模式,要通过nginx代理才能进到nacos的登录界面。
1、进入conf目录下查看配置文件
cd /usr/local/program/nacos/conf/
2、复制出cluster.conf
cp cluster.conf.example cluster.conf
3、查看主机的ip地址
hostname -i
4、配置cluster.conf文件,配置3台nacos,端口设置不同
vim cluster.conf
注:ip地址是通过第三步命令查询出来的,保存并退出
5、编辑nacos的启动脚本,使它能够接受不同的启动端
修改传参:
添加端口号:
保存并退出
5、启动nacos集群
# 分别启动8847/8848/8849
./startup.sh -p 8847
./startup.sh -p 8848
./startup.sh -p 8849
6、发现问题(JVM内存溢出)
出现问题:发现只有8847可以访问,其他都不能访问,查看logs下的启动日志(start.out),发现JVM内存溢出。
解决:
1、查看JVM设置
2、调整集群的JVM参数,防止JVM报错
3、重启集群发现一切正常
4、查看集群节点启动数
ps -ef|grep nacos|grep -v grep|wc -l
7、配置nginx作为负载均衡器
1、前提是要安装好nginx
2、进入nginx安装目录conf文件夹
cd /usr/local/nginx/conf
3、修改nginx配置文件nginx.conf
4、进入sbin下启动nginx
./nginx -c /usr/local/nginx/conf/nginx.conf
8、启动成功测试
通过nginx进行转发,实现负载均衡
1、访问地址:http://192.168.241.135:1111/nacos/#/login
2、 新建一个配置进行测试
3、mysql中config_info表中新增一条数据
9、测试将服务注册进集群
修改9002服务提供者的配置
1、修改application.yml配置
server:
port: 9002
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
#server-addr: 192.168.241.135:8848/ #配置Nacos地址
# 换成nginx的1111端口,做集群
server-addr: 192.168.241.135:1111
management:
endpoints:
web:
exposure:
include: '*'
2、启动测试并查看nacos控制台
10、配置流程总结
说明:9002作为微服务提供者,然后一个微服务找到nginx,后面几个集群不管,9002只认1111端口号。再由nginx进行转发(可能是转发到8847、8848、8849),最终的数据都会写入MySQL中。