Bootstrap

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";// 指定 clusterName
		String serverAddr= "127.0.0.1:" + 8848;// Nacos 服务ip地址
		String localIpAddress = getLocalIpAddress(true);// 本机内网ip
		String 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 block
				e.printStackTrace();
			}

		}));
		
		//获取指定分组的配置文件
		String dataId = "app_common";
		String group = "init";
		getConfig(serverAddr, dataId, group,clusterName,namesPace);
		//监听定分组的配置文件变更
		executorService.execute(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				try {
					receiveConfigInfo(serverAddr, dataId, group,clusterName,namesPace);
				} catch (NacosException e) {
					// TODO Auto-generated catch block
					e.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); // 指定 clusterName
			ConfigService 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); // 指定 clusterName
			ConfigService configService = NacosFactory.createConfigService(properties);

			configService.addListener(dataId, group, new Listener() {
				@Override
				public Executor getExecutor() {
					return null;
				}

				@Override
				public 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;// 外网IP

		Enumeration<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) {// 外网IP
					if (netip == null) {
						netip = ip.getHostAddress();
					}

				} else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress()
						&& ip.getHostAddress().indexOf(":") == -1) {// 内网IP
					if (localip == null) {
						localip = ip.getHostAddress();
					}
				}
			}
		}
		if (local) {
			return localip;
		}
		return netip;
	}

}


3,运行起来就可以Nacos后台看见注册的服务了

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;