java集成Nacos服务
1,添加依赖:首先,在你的 Java 项目中,你需要添加 Nacos 客户端 SDK 的依赖
<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.1.1</version></dependency>
2,编写注册代码:接下来,你可以编写 Java 代码来将服务注册到 Nacos 服务注册中心并连接到指定的命名空间
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;/*** Java集成Nacos服务 * Nacos版本 2.1.1* @author YannanGao 20231214*/
public class NacosTest {static ExecutorService executorService = Executors.newFixedThreadPool(1);public static void main(String[] args) throws NacosException, InterruptedException {String clusterName = "DEFAULT";// 指定 clusterNameString serverAddr= "127.0.0.1:" + 8848;// Nacos 服务ip地址String localIpAddress = getLocalIpAddress(true);// 本机内网ipString namesPace="gs-test";//命名空间// 创建连接 Nacos 服务注册中心的配置Properties properties = new Properties();properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);// 指定ip 端口properties.put(PropertyKeyConst.NAMESPACE, namesPace); // 指定命名空间properties.put(PropertyKeyConst.NAMING_LOAD_CACHE_AT_START, "false"); // 用于指定是否在启动时加载缓存。当设置为 true 时,Nacos// 客户端在启动时会从 Nacos// 服务端加载服务实例信息到本地缓存中,以提高后续的查询性能。properties.put(PropertyKeyConst.CLUSTER_NAME, clusterName); // 指定 clusterName// 创建 Nacos 服务注册中心的连接NamingService namingService = NamingFactory.createNamingService(properties);String serviceName = "test-service-java";// 服务名称int httpPort = 80;// 当前项目http端口// 创建服务实例Instance instance = new Instance();instance.setIp(localIpAddress);instance.setPort(httpPort);instance.setServiceName(serviceName);Map<String, String> map = new HashMap<String, String>();map.put("realIp", localIpAddress);map.put("info", "自定义内容");instance.setMetadata(map);// 元数据// 注册服务实例到 Nacos 服务注册中心namingService.registerInstance(serviceName, instance);System.err.println("Nacos 注册成功!");//获取指定服务名的实例列表getAllInstances("hall", namingService);// 创建并注册关闭钩子Runtime.getRuntime().addShutdownHook(new Thread(() -> {System.err.println("监听到程序关闭了");// 关闭Nacos连接try {executorService.shutdown();namingService.deregisterInstance(serviceName, localIpAddress, httpPort, clusterName);System.err.println("Nacos 注销成功!");} catch (NacosException e) {// TODO Auto-generated catch blocke.printStackTrace();}}));//获取指定分组的配置文件String dataId = "app_common";String group = "init";getConfig(serverAddr, dataId, group,clusterName,namesPace);//监听定分组的配置文件变更executorService.execute(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {receiveConfigInfo(serverAddr, dataId, group,clusterName,namesPace);} catch (NacosException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});while (true) {Thread.sleep(1000 * 10);System.err.println("...");}}/*** 获取指定服务名的实例列表* @param serviceName* @param namingService*/public static void getAllInstances(String serviceName,NamingService namingService) {try {// 获取指定服务名的实例列表List<Instance> instances = namingService.getAllInstances(serviceName);// 打印实例的 IP 和端口信息for (Instance instance : instances) {System.out.println(serviceName+" Instance: " + instance.getIp() + ":" + instance.getPort());}} catch (Exception e) {e.printStackTrace();// TODO: handle exception}}/*** 获取配置文件* @param serverAddr* @param dataId* @param group* @param clusterName* @param namesPace*/public static void getConfig(String serverAddr, String dataId, String group,String clusterName,String namesPace) {try {Properties properties = new Properties();properties.put("serverAddr", serverAddr);properties.put(PropertyKeyConst.NAMESPACE, namesPace); // 指定命名空间properties.put(PropertyKeyConst.CLUSTER_NAME, clusterName); // 指定 clusterNameConfigService configService = NacosFactory.createConfigService(properties);String config = configService.getConfig(dataId, group, 5000); // 获取配置文件,5000 表示超时时间,单位为毫秒System.err.println("getConfig Retrieved config: " + config);} catch (Exception e) {e.printStackTrace();// TODO: handle exception}}/*** 监听配置文件更新* @param serverAddr* @param dataId* @param group* @param clusterName* @param namesPace* @throws NacosException*/public static void receiveConfigInfo(String serverAddr, String dataId, String group,String clusterName,String namesPace) throws NacosException {try {Properties properties = new Properties();properties.put("serverAddr", serverAddr);properties.put(PropertyKeyConst.NAMESPACE, namesPace); // 指定命名空间properties.put(PropertyKeyConst.CLUSTER_NAME, clusterName); // 指定 clusterNameConfigService configService = NacosFactory.createConfigService(properties);configService.addListener(dataId, group, new Listener() {@Overridepublic Executor getExecutor() {return null;}@Overridepublic void receiveConfigInfo(String configInfo) {// 处理配置更新的逻辑System.err.println("receiveConfigInfo Received updated config: " + configInfo);}});} catch (Exception e) {e.printStackTrace();// TODO: handle exception}}/*** 获取本机IP**/public static String getLocalIpAddress(boolean local) {String localip = null;// 本地IP,如果没有配置外网IP则返回它String netip = null;// 外网IPEnumeration<NetworkInterface> netInterfaces = null;try {netInterfaces = NetworkInterface.getNetworkInterfaces();} catch (SocketException e) {return null;}InetAddress ip = null;while (netInterfaces.hasMoreElements()) {NetworkInterface ni = netInterfaces.nextElement();Enumeration<InetAddress> address = ni.getInetAddresses();while (address.hasMoreElements()) {ip = address.nextElement();if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 外网IPif (netip == null) {netip = ip.getHostAddress();}} else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress()&& ip.getHostAddress().indexOf(":") == -1) {// 内网IPif (localip == null) {localip = ip.getHostAddress();}}}}if (local) {return localip;}return netip;}}
3,运行起来就可以Nacos后台看见注册的服务了
相关文章:
java集成Nacos服务
1,添加依赖:首先,在你的 Java 项目中,你需要添加 Nacos 客户端 SDK 的依赖 <dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.1.1</ve…...

开源IPad Pro应用IDE:使用SSH远程连接服务器进行云端编程开发
🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…...

ubuntu 自动安装 MKL Intel fortran 编译器 ifort 及完美平替
首先据不完全观察,gfortran 与 openblas是 intel fortran 编译器 ifotr和mkl的非常优秀的平替,openblas连函数名都跟mkl一样,加了一个下划线。 1, 概况 https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-too…...

elementui select中添加新增标签
<el-select v-model"ruleForm.eventType" :placeholder"请选择事件类型,可手动添加" ref"template" clearable visible-change"(v) > visibleChange(v, template)"><el-option v-for"item in eventTypeOp…...

图像截屏公式识别——LaTeX-OCR安装与使用
一、简介 LaTeX-OCR 是一个开源的光学字符识别(OCR)软件,专为 LaTeX 文档提供支持。其主要目的是帮助用户将扫描的文档转换为 LaTeX 编辑器可以使用的可编辑文本,从而方便进行修改、编辑和排版。LaTeX广泛用于科技、数学、工程等…...

LabVIEW与Tektronix示波器实现电源测试自动化
LabVIEW与Tektronix示波器实现电源测试自动化 在现代电子测试与测量领域,自动化测试系统的构建是提高效率和精确度的关键。本案例介绍了如何利用LabVIEW软件结合Tektronix MDO MSO DPO2000/3000/4000系列示波器,开发一个自动化测试项目。该项目旨在自动…...

青少年CTF-Crypto(Morse code/ASCII和凯撒)
FLAG:你这一生到底想干嘛 专研方向: Web安全 ,Md5碰撞 每日emo:不要因为别人都交卷了,就乱选答案 文章目录 1.Morse code2、ASCII和凯撒的约定 1.Morse code 题目提示摩尔斯电码,这个是给的附件 直接用摩尔斯解密&am…...

Vue3-16-【v-model】 表单数据绑定
作用描述 v-model 指令,实现了 表单输入组件的值 与 js 中的变量的值的绑定关系。 当我们在页面上执行输入动作时,js中变量的值也会同步发生变化。表单不仅仅局限于输入框,其他的如 : 单选按钮,复选框,下拉…...
【Flink on k8s】- 12 - Flink kubernetes operator 的高级特性
目录 1、自动伸缩 1.1 工作原理 1.2 Job 要求和限制 1.2.1 要求 1.2.2 限制...

量子芯片技术:未来的计算革命
量子芯片技术:未来的计算革命 一、引言 随着科技的不断发展,人类正在进入一个全新的技术时代,即量子时代。量子芯片技术作为这个时代的重要代表,正逐渐改变我们对计算和信息处理的理解。本文将深入探讨量子芯片技术的基本原理、…...

vaptcha-手势验证码
很外向,上班总想坐老板的位置。 网址:https://www.vaptcha.com/#demo 第一次接触是在大学刚毕业的时候,搞了一半就没搞了。时隔1年多,回来看看。 难点,图片还原,轨迹,canvas校验等。 轨迹的…...

【一种用opencv实现高斯曲线拟合的方法】
背景: 项目中需要实现数据的高斯拟合,进而提取数据中标准差,手头只有opencv库,经过资料查找验证,总结该方法。 基础知识: 1、opencv中solve可以实现对矩阵参数的求解; 2、线的拟合就是对多项…...
find_package 和 find_library的区别
背景 经常看CMakeLists.txt中有find_package和find_library,有时候没留意以为都一样,其实二者差距比较大,下面简单记录一下。 find_package find_package(NAME), 这段代码的本质就是在找一个NAME.cmake这个文件,一般在安装库的…...
socket是如何进行通信的
Socket通信的原理大致分为以下几个步骤: 服务器端建立Socket,开始侦听整个网络中的连接请求。当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。当完成通信后,服务器关闭与…...

STM32-固件打包部署
STM32-固件打包部署 Fang XS.1452512966qq.com STM32固件输出 工程上使用Keil开发STM32软件;在调试过程中,可直接编译下载;例如bootloader和APP,在调试时,可以直接下载2次;但是工程上,需要大…...

微信机器人如何使用?好用吗?好奇
随着微信的使用范围越来越大,所以人一多,管理起来就会遇到很多繁琐的情况需要仍去操作。 比如需要手动一个个通过好友验证,发消息,相同问题一遍遍的回答,消息还容易看漏,回复不过来...... 想着如果有什么可…...
ARMV8 - A64 - 函数调用,内存栈操作
说明 看了下ARM平台上C语言函数调用的反汇编代码,理清楚了其中的内存栈汇编操作,特整理下。本文环境基于:ARMv8-a架构A53核soc,aarch64状态。 预先了解的知识点 内存栈 栈和栈帧的基本概念重点:出栈入栈的单位不是…...

MyBatis 四大核心组件之 ResultSetHandler 源码解析
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…...

docker-compose 单机容器编排
docker-compose 单机容器编排 Dockerfile:先配置好的文件,然后bulid,镜像容器。 docker-compose 既可以基于dockerfile,也可以基于镜像,一键式拉起镜像和容器。 docker-compose 核心就是yml文件,可以定义…...
springboot项目使用Layui作为前端UI的一系列前后端交互的解决方法
背景: 因为比较喜欢Layui,因为多个项目都是从零开始就使用的layui开发的,并且开发过程中借鉴了很多其他项目(如Ruoyi、Pear Admin),因此最终选用大部分Pear Admin的项目中使用的一系列解决方案,…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...