在2022年的时候,我为项目组开发了一个运维组件,集成到系统里面,可以管理jar服务的启停,自动升级jar服务,执行sql增量脚本,领导感觉很好用。但是升级运维的工作变简单后,领导们感觉新服务的部署挺麻烦的,能不能搞一个一键部署nginx,nacos,redis,jdk的脚本,于是我又写了一个 一键安装的sh脚本,但是由于centos不维护了,服务器的操作系统版本变得复杂起来,这个sh脚本变得不通用起来,而且啊 linux的sh脚本需要基本的linux知识啊,让我做一个页面话的一键安装工具,目标类似宝塔,,,,,
本文 nacos-clinet 探坑
1. 依赖
首先是依赖
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.2.2</version>
</dependency>
坑来了
由于Nacos Java SDK在2.0版本后引入了gRPC,为了避免用户业务引入的gRPC版本不同导致冲突,使用了shaded技术将部分依赖直接封装进nacos-client中,导致nacos-client较大。 如果用户未自行引入gRPC或确认版本无冲突,希望使用纯净版的nacos-client以减小依赖,可以使用classifier来指定使用纯净版。
于是我把依赖改为
<properties>
<!-- 2.1.2版本以上支持纯净版客户端 -->
<nacos.version>2.2.2</nacos.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
<!-- 指定纯净版SDK -->
<classifier>pure</classifier>
</dependency>
<!-- 使用纯净版时必须要引入同版本nacos-api和nacos-common,否则可能出现运行时找不到类的问题 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-common</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-api</artifactId>
<version>${nacos.version}</version>
</dependency>
</dependencies>
然后发现,项目大了5M,,,,,,,纯净版一点也不纯净
发现引一个 nacos-cleint 项目大了15M,要不使用openApi,使用http请求得了,反正本人也不用几个接口,但是本着探坑的目的,大就大吧,起码兼容性好(有些现场使用的是nacosV1的版本,有些是nacosV2版本)
2.配置接口
因为新版nacos默认没有开启验证,因为客户的不专业,要求nacos必须开启验证,,,,所以密码是必须的
Properties properties = new Properties();
boolean needAuth = false;
if (needAuth) {
//需要认证
properties.put(PropertyKeyConst.USERNAME,"nacos");
properties.put(PropertyKeyConst.PASSWORD, "nacos");
}
properties.put(PropertyKeyConst.NAMESPACE, "public");
properties.put(PropertyKeyConst.SERVER_ADDR, "http://127.0.0.1:8848");
try {
ConfigService configService= NacosFactory.createConfigService(properties);
String content = configService.getConfig("服务id", "DEFAULT_GROUP", 5000);
} catch (NacosException e) {
throw new RuntimeException(e);
}
3.服务相关接口
获取服务信息
//使用Properties 的方式可以自定义命名空间
Properties properties = new Properties();
//这个变量是默认的命名空间,下面那个没用,但是放着以防万一
properties.put(PropertyKeyConst.SystemEnv.ALIBABA_ALIWARE_NAMESPACE, "public");
properties.put(PropertyKeyConst.NAMESPACE, "public");
properties.put(PropertyKeyConst.SERVER_ADDR,"http://127.0.0.1:8848");
boolean needAuth = false;
if (needAuth == 1) {
properties.put(PropertyKeyConst.USERNAME, "nacos");
properties.put(PropertyKeyConst.PASSWORD, "nacos");
}
try {
NamingService namingService = NamingFactory.createNamingService(properties);
//List<Instance> allInstances = naming.getAllInstances("服务名字",组名);
List<Instance> allInstances = naming.getAllInstances("服务名字");
} catch (NacosException e) {
throw new RuntimeException(e);
}
获取所有服务
//使用Properties 的方式可以自定义命名空间
Properties properties = new Properties();
//这个变量是默认的命名空间,下面那个没用,但是放着以防万一
properties.put(PropertyKeyConst.SystemEnv.ALIBABA_ALIWARE_NAMESPACE, "public");
properties.put(PropertyKeyConst.NAMESPACE, "public");
properties.put(PropertyKeyConst.SERVER_ADDR,"http://127.0.0.1:8848");
boolean needAuth = false;
if (needAuth == 1) {
properties.put(PropertyKeyConst.USERNAME, "nacos");
properties.put(PropertyKeyConst.PASSWORD, "nacos");
}
List<Instance> allInstances = new ArrayList<>();
try {
NamingService namingService = NamingFactory.createNamingService(properties);
//查询所有服务
ListView<String> servicesOfServer = namingService.getServicesOfServer(1, 100);
List<String> data = servicesOfServer.getData();
//根据所有服务的名字查询服务信息
for (String serviceNameTemp : data) {
allInstances.addAll(naming.getAllInstances(serviceNameTemp));
}
} catch (NacosException e) {
throw new RuntimeException(e);
}
这里只是简单示例,完整代码就不放出来献丑了
评论区