Nacos

简介

Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台,旨在为微服务架构提供高可用、高性能的解决方案。其核心功能包括服务注册与发现、动态配置管理、服务健康监测、动态 DNS 服务等,广泛应用于云原生和分布式系统场景

官网

https://nacos.io/zh-cn/docs/what-is-nacos.html

配置管理

核心概念

  • Namespace(命名空间):命名空间用于隔离不同的配置集。它允许在同一个 Nacos 集群中将不同的环境(如开发、测试、生产)或者不同的业务线的配置进行隔离。(默认提供了一个 public 命名空间)
  • Group(组):配置组是用于将多个相关的配置项进行分类管理的逻辑分组机制。每个配置项可以属于不同的组,以便于配置管理。
  • Data ID:Data ID 是一个唯一的配置标识符,通常与具体的应用程序相关。通过 Data ID,Nacos 知道如何获取特定应用的某个具体配置。
  • Config Listener(配置监听器):配置监听器用于让客户端实时监听 Nacos 配置中心中的配置变化,可以自动感知配置的更新并做出相应的处理。

推送和监听

推送方法
  • Nacos 控制台(推荐)
  • 应用程序 SDK。Nacos 支持和 Spring Boot 快速整合,可以参考 官方文档
  • Open API
监听方法

1.基于SDK

String serverAddr = "{serverAddr}";
String dataId = "{dataId}";
String group = "{group}";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
configService.addListener(dataId, group, new Listener() {@Overridepublic void receiveConfigInfo(String configInfo) {System.out.println("recieve1:" + configInfo);}@Overridepublic Executor getExecutor() {return null;}
});// 测试让主线程不退出,因为订阅配置是守护线程,主线程退出守护线程就会退出。 正式代码中无需下面代码
while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
}

2.基于注解

@Controller
@RequestMapping("config")
public class ConfigController {@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)private boolean useLocalCache;@RequestMapping(value = "/get", method = GET)@ResponseBodypublic boolean get() {return useLocalCache;}
}

实战(动态ip黑名单过滤)

  1. 下载nacos
    https://nacos.io/download/release-history/
  2. 启动nacos
    在startup.sh目录下执行
 sh startup.sh -m standalone
  1. 添加配置
    访问:http://127.0.0.1:8848/nacos ,默认用户名和密码都是 nacos
    请添加图片描述

请添加图片描述
4.引入依赖

<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.12</version>
</dependency>

注意:版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。
添加配置

# 配置中心
nacos:config:server-addr: 127.0.0.1:8848  # nacos 地址bootstrap:enable: true  # 预加载data-id: mianshiya # 控制台填写的 Data IDgroup: DEFAULT_GROUP # 控制台填写的 grouptype: yaml  # 选择的文件格式auto-refresh: true # 开启自动刷新

5.利用布隆过滤器创建黑名单过滤工具类

@Slf4j
public class BlackIpUtils {private static BitMapBloomFilter bloomFilter;// 判断 ip 是否在黑名单内public static boolean isBlackIp(String ip) {return bloomFilter.contains(ip);}// 重建 ip 黑名单public static void rebuildBlackIp(String configInfo) {if (StrUtil.isBlank(configInfo)) {configInfo = "{}";}// 解析 yaml 文件Yaml yaml = new Yaml();Map map = yaml.loadAs(configInfo, Map.class);// 获取 ip 黑名单List<String> blackIpList = (List<String>) map.get("blackIpList");// 加锁防止并发synchronized (BlackIpUtils.class) {if (CollectionUtil.isNotEmpty(blackIpList)) {// 注意构造参数的设置BitMapBloomFilter bitMapBloomFilter = new BitMapBloomFilter(958506);for (String ip : blackIpList) {bitMapBloomFilter.add(ip);}bloomFilter = bitMapBloomFilter;} else {bloomFilter = new BitMapBloomFilter(100);}}}
}

6.创建 Nacos 配置监听类

