**
nacos 用java代码启动集群
**
一路遇到不少坑 而且网上也没有这种相关代码 当然这种方式也没有直接运行nacos简单
1,首先配置文件复制一份拷贝到application.yml上
注意 搭建集群 server.port要放在application.properties文件里 因为先加载yml文件 端口可能会被覆盖
2,即使你用java代码方式启动nacos, nacos会自动在本地创建nacos文件存放日志 集群相关信息 默认路径:${user.home}/nacos 如图 这是nacos自动创建的
启动项目后会出现以下错误
原因是自动创建的nacos/conf文件里没有集群配置信息 这里我们添加几个节点即可 添加后重启项目我们发现可以启动 但是紧接着我们启动第二个nacos时 会出现以下错误
我们查看详细日志 可以看到是这个jraft出现了错误
我们打开log文件夹下的alipay-jraft.logw
可以看到这个log文件处于不可访问状态
nacos集群节点肯定不能共用log信息的 不然排错发现问题就混淆了
可以发现他们读取到同一个文件夹了 这证实了我们的猜想 因为我们没有设置任何和nacos有关的路径参数 即使我们在nacos下建立一个nacos1 项目也不知道
通过一步步debug源码分析 我们发现在这里的得到了nacos的磁盘位置 如果我们不设置nacos.home参数 系统使用默认路径
说明我们可以自定义nacos根目录 由于System.getProperties是获取系统参数 虽然可以加-D指定nacos根目录 这样做的话每一次启动都要增加参数 比较麻烦 并且要制定全路径 可以考虑写在配置文件中 -D的参数我们可以通过System.getProperties获取
static {
String property = System.getProperty("nacos.home");
String nacosHome = System.getProperty("user.home") + "/nacos/";
// 获取 -D参数 为空表示使用配置文件里的路径(也是自定义的)
// nacos.home=nacos8848
if (StringUtils.isNotBlank(property)) {
nacosHome = nacosHome + property;
} else {
Properties properties = new Properties();
InputStream resourceAsStream = JeecgNacosApplication.class.getResourceAsStream("/application.properties");
try {
properties.load(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
nacosHome = nacosHome + properties.getProperty("nacos.home");
}
System.setProperty("nacos.home", nacosHome);
}
public static void main(String[] args) {
SpringApplication.run(JeecgNacosApplication.class, args);
}
当然做这些之前我们都要在以上路径里添加集群文件 把cluster.conf添加到nacos项目路径下
/nacos/nacos8848/conf /nacos/nacos8849/conf /nacos/nacos8850/conf
搭建成功 主要是文件不能共享这个问题困扰了我很久 debug一步一步往下走后就发现了问题 发现了问题所在 基本也就上解决问题了