前言
我们用Nacos当配置中心的时候,上一篇文章中 【Nacos源码之配置管理 五】为什么把配置文件Dump到磁盘中 知道了,所有的配置文件都会Dump到服务器的本地磁盘中, 那么集群模式下:
服务器之间如何彼此感知发现的?
当某一台机器宕机挂掉之后怎么处理的?
如何获取本地Ip
获取服务器列表
服务器列表健康检查
阅读完本文,会带你对上面的问题有个很清晰的认知;
集群模式
我们先集群模式启动,开启调试
集群模式启动
配置集群机器列表;文件 distribution/conf/cluster.conf 中配置所有的机器列表;IP:PORT的形式;例如
执行打包命令
mvn -Prelease-nacos clean install -U -Dmaven.test.skip=true
打包完毕,执行启动脚本
sh distribution/target/nacos-server-{version}/nacos/bin/startup.sh
启动之后就可以进行远程调试了;怎么调试可以参考【Nacos源码之配置管理 一】阅读源码第一步,本地启动Nacos
ServerListService 服务器列表
在看源码之前先说明一下Nacos读取服务器列表的两种方式
方式一:本地读取cluster.conf
每台服务器本地维护一份集群配置文件 cluster.conf
方式二:读取统一配置中心配置文件
ApplicationListener 监听器
ServerListService实现了SpringBoot的扩展类ApplicationListener;并且事件源是WebServerInitializedEvent: 是WebServer初始化的事件;通过WebServerInitializedEvent可以拿到WeServer的实例;通过WeServer.getPort()拿到启动的端口; 关于Spring的事件监听可以看 【Nacos源码之配置管理 二】Nacos中的事件发布与订阅--观察者模式
在ServerListService中就是通过这个获取Server的端口号
这个ServerListService是服务器列表,这里面保存着所有的服务器信息; 那么是如何获取所有服务器信息的呢?;接下来分析源码
初始化方法init
这个初始化的init方法里面做了什么事情呢?
Spring启动时,执行 @PostConstruct 注解的初始化方法;
@Service
public class ServerListService implements ApplicationListener {
@Autowired
private Environment env;
@Autowired
private ServletContext servletContext;
private int port;
@PostConstruct
public void init() {
serverPort = System.getProperty("nacos.server.port", "8848");
String envDomainName = System.getenv("address_server_domain");
if (S