Nacos使用(中):Java项目和Spring项目使用Nacos

news2024/11/26 21:35:21

Nacos使用(上):Nacos安装
Nacos使用(中):Java项目和Spring项目使用Nacos
Nacos使用(下):SpringBoot和SpringCloud项目中使用Nacos

3.使用Nacos

3.1 java SDK

引入jar包

<dependency>
  <groupId>com.alibaba.nacos</groupId>
  <artifactId>nacos-client</artifactId>
  <version>2.2.0</version>
</dependency>
<dependency>
  <groupId>com.alibaba.nacos</groupId>
  <artifactId>nacos-common</artifactId>
  <version>2.2.0</version>
</dependency>

3.1.1 配置中心

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 java.io.IOException;
import java.util.Properties;
import java.util.concurrent.Executor;

/**
 * @author 专治八阿哥的孟老师
 */
public class ConfigExample {
    public static void main(String[] args) throws NacosException, InterruptedException, IOException {
        String serverAddr = "localhost";
        String dataId = "application-dev.properties";
        String group = "DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);

        properties.put(PropertyKeyConst.USERNAME, "nacos");
        properties.put(PropertyKeyConst.PASSWORD, "nacos");
        properties.put(PropertyKeyConst.NAMESPACE, "dev");
        // 查询配置
        ConfigService configService = NacosFactory.createConfigService(properties);
        String content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);
        // 监听配置变化
        configService.addListener(dataId, group, new Listener() {
            @Override
            public void receiveConfigInfo(String configInfo) {
                System.out.println("recieve:" + configInfo);
            }

            @Override
            public Executor getExecutor() {
                return null;
            }
        });
        // 发布配置,注意会覆盖原来的配置
        System.out.println("发布新配置");
        boolean isPublishOk = configService.publishConfig(dataId, group, "content");
        System.out.println(isPublishOk);

        Thread.sleep(3000);
        // 查询新的配置
        System.out.println("查询新配置");
        content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);
        // 删除配置
        System.out.println("删除配置");
        boolean isRemoveOk = configService.removeConfig(dataId, group);
        System.out.println(isRemoveOk);
        Thread.sleep(3000);
        System.out.println("再次查询新配置");
        content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);
        Thread.sleep(300000);
    }
}

3.1.2 服务治理

服务注册

import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;

import java.io.IOException;
import java.util.Properties;

/**
 * @author 专治八阿哥的孟老师
 */
public class AppRegister {
    public static void main(String[] args) throws NacosException, IOException, InterruptedException {
        Properties properties = new Properties();
        // 多个地址使用逗号隔开
        properties.setProperty(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
        properties.setProperty(PropertyKeyConst.NAMESPACE, "dev");
        properties.put(PropertyKeyConst.USERNAME, "nacos");
        properties.put(PropertyKeyConst.PASSWORD, "nacos");
        NamingService naming = NamingFactory.createNamingService(properties);
        // 注册到注册中心, 默认groupName=DEFAULT_GROUP
        naming.registerInstance("app1", "11.11.11.11", 8888);
        naming.registerInstance("app2", "2.2.2.2", 9999);
        Thread.sleep(1000);
        System.out.println(naming.getAllInstances("app1"));
        System.out.println(naming.getAllInstances("app2"));
        System.in.read();
    }
}

在这里插入图片描述

服务订阅

import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.listener.AbstractEventListener;
import com.alibaba.nacos.api.naming.listener.Event;
import com.alibaba.nacos.api.naming.listener.NamingEvent;

import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author 专治八阿哥的孟老师
 */
public class AppSubscribe {
    public static void main(String[] args) throws NacosException, InterruptedException, IOException {
        Properties properties = new Properties();
        properties.setProperty(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
        properties.setProperty(PropertyKeyConst.NAMESPACE, "dev");
        properties.put(PropertyKeyConst.USERNAME, "nacos");
        properties.put(PropertyKeyConst.PASSWORD, "nacos");
        NamingService naming = NamingFactory.createNamingService(properties);
        naming.registerInstance("app1", "55.55.55.55", 8080);
        System.out.println("instances after register: " + naming.getAllInstances("app1"));

        Executor executor =
            new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), runnable -> {
                Thread thread = new Thread(runnable);
                thread.setName("test-thread");
                return thread;
            });

        // 订阅服务名为app1, 当app1的实例数量发生变化, 会收到回调
        naming.subscribe("app1", new AbstractEventListener() {
            @Override
            public Executor getExecutor() {
                return executor;
            }

            @Override
            public void onEvent(Event event) {
                System.out.println("serviceName: " + ((NamingEvent)event).getServiceName());
                System.out.println("instances from event: " + ((NamingEvent)event).getInstances());
            }
        });

        System.in.read();
    }
}

在这里插入图片描述

3.2 Spring SDK

在这里插入图片描述

引入jar包

<dependency>
  <groupId>com.alibaba.nacos</groupId>
  <artifactId>nacos-spring-context</artifactId>
  <version>1.1.1</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.13.RELEASE</version>
