nacos 监听配置文件变动(自动刷新),监听服务变动(权重、元数据等),手动推送服务

2023-11-10

NACOS 配置文件与服务监听

对于启动项目时可以检测的配置文件,修改配置文件时也可进入监听,对于服务监听时,项目启动时注册进nacos可以监听,修改服务时关闭服务时都可以监听,也可以手动推送服务到nacos上。

添加nacos相关的配置文件:

     <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-spring-context</artifactId>
            <version>0.3.6</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>

修改配置文件,链接nacos

nacos上的配置文件名称为:服务名称-dev.yaml
bootstrap.yml


spring:
  application:
    name: 服务名称
  profiles:
    active: dev
  cloud:
    nacos:
       //服务相关
      discovery:
        server-addr: IP:8848
        //注册服务时添加元数据
        metadata:
          sort: 9090
      //配置文件相关
      config:
        server-addr: IP:8848
        file-extension: yaml
        group: DEFAULT_GROUP

编写配置类,监听服务与配置文件

package com.zaz.weifuwu.config;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.annotation.NacosProperties;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.AbstractListener;
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;
import com.alibaba.nacos.spring.context.annotation.discovery.EnableNacosDiscovery;
import io.micrometer.core.instrument.util.JsonUtils;
import jdk.nashorn.internal.ir.annotations.Reference;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.yaml.snakeyaml.Yaml;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

@Configuration
@Slf4j
@EnableNacosDiscovery(globalProperties = @NacosProperties(serverAddr = "IP:8848"))
@Reference
public class NacosConfig implements InitializingBean, DisposableBean {


    private String dataId = "application-dev.yaml";
    private String serverAddr = "IP:8848";
    private String group = "DEFAULT_GROUP";
    private String namespace;
    
    @NacosInjected
    private NamingService namingService;  //服务注册功能的Service
    
    private ConfigService configService;
    public NacosConfig() throws NacosException {
    }

    @PostConstruct
    public void init() {
    }

    @Override
    public void destroy() throws Exception {
        configService.shutDown();
    }
    @Override
    public void afterPropertiesSet() throws Exception {


        //启动配置文件时监听
        Properties properties = new Properties();
        properties.put("serverAddr", serverAddr);
//        properties.put("namespace", namespace);
        ConfigService configService = NacosFactory.createConfigService(properties);
        configService = NacosFactory.createConfigService(properties);

        try {
            //修改配置文件时监听
            configService.addListener(dataId, group, new AbstractListener() {
                @Override
                public void receiveConfigInfo(String configInfo) {
                    Yaml yaml = new Yaml();
                    Map load = yaml.load(configInfo);
                    log.info("监听到最新的配置文件信息:{}", JsonUtils.obj2Json(load));
                    //获取配置文件中的某一项值
                    Integer choose = (Integer) load.get("choose");
                }
            });
        } catch (NacosException e) {
            log.error(ExceptionUtils.getStackTrace(e));
        }

        try {
            //监听服务(启动,修改,关闭都会监听到)
            NamingService namingService = NamingFactory.createNamingService("IP:8848");
            namingService.subscribe("要监听的服务名", "DEFAULT_GROUP", event -> {
                List<Instance> allInstances = null;
                try {
                    //获取所有该服务的列表
                    allInstances = namingService.getAllInstances("要监听的服务名");
                    
                    //如果是要修改某服务便可直接用上面的所有列表即可   如果么有可以新建Instance进行推送
                    //手动推送服务
                    Instance instance=new Instance ();
                    instance.setClusterName("TestCluster");  //集群名称
                    instance.setEnabled(true);   //是否启用
                    instance.setEphemeral(true);  //临时节点/持久化节点, CP(Raft), AP(Distro)
                    instance.setIp("localhost");
                    instance.setPort(8848);
                    instance.setWeight(10);  //1~100
                    Map<String,String > map =new HashMap<>();
                    map.put("post","9090");
                    //添加元数据
                    instance.setMetadata(map);
                    try {
                        //推送到该服务名下
                        namingService.registerInstance("SpringBoot-Nacos",instance);
                    } catch (NacosException e) {
                        e.printStackTrace();
                    }
                    
                    
                } catch (NacosException e) {
                    e.printStackTrace();
                }
            });

        } catch (NacosException e) {
            log.error(e.getMessage(), e);
        }
    }
}