@Slf4j
@Component
public class NacosListener implements InitializingBean {@NacosInjectedprivate ConfigService configService;@Value("${nacos.config.data-id}")private String dataId;@Value("${nacos.config.group}")private String group;@Overridepublic void afterPropertiesSet() throws Exception {log.info("nacos 监听器启动");String config = configService.getConfigAndSignListener(dataId, group, 3000L, new Listener() {final ThreadFactory threadFactory = new ThreadFactory() {private final AtomicInteger poolNumber = new AtomicInteger(1);@Overridepublic Thread newThread(@NotNull Runnable r) {Thread thread = new Thread(r);thread.setName("refresh-ThreadPool" + poolNumber.getAndIncrement());return thread;}};final ExecutorService executorService = Executors.newFixedThreadPool(1, threadFactory);// 通过线程池异步处理黑名单变化的逻辑@Overridepublic Executor getExecutor() {return executorService;}// 监听后续黑名单变化@Overridepublic void receiveConfigInfo(String configInfo) {log.info("监听到配置信息变化:{}", configInfo);BlackIpUtils.rebuildBlackIp(configInfo);}});// 初始化黑名单BlackIpUtils.rebuildBlackIp(config);}
}

7.利用过滤器创建黑名单过滤器

@WebFilter(urlPatterns = "/*", filterName = "blackIpFilter")
public class BlackIpFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {String ipAddress = NetUtils.getIpAddress((HttpServletRequest) servletRequest);if (BlackIpUtils.isBlackIp(ipAddress)) {servletResponse.setContentType("text/json;charset=UTF-8");servletResponse.getWriter().write("{\"errorCode\":\"-1\",\"errorMsg\":\"黑名单IP,禁止访问\"}");return;}filterChain.doFilter(servletRequest, servletResponse);}}
注意在启动类上加上 @ServletComponentScan

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win11系统下qq远程不能控制对方电脑(鼠标点不动)的解决方法

在被控制的电脑上&#xff0c;打开控制面板&#xff0c;点击系统和安全 点击更改用户账户控制设置 下拉用户控制设置至最低&#xff0c;从不通知&#xff0c;点击确定 返回控制面板系统与安全&#xff0c;带年纪允许远程访问 点击允许远程协助连接这台计算机 重启电脑 再次打…

猎豹移动营收连续三季增长,AI驱动的猎豹成绩单怎么分析?

3月26日&#xff0c;猎豹移动发布2024年Q4及全年财报&#xff0c;这份财报我们到底该该怎么分析呢&#xff1f; 首先&#xff0c;整体财务表现稳健&#xff0c;营收连续三季增长。从财务数据来看&#xff0c;猎豹移动整体表现稳健。2024年Q4及全年财报显示&#xff0c;总收入达…

函数:链式访问

链式访问是将函数的返回值当作回传值就是链式访问 这是原本的字符数回传代码 int main() {int len strlen("seig heil");printf("%d", len);return 0; } 运行结果&#xff1a; 这是链式访问的代码&#xff1a; int main() {printf("%d\n",s…

C++ map容器总结

map基本概念 简介&#xff1a; map中所有元素都是pair pair中第一个元素为key&#xff08;键值&#xff09;&#xff0c;起到索引作用&#xff0c;第二个元素为value&#xff08;实值&#xff09; 所有元素都会根据元素的键值自动排序 本质&#xff1a; map/multimap属于关…

23种设计模式-代理(Proxy)设计模式

代理设计模式 &#x1f6a9;什么是代理设计模式&#xff1f;&#x1f6a9;代理设计模式的特点&#x1f6a9;代理设计模式的结构&#x1f6a9;代理设计模式的优缺点&#x1f6a9;代理设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是代理设计模式…

UE4学习笔记 FPS游戏制作29 更换武器时更换武器的图标

文章目录 制作物体图标UI添加获取武器图标的方法使用事件分发器&#xff0c;通知UI要换枪定义事件分发器调用事件分发器注册事件分发器 制作物体图标UI 在Fpp-UI上添加一个图片&#xff0c;改名为五weaponIcon&#xff0c;勾选SizeToContent,锚点放在右下角&#xff0c;对齐改…

Chrome 开发环境快速屏蔽 CORS 跨域限制!

Chrome 开发环境快速屏蔽 CORS 跨域限制【详细教程】 ❓ 为什么需要临时屏蔽 CORS&#xff1f; 在前后端开发过程中&#xff0c;我们经常会遇到 跨域请求被浏览器拦截 的问题。例如&#xff0c;你在 http://localhost:3000 调用 https://api.example.com 时&#xff0c;可能会…

【RAG综述系列】之 RAG 相关背景和基本原理

系列文章&#xff1a; 【RAG综述系列】之 RAG 相关背景和基本原理 【RAG综述系列】之 RAG 特点与挑战以及方法与评估 【RAG综述系列】之 RAG 先进方法与综合评估 【RAG综述系列】之 RAG 应用和未来方向 正文&#xff1a; 检索增强生成&#xff08;Retrieval-Augmented Gen…

德昂观点:如何看待MicroStrategy改名为Strategy?

2025年2月&#xff0c;纳斯达克上市公司MicroStrategy&#xff08;股票代码&#xff1a;MSTR&#xff09;宣布更名为“Strategy”&#xff0c;并同步启用全新品牌标识与橙色主视觉。这不仅是品牌形象的更新&#xff0c;更是公司战略方向的明确宣示。德昂作为MSTR中国区BI合作伙…

计算机视觉算法实战——手术导航:技术、应用与未来

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 1. 手术导航中的计算机视觉&#xff1a;领域介绍 计算机视觉在手术导航领域的应用代表了现代医学与人工智…

Java全栈面试宝典:内存模型与Spring设计模式深度解析

目录 一、JVM内存模型进阶篇 &#x1f525; 问题13&#xff1a;堆与栈的六大维度对比 内存结构对比图 核心差异对照表 &#x1f525; 问题14&#xff1a;三区联动内存模型解析 代码内存分配图解 三区协作流程图 二、Spring设计模式全景解析 &#x1f31f; Spring框架七…

FALL靶场通关攻略

1&#xff0c;下载好靶机后打开&#xff0c;通过kali扫描靶机ip和端口&#xff0c;得到靶机ip为192.168.50.144 2&#xff0c;扫描目录 3&#xff0c;访问靶机 4&#xff0c;访问扫描到的test.php,得到缺少GET请求参数的提示 5&#xff0c;使用FUZZ来扫出参数为file 6&#xff…

《C++11:bind绑定器与function包装器》

CSTL中提供了bind1绑定器&#xff0c;通常与函数对象一起使用。 函数对象是重载了operator&#xff08;&#xff09;函数的对象。 将二元函数对象operator&#xff08;&#xff09;的第一个参数绑定为固定的x来构造一元函数对象。返回绑定了第一个参数的函数对象。 将二元函数…

JS 防抖与节流

防抖 核心思想&#xff1a;延迟执行&#xff0c;只有在事件触发的频率降低到一定程度后才会执行&#xff0c;而且如果事件持续触发&#xff0c;之前地所有执行都会被取消。 有的操作是高频触发的&#xff0c;但是其实只需要一次触发。比如短时间内多次缩放页面resize&#xff0…

【C/C++算法】从浅到深学习--- 简单模拟算法(图文兼备 + 源码详解)

绪论&#xff1a;冲击蓝桥杯一起加油&#xff01;&#xff01; 每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本篇是一些简单的模拟算法&#xff0c;其中模拟的本质就是就是根据题目意思进行代码的…

​​解锁 JavaScript DOM:节点操作的核心方法与最佳实践

引言 在当今动态化的 Web 世界中&#xff0c;用户早已不满足于静态的网页展示&#xff0c;而是期待流畅的交互体验——点击按钮弹出菜单、滚动页面加载数据、实时搜索过滤内容……这些功能的背后&#xff0c;都离不开 ​JavaScript DOM&#xff08;文档对象模型&#xff09;操…

Android 12系统源码_系统启动(二)Zygote进程

前言 Zygote&#xff08;意为“受精卵”&#xff09;是 Android 系统中的一个核心进程&#xff0c;负责 孵化&#xff08;fork&#xff09;应用进程&#xff0c;以优化应用启动速度和内存占用。它是 Android 系统启动后第一个由 init 进程启动的 Java 进程&#xff0c;后续所有…

精华贴分享|从不同的交易理论来理解头肩形态,殊途同归

本文来源于量化小论坛策略分享会板块精华帖&#xff0c;作者为孙小迪&#xff0c;发布于2025年2月17日。 以下为精华帖正文&#xff1a; 01 前言 学习了一段时间交易后&#xff0c;我发现在几百年的历史中&#xff0c;不同门派的交易理论对同一种市场特征的称呼不一样&#x…

C++智能指针万字详细讲解(包含智能指针的模拟实现)

在笔试&#xff0c;面试中智能指针经常出现&#xff0c;如果你对智能指针的作用&#xff0c;原理&#xff0c;用法不了解&#xff0c;那么可以看看这篇博客讲解&#xff0c;此外本博客还简单模拟实现了各种指针&#xff0c;在本篇的最后还应对面试题对智能指针的知识点进行了拓…

学习threejs,使用多面体(IcosahedronGeometry、TetrahedronGeometry、OctahedronGeometry等)

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.PolyhedronGeometry …