</dependency>

spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

    <context:component-scan base-package="config"/>
</beans>

application.properties

nacos.server-addr=127.0.0.1:8848
nacos.namespace=dev
nacos.username=nacos
nacos.password=nacos

配置类

package config;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import com.alibaba.nacos.api.annotation.NacosProperties;
import com.alibaba.nacos.spring.context.annotation.EnableNacos;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;

/**
 * @author 专治八阿哥的孟老师
 */
@Configuration
@PropertySource("classpath:application.properties")
@EnableNacos(
    globalProperties = @NacosProperties(serverAddr = "${nacos.server-addr}", username = "${nacos.username}", password = "${nacos.password}"))
//读取指定配置文件
@NacosPropertySource(dataId = "example.properties", groupId = "DEFAULT_GROUP", autoRefreshed = true)
public class NacosConfiguration {

}

配置中心和服务治理

package config;

import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.springframework.stereotype.Component;

import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.listener.AbstractEventListener;
import com.alibaba.nacos.api.naming.listener.Event;
import com.alibaba.nacos.api.naming.listener.NamingEvent;

/**
 * @author 专治八阿哥的孟老师
 */
@Component
public class TestBean {
    // 读取配置文件中的属性
    @NacosValue(value = "${test.config}", autoRefreshed = true)
    private String config;
    // 配置中心
    @NacosInjected
    private ConfigService configService;
    // 服务订阅和发布
    @NacosInjected
    private NamingService namingService;

    public void test() {
        System.out.println(config);
    }

    public void publish() throws NacosException {
        System.out.println("发布新配置");
        boolean isPublishOk = configService.publishConfig("example.properties", "DEFAULT_GROUP", "test.config=efg");
    }

    public void service() throws NacosException {
        namingService.registerInstance("app1", "55.55.55.55", 8080);
        Executor executor =
            new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), runnable -> {
                Thread thread = new Thread(runnable);
                thread.setName("test-thread");
                return thread;
            });
        // 订阅服务名为app1, 当app1的实例数量发生变化, 会收到回调
        namingService.subscribe("app1", new AbstractEventListener() {
            @Override
            public Executor getExecutor() {
                return executor;
            }

            @Override
            public void onEvent(Event event) {
                System.out.println("serviceName: " + ((NamingEvent)event).getServiceName());
                System.out.println("instances from event: " + ((NamingEvent)event).getInstances());
            }
        });

    }
}

测试类

package config;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author 专治八阿哥的孟老师
 */