手动注册服务到nacos

    @NacosInjected
    private NamingService namingService;  //服务注册功能的Service
    
    @PostMapping("push")
    public void Push(String name,String ip,Integer post,Integer weight,String ServerName){
        Instance instance=new Instance ();
        instance.setClusterName(name);  //集群名称
        instance.setEnabled(true);   //是否启用
        instance.setEphemeral(true);  //临时节点/持久化节点, CP(Raft), AP(Distro)
        instance.setIp(ip);
        instance.setPort(post);
        instance.setWeight(weight);  //1~100

        try {
            //推送到该服务名下
            namingService.registerInstance("ServerName",instance);
        } catch (NacosException e) {
            e.printStackTrace();
        }
    }

JsonUtils

package com.util;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.Map;

/**
 * @Description json工具类
 */
public class JsonUtils {
	private static Gson gson = new Gson();
	/**
	 * 
	 * @param jsonclass
	 * @param json
	 * @return
	 */
	public static Object json2Obj(Class<Object> jsonclass, String json) {
		Object obj = null;
		obj = gson.fromJson(json, jsonclass);
		return obj;

	}

	public static String obj2Json(Object obj) {

		String jsonStr = gson.toJson(obj);

		return jsonStr;
	}

	public static <T> T json2Obj(String json,Type tp) {

		T obj = gson.fromJson(json, tp);

		return obj;
	}
	
	public static <T> T json2Obj(String json,Class<T> tp) {

		T response = gson.fromJson(json, tp);

		return response;
	}
	
	public static Map<String,String> json2Map(String json) {

		Type tp = new TypeToken<Map<String,String>>() {}.getType();

		return gson.fromJson(json, tp);
	}
	
	public static String ObjectToJson(Object obj){
		 GsonBuilder gb =new GsonBuilder();
		 gb.disableHtmlEscaping();
		 gb.create().toJson(obj);
		 return gb.create().toJson(obj);
	}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nacos 监听配置文件变动(自动刷新),监听服务变动(权重、元数据等),手动推送服务 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • mybatis if-else(写法)

  • Debian GNU/Linux 中以源码方式安装Odoo 14(社区版)

    Odoo是一种流行的开源商务应用程序套件 可帮助公司管理和运营其业务 也可用于在线教学 它包括广泛的应用程序 Debian GNU Linux 是社区版服务器的代表 本文将介绍如何在Debian GNU Linux中以源码方式安装和部署Od
  • 垃圾回收之CMS GC

    一 六个阶段 阶段 1 Initial Mark 初始标记 这个阶段伴随着 STW 暂停 初始标记的目标是标记所有的 根对象 包括根对象直接引用的对象 以及被年轻代中所 有存活对象所引用的对象 老年代单独回收 阶段 2 Concurrent
  • 剑指 Offer 57. 和为s的两个数字(java+python)

    输入一个递增排序的数组和一个数字s 在数组中查找两个数 使得它们的和正好是s 如果有多对数字的和等于s 则输出任意一对即可 示例 1 输入 nums 2 7 11 15 target 9 输出 2 7 或者 7 2 示例 2 输入 nums
  • MyBatis快速入门

    Mybatis概述 Mybatis概念 MyBatis 是一款优秀的持久层框架 用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis 2010年这个项目由apache software foundatio
  • show process cpu

    Router show proc cpu CPU utilization for five seconds 63 50 one minute 58 five minutes 58 PID Runtime ms Invoked uSecs 5
  • NVM在windows下切换node版本

    如果您很忙或者很急 请直接阅读 三 步骤 一 问题背景 生活里偶尔穿梭在大街小巷中 工作中时常并行于多项目任务里 当多个项目并行时 由于创建的时间或人为选择等因素 各个项目里有着差异的node版本 这样我们在不同的项目里需要切换不同版本的N
  • Linux软链接与硬链接区别

