1.概述
上一篇文章SpringCloud源码探析(二)-Nacos注册中心分析了nacos单机版的部署以及SpringBoot整合nacos,nacos不仅仅可以作为注册中心,也可以作为配置中心。本文将在上文的基础上,进行nacos集群的搭建,同时展示nacos作为配置中心的使用。
2.集群搭建与配置管理
2.1 集群搭建
本文主要分析在centos7环境下nacos集群的搭建,官方提供的nacos集群图如下:
它有三个nacos节点,然后一个负载均衡器(SLB)代理三个nacos,通过一个域名暴露对外。本文选择nginx作为负载均衡器,搭建步骤如下:
2.1.1 下载安装包
下载地址如下,根据需要下载指定版本,我这里下载1.4.2版本,
2.1.2 上传下载包到服务器
2.1.3 解压并修改配置
修改conf文件夹下cluster.conf.example文件名为cluster.conf,并添加所要部署集群的三台机器IP和端口号,如下:
由于我这里只有一台机器,因此IP是相同的,端口号不同。
2.1.4 配置数据库信息
配置数据库信息是为了方便数据持久化,更好地保持数据一致性。nacos配置文件也可以配置数据库集群信息,由于本机只部署了一台mysql,进入application.properties文件,添加如下配置:
spring.datasource.platform=mysql
#数据库数量,如果是集群配置,就写集群数量
db.num=1
#数据库连接信息,集群可配置多个
db.url.0=jdbc:mysql://124.223.181.153:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=cl123456
2.1.5 启动nacos集群
进入bin文件夹下,直接运行startup.sh文件,默认是以集群方式启动,分别启动nacos,得到如下信息(启动日志在logs文件夹下start.out文件内):
集群启动成功之后,在nacos的后台管理页面可以查看节点信息:
2.1.6 配置nginx反向代理
在nginx中添加如下配置:
#这里配置nacos集群地址
upstream nacos-cluster {
server 127.0.0.1:8848;
server 127.0.0.1:8849;
server 127.0.0.1:8850;
}
#监听80端口进行转发
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /nacos {
proxy_pass http://nacos-cluster;
}
}
2.1.6 验证代理是否成功
浏览器输入nginx按照的服务器IP+/nacos,出现nacos后台登陆界面,说明代理成功:
2.1.7 springboot服务注册
服务注册时注册ip端口直接填nginx代理的端口,上述是80端口,可直接配置:
spring.cloud.nacos.discovery.server-addr=http://localhost:80
服务注册成功示意图:
2.2 配置管理
nacos作为配置中心,能够对一些数据进行热更新,简单来讲就是将一些可变配置交由nacos管理,在代码里进行一些指定注解配置,当可变配置发生变化时,无需重启服务,配置就能自动生效。
2.2.1 springboot整合nacos配置中心
1.引入配置
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.在配置文件中添加nacos相关配置(bootstrap.properties、application.properties均可)
#服务名称
spring.application.name=orderservice
spring.profiles.active=dev
#nacos配置中心地址
spring.cloud.nacos.server-addr=http://localhost:80
# nacos需要识别配置文件的类型
spring.cloud.nacos.config.file-extension=properties
3.在nacos新增配置
在nacos新增配置,由nacos管理,配置的命名具有一定规则,一个应用可以包含多个配置集,每个配置集都拥有特殊的含义。
配置文件的data ID一般命名规则为:
s p r i n g . c l o u d . n a c o s . c o n f i g . p r e f i x − {spring.cloud.nacos.config.prefix}- spring.cloud.nacos.config.prefix−{spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
prefix:一般是服务名称,比如上述案例中的orderservice;
active:指定激活的配置文件,一般有dev、prod、test等,也就是spring中的spring.profiles.active配置项
extension:配置文件的类型,默认是 properties,可以通过spring.cloud.nacos.config.file-extension配置来指定,nacos识别xml、yaml、txt等。
按照上述规则,在nacos控制台新增的配置文件命名为:orderservice-dev.properties。
4.nacos控制台新建配置
新建成功之后,可以在列表中查看配置:
5.编写测试类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "thread")
public class FreshProperties {
private Integer num;
}
@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private FreshProperties properties;
@GetMapping()
public Integer get() {
return properties.getNum();
}
}
运行结果如下:
修改nacos上的thread.num=100,不用重启服务,再次请求返回100,如下所示:
事实上,还可以通过@RefreshScope注解来直接获取修改的配置,通过将该注解作用在要获取nacos配置的类上,如下所示:
@Slf4j
@RefreshScope
@RestController
@RequestMapping("/order")
public class OrderController {
@Value("${thread.num}")
private Integer threadNum;
@GetMapping()
public Integer get() {
return threadNum;
}
}
3.小结
1.nacos如果要保证高可靠性,生产中还是要使用集群,集群之前一般用nginx作负载均衡;
2.nacos作为配置中心,能够实时推送热点数据到服务中,无需重启服务,但是需要按照指定规则来命名配置。
4.参考文献
1.https://www.bilibili.com/video/BV1LQ4y127n4
2.https://juejin.cn/post/7124953993846980639
5.附录
https://gitee.com/Marinc/nacos.git