public class ConfigTest {
    public static void main(String[] args) throws Exception {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        TestBean bean = context.getBean(TestBean.class);
        // bean.test();
        // bean.publish();
        bean.service();
        System.in.read();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android集成Unity,实现3D看房效果

引子 前几天有人找小编问能不能把3D模型放入到Unity中&#xff0c;再把Unity放入到Android APP中&#xff0c;在APP中实现观看房屋家具的功能&#xff0c;这次小编便来分享一下吧&#xff0c;如果还需要了解Android 集成Unity知识的&#xff0c;可以翻我主页其他文章 演示效果…

为什么关键词优化很重要,以及如何进行网络营销?

随着互联网的发展&#xff0c;越来越多的企业开始将重心放在网络营销上。在网络营销中&#xff0c;关键词优化是一个非常重要的环节。本文一秒推小编将介绍什么是关键词优化&#xff0c;为什么关键词优化很重要&#xff0c;以及如何进行关键词优化。 一、什么是关键词优化&…

性能瓶颈分析及调优

分析流程&#xff1a; 很多情况下压测流量并没有完全进入到后端&#xff08;服务端&#xff09;&#xff0c;在网络接入层&#xff08;云化的架构比如&#xff1a;SLB/WAF/高防IP&#xff0c;甚至是CDN/全站加速等&#xff09;可能就会出现由于各种规格&#xff08;带宽、最大…

人员位置管理,点亮矿山安全之路

矿山作为一个高危行业&#xff0c;安全问题一直备受关注。人员定位置管理是现代矿山安全管理的重要一环&#xff0c;可以帮助企业更好地实现对人员的实时监控和管理。因此&#xff0c;矿山人员位置管理系统对于矿山安全生产和管理非常重要&#xff0c;可以帮助减少安全事故的发…

LeetCode——无重复的最长子串(中等)

题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…

【GAN】pix2pix算法的数据集制作

一、A、B合并代码&#xff08;此代码由官方提供&#xff09; import os import numpy as np import cv2 import argparseparser argparse.ArgumentParser(create image pairs) parser.add_argument(--fold_A, destfold_A, helpinput directory for image A, typestr, default…

ITIL帮助台怎样帮助企业建设IT服务?

大多数企业都是从邮件开始IT支持建设的&#xff0c;随着企业的规模扩大、服务请求的增长&#xff0c;服务质量不可避免出现了急剧的下降。IT支持团队进入消防员模式&#xff0c;他们只能奔波于解决请求&#xff0c;避免服务失败。没有ITIL所定义的流程体系&#xff0c;IT团队失…

实时同步!从MySQL到SelectDB的无缝数据迁移

随着数据分析在业务决策中变得日益重要&#xff0c;数据实时同步和分析成为企业提升竞争力的关键。MySQL 作为广泛使用的关系型数据库&#xff0c;其数据存储丰富&#xff0c;但无法满足大规模数据分析和高并发查询的需求。而 SelectDB 作为一款专为大数据分析设计的分布式数据…

leetcode121. 买卖股票的最佳时机

题目&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易…

【前端】JQ实时显示当前日期、时间、星期

效果图 html <span id"time"></span> JS // 实时显示当前时间 $(document).ready(function () {function showTime() {var today new Date;var y today.getFullYear();var M today.getMonth() 1;var d today.getDate();var w today.getDay();va…

Django报错:SystemCheckError: System check identified some issues解决办法

今天练习django自定义标签时&#xff0c;一开始在APPbook中写了自定义标签book_tags.py 测试成功&#xff0c;之后新建了一个APPblogs&#xff0c;测试在blogs中创建模板使用自定义标签&#xff0c;于是直接把book/templatetags包直接赋值到blogs目录里。在页面里加载自定义标…

与敌人争利,懂得迂直之计

与敌人争利&#xff0c;懂迂直之计 【安志强趣讲《孙子兵法》第25讲】 【原文】 故不知诸侯之谋者&#xff0c;不能豫交&#xff1b;不知山林、险阻、沮泽之形者&#xff0c;不能行军&#xff1b;不用乡导者&#xff0c;不能得地利。 【注释】 豫交&#xff1a;豫&#xff0c;通…

<XILINX> AXI4-Lite(二) Slave接口时序分析

目录 01 axi4_lite_slave写事务代码分析 AWREADY时序控制代码分析 WREADY时序控制代码分析 AWADDR寄存时序代码分析 WDATA寄存时序代码分析 BVALID、BRESP时序控制代码分析 axi4_lite_slave 写事务时序总结 02 axi4_lite_slave读事务代码分析 ARREADY时序、ARADDR寄存控…

虫情监测仪的功能优势有哪些?

虫情监测仪是实时监测虫情的仪器&#xff0c;主要由诱虫装置、害虫灭活装置、落虫分散装置、收集装置、图像采集装置以及农业四情测报平台/智慧农业大数据平台组成&#xff0c;能够实时拍摄虫情照片&#xff0c;并将其上传至平台进行识别统计&#xff0c;以便对虫害的发生进行预…

问题杂谈(三十七)远程调试linux中的Tomcat

前言 之前调试过Docker里面的java程序&#xff0c;但还没试过直接调试tomcat里面的java程序&#xff0c;今儿个来试试 步骤 Tomcat 修改catlina脚本&#xff1a;vi catlina.sh&#xff08;bin目录下&#xff09;找到下面这句&#xff0c;将"localhost:8000"改为”…

FC-TDIO51 HONEYWELL 关于霍尼韦尔过程解决方案

FC-TDIO51 HONEYWELL 关于霍尼韦尔过程解决方案 霍尼韦尔过程解决方案(HPS)宣布推出一款文档和变更管理软件&#xff0c;该软件将帮助其客户的工业控制系统的完整性。Honeywell Trace用自动化解决方案取代了纸质记录和电子表格。通过提供复杂系统交互的单一集成视图&#xff0…

YOLO目标检测——人脸性别识别数据集下载分享

人脸性别识别数据集共同2300图片。在社交媒体分析、广告定向投放、零售业、安防系统以及健康和医疗领域等多个领域都具有广泛的应用潜力。通过准确识别人脸的性别&#xff0c;可以为这些领域提供更精准的数据分析和个性化的服务。 数据集点击下载&#xff1a;YOLO人脸性别识别数…

linux查看某一进程占用内存

1.top -p [pid]&#xff0c;Mem对应的是占用百分比&#xff0c;按q退出 2.cat /proc/[pid]/status,VmRSS对应的就是

openEuler自定制生成ISO

目录 1. 下载镜像2. 挂载镜像3. 安装制作发行版的工具4. 同步光盘文件到制作ISO的目录5. 拷贝已安装rpm6. 查找不存在的rpm&#xff0c;写入no_exist_rpms7. 下载no_exist_rpms.txt中的所有依赖包8. 修改 isolinux.cfg 文件9. 修改自动化安装配置文件10. 制作修改noraml文件11.…

SpringCloud(九)——RabbitMQ简单了解

文章目录 1. 同步通讯与异步通讯2. MQ 介绍3. RabbitMQ运行4. RabbitMQ 模型4.1 五种模型简介4.2 实现基本消息队列4.2.1 消息发布者4.2.2 消息订阅者 5. SpringAMQP5.1 基本队列5.2 工作队列5.3 广播5.4 路由5.5 主题 6. 消息转换器 1. 同步通讯与异步通讯 同步通讯 同步通讯就…