    一 背景 链接 是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法 Linux中包括两种链接 硬链接 Hard Link 和软链接 Soft Link 软链接又称为符号链接 Symbolic link 要了解链接 我们首先得了
  • vscode 问题解决:“检测到 #include 错误,请更新 includePath”

    当我们在使用vscode进行编辑代码时 往往会遇到以下警告 这表明 在我们的代码中 无法找到对应的头文件 但问题在于 阅读和编辑代码 需要保证代码的统一性 所以我们需要知道这个头文件到底在哪 我们也需要让vscode通过点击该头文件名就可以
  • EI、Scopus双检索

    会议简介 Brief Introduction 2023年第四届自动化 机械与设计工程国际会议 SAMDE 2023 会议时间 2023年12月8 10日 召开地点 中国 南京 大会官网 www samde org 机械设计制造及其自动化学
  • python第三方库集锦

    环境管理管理 Python 版本和环境的工具 p 非常简单的交互式 python 版本管理工具 pyenv 简单的 Python 版本管理工具 Vex 可以在虚拟环境中执行命令 virtualenv 创建独立 Python 环境的工具 vi
  • Qt : d指针和q指针?

    目录 一 什么是d指针和q指针 1 d指针 2 q 指针 二 d指针和q指针的作用 三 d指针和q指针的使用 demo 一 什么是d指针和q指针 在Qt的源码中 我们看到大量的Q D 和Q P 宏的调用 查看代码时在一定程度上增加了复杂度
  • 阿里云部署 ChatGLM2-6B 与 langchain+ChatGLM

    1 ChatGLM2 6B 部署 更新系统 apt get update 安装git apt get install git lfs git init git lfs install 克隆 ChatGLM2 6B 源码 git clone
  • vite中无法使用require和@无法使用的问题

    1 安装插件 yarn 安装 yarn add D vite plugin require transform npm 安装 npm i vite plugin require transform S 2 在vite中配置一下即可 impo
  • 解决python发送https请求,出现证书错误,及报错提示

    详细报错信息如下 Error Traceback most recent call last File E WebWafUi venv lib site packages urllib3 connectionpool py line 603
  • 2.4G天线匹配设计,不谈原理和规范,直接怼PCB设计

    关注嘉友创科技公众号 各位大虾 说个天线设计的过程 此过程实测性能是官方的参数的80 不需要任何仪器测试的情况下 适合穷逼 买不起仪器 1 确定厂家 确定板厚 2 依据板厚 找生成PCB厂家确定板层分布 厂家不同 很多参数不同 3 确定阻抗
  • 自己实现MediaExtractor(一)

    1 背景 Android很坑 编解码大坑 最近遇到MediaExtractor的坑了 坑1 读PCM音频巨慢 因为Android的实现是一个一个sample读的 坑2 某些手机只能读取到一路视频或音频track 如oppo Find X 个
  • 【MATLAB】命令行窗口乱码问题

    昨天开始重新学习matlab 按着网上教程一直配置 将编码格式改成 UTF 8 查看编码方式可以用slCharacterEncoding 函数 然后在编辑器上面编写内容果然没有发现乱码 但是一旦将编辑器上面的内容在命令行窗口输出就出现乱码的
  • linux常见的基本命令面试题总结

    问题一 绝对路径用什么符号表示 当前目录 上层目录用什么表示 主目录用什么表示 切换目录用什么命令 答案 绝对路径 如 etc init d 当前目录和上层目录 主目录 切换目录 cd问题二 怎么查看当前进程 怎么执行退出 怎么查看当前路径
  • nacos 监听配置文件变动(自动刷新),监听服务变动(权重、元数据等),手动推送服务

    NACOS 配置文件与服务监听 对于启动项目时可以检测的配置文件 修改配置文件时也可进入监听 对于服务监听时 项目启动时注册进nacos可以监听 修改服务时关闭服务时都可以监听 也可以手动推送服务到nacos上 添加nacos相关的配置文件