Spring Boot/Cloud集成Sentinel实现黑白名单(授权)控制及初始本地化规则 | Spring Cloud 25
创始人
2025-05-30 08:59:42
0

一、前言

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

在前面我们通过以下章节对Sentinel有了基础的了解:

Sentinel:分布式系统的流量防卫兵 | Spring Cloud 19

Sentinel:资源与规则定义 | Spring Cloud 20

Sentinel:原理深入浅出解读 | Spring Cloud 21

Sentinel:流量控制规则定义详解 | Spring Cloud 22

Spring Boot/Cloud集成Sentinel实现流量控制 | Spring Cloud 23

Spring Boot/Cloud集成Sentinel实现流量控制 (二) | Spring Cloud 24

现在开始我们正式学习SentinelSpring Boot/Cloud中的集成使用。

书接上回,本节进行对以下部分进行集成演示:

  • 黑白名单(授权)控制
    • 初始化过本地规则
    • 自定义来源信息
  • 资源清理

知识点,当应用的 ApplicationContext 中存在对应的Bean的类型时,会进行自动化设置

存在Bean的类型操作作用
UrlCleanerWebCallbackManager.setUrlCleaner(urlCleaner)资源清理(比如将满足 /foo/:idURL 都归到 /foo/* 资源下)
UrlBlockHandlerWebCallbackManager.setUrlBlockHandler(urlBlockHandler)自定义限流处理逻辑
RequestOriginParserWebCallbackManager.setRequestOriginParser(requestOriginParser)设置来源信息

二、黑白名单控制

2.1 黑白名单控制简介

很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。

来源访问控制根据资源的请求来源(origin)限制资源是否通过:

  • 若配置白名单则只有请求来源位于白名单内时才可通过
  • 若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过

调用方信息通过 ContextUtil.enter(resourceName, origin) 方法中的 origin 参数传入。

2.2 规则配置

来源访问控制规则(AuthorityRule)非常简单,主要有以下配置项:

  • resource:资源名,即限流规则的作用对象。
  • limitApp:对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB
  • strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式。

三、项目集成 Sentinel

以上篇文章的sentinel-nacos-consumer模块为基础进行扩展。

在这里插入图片描述

3.1 初始化本地规则

Sentinel 提供多样化的 SPI 接口用于提供扩展的能力。

其中包括:初始化过程扩展,供 InitFunc SPI接口,添加自定义的一些初始化逻辑,如动态规则源注册。

3.1.1 本地文件数据源

com/gm/sentinel_nacos_consumer/init/FileDataSourceInit.java

import com.alibaba.csp.sentinel.datasource.FileRefreshableDataSource;
import com.alibaba.csp.sentinel.datasource.FileWritableDataSource;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.WritableDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.csp.sentinel.transport.util.WritableDataSourceRegistry;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.net.URLDecoder;
import java.util.List;public class FileDataSourceInit implements InitFunc {@Overridepublic void init() throws Exception {loadAuthorityRule();loadFlowRule();}private  String encodeJson(T t) {return JSON.toJSONString(t);}private void loadAuthorityRule() throws Exception {ClassLoader classLoader = getClass().getClassLoader();String authorityRulePath = URLDecoder.decode(classLoader.getResource("rules/AuthorityRule.json").getFile(), "UTF-8");ReadableDataSource> ds = new FileRefreshableDataSource<>(authorityRulePath, source -> JSON.parseObject(source, new TypeReference>() {}));// 将可读数据源注册至 AuthorityRuleManager.AuthorityRuleManager.register2Property(ds.getProperty());WritableDataSource> wds = new FileWritableDataSource<>(authorityRulePath, this::encodeJson);// 将可写数据源注册至 transport 模块的 WritableDataSourceRegistry 中.// 这样收到控制台推送的规则时,Sentinel 会先更新到内存,然后将规则写入到文件中.WritableDataSourceRegistry.registerAuthorityDataSource(wds);}private void loadFlowRule() throws Exception {ClassLoader classLoader = getClass().getClassLoader();String flowRulePath = URLDecoder.decode(classLoader.getResource("rules/FlowRule.json").getFile(), "UTF-8");ReadableDataSource> ds = new FileRefreshableDataSource<>(flowRulePath, source -> JSON.parseObject(source, new TypeReference>() {}));// 将可读数据源注册至 FlowRuleManager.FlowRuleManager.register2Property(ds.getProperty());WritableDataSource> wds = new FileWritableDataSource<>(flowRulePath, this::encodeJson);// 将可写数据源注册至 transport 模块的 WritableDataSourceRegistry 中.// 这样收到控制台推送的规则时,Sentinel 会先更新到内存,然后将规则写入到文件中.WritableDataSourceRegistry.registerFlowDataSource(wds);}
}

本地文件数据源会定时轮询文件的变更,读取规则。这样我们既可以在应用本地直接修改文件来更新规则,也可以通过 Sentinel 控制台推送规则。以本地文件数据源为例,推送过程如下图所示:
在这里插入图片描述
首先 Sentinel 控制台通过 API 将规则推送至客户端并更新到内存中,接着注册的写数据源会将新的规则保存到本地的文件中。使用 pull 模式的数据源时一般不需要对 Sentinel 控制台进行改造。

这种实现方法好处是简单,不引入新的依赖,坏处是无法保证监控数据的一致性。

3.3.2 通过 SPI 注册 InitFunc 实现类

src/main/resources/META-INF/services/com.alibaba.csp.sentinel.init.InitFunc

com.gm.sentinel_nacos_consumer.init.FileDataSourceInit

3.2 自定义设置来源信息

利用上文提到的知识点,自定义RequestOriginParser实现设置来源信息。

com/gm/sentinel_nacos_consumer/component/CustomRequestOriginParser.java

import com.alibaba.cloud.commons.lang.StringUtils;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;@Component
public class CustomRequestOriginParser implements RequestOriginParser {@Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {String origin = httpServletRequest.getParameter("origin");if (!StringUtils.isEmpty(origin)) {return origin;}return httpServletRequest.getRemoteHost();}
}

3.3 编辑本地规则文件

授权规则src/main/resources/rules/AuthorityRule.json

[{"resource":"message","limitApp":"127.0.0.1","strategy":0
}]

流量控制规则src/main/resources/rules/FlowRule.json

[]

3.4 资源清理配置

利用上文提到的知识点,自定义UrlCleaner满足如:/urlCleaner/:idURL 都归到 /urlCleaner/* 资源下。

com/gm/sentinel_nacos_consumer/component/CustomUrlCleaner.java

import com.alibaba.cloud.commons.lang.StringUtils;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.UrlCleaner;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;@Slf4j
@Component
public class CustomUrlCleaner implements UrlCleaner {@Value("#{'${url-cleaner.list}'.split(',')}")private List list;@Overridepublic String clean(String s) {log.info(s);if (StringUtils.isBlank(s)) {return s;}for (String url : list) {if (s.startsWith(url)) {return url + "*";}}return s;}
}

com/gm/sentinel_nacos_consumer/controller/ConsumerController.java新增用于测试资源清理的请求:

    /*** 测试UrlCleaner自定义实现URL归类** @param value* @return*/@RequestMapping(value = "say/{value}", method = RequestMethod.GET)public String say(@PathVariable String value) {return value;}/*** 测试UrlCleaner自定义实现URL归类** @param value* @return*/@RequestMapping(value = "clear/{value}", method = RequestMethod.GET)public String clear(@PathVariable String value) {return value;}

调整配置文件src/main/resources/bootstrap.yml新增要处理的资源清理请求:

url-cleaner:list: /clean/,/say/

3.5 黑白名单控制效果测试

先访问:http://127.0.0.1:3000/sayHelloDirect 测试功能是否正常访问:
在这里插入图片描述
再次访问:http://192.168.1.82:3000/sayHelloDirect 验证黑白名单控制是否生效:

在这里插入图片描述
通过Sentinel 控制台将原本地规则文件设置的限制模式strategy由白名单切换至黑名单:

在这里插入图片描述

再次访问:http://192.168.1.82:3000/sayHelloDirect 验证黑白名单控制是否生效:

在这里插入图片描述

验证 Sentinel 控制台推送推着是否已保存至本地文件:

在这里插入图片描述

注意文件目录为:target/classes/rules/AuthorityRule.json

3.6 资源清理效果测试

先访问:http://127.0.0.1:3000/say/hello 测试功能是否正常访问:

在这里插入图片描述
通过Sentinel 控制台资源清理效果:

在这里插入图片描述

相关内容

热门资讯

康养、温泉、非遗过端午!绿美广... 粽叶飘香时,龙舟竞渡忙。2025年端午假期如约而至,广州乡村与近郊景区已备好丰盛的文旅大餐。从森林康...
Vuex由浅入深详细讲解 目录前言一,理解Vuex1.1 Vuex是什么1.2 Vuex概述1.3 Vuex统一...
conv2d.中 groups... 1. groups 改变的是每个filter中通道数; 使用groups前后ÿ...
3D Slicer学习记录(4... 前记 OpenIGTLink是一个开源网络通信接口,专门为图像引导干预而设计。它的目标是在手术室(o...
武夷山:九曲溪竹筏漂流,丹霞地... 武夷山九曲溪竹筏漂流是一场融合自然与人文的奇妙之旅。乘坐古朴竹筏顺流而下,可饱览鬼斧神工的丹霞地貌,...
04 - 进程参数编程 ---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中&...
蓝桥杯备赛 [day01]|p... 目录 0 题目类型  1 迷宫问题 图解 2 乘积尾零 算法解释 用Python处理大数 用C...
STM32:TIM定时器输出比... 一、输出比较简介 1、输出比较 OC(Output Comapre)输出...
武汉白酒批发厂家直销(本地低价... 各位酒友们,近在琢磨着搞点儿武汉白酒本地批发的事儿,这不,就看到了“武汉白酒批发厂家直销(本地低价货...
丰收季的一场原粮溯源之旅:解码... 导读:以“粮”心筑基石,以匠心酿美酒,古井贡酒正引领着中国白酒品质升级的新征程。 五月的亳州,金黄的...
10 分钟出餐!鲜香虾仁蛋炒饭 忙碌的早晨或疲惫的夜晚,想吃顿热乎又美味的主食?这道 10 分钟就能出锅的鲜香虾仁蛋炒饭绝对是救星!...
链舟共济,万家安康 链舟共济,万家安康 🍙 糯米裹住夏的香 🌿 艾叶染绿好时光 🚣 链家的舟,载着星与愿 💫 划向万家灯...
原创 不... 标题:不小心拆了婆婆的快递,原来她买这个 在这个快节奏的时代,我们常常忙于奔波,忽略了生活中的小确...
什么???“粽子”英语也叫 d... 今天是端午节, 在这里,小E祝大家 端午节安康! 说起端午节,我们都知道,是为了纪念伟大的爱国诗人屈...
原创 黄... 黄瓜,这个夏日的清新使者,以其清脆爽口、营养价值高而广受欢迎。然而,在享用黄瓜时,我们往往只满足于拍...
原创 同... 标题:同样都是平民料理,为什么北京和四川的差距那么大? 在美食的海洋中,平民料理以其亲民的价格和地...
端午特别策划|粽情一夏 做这个... 闻到空气里的粽叶香了吗? 没错,端午节又双叒叕来了! 这个纪念屈原的节日,除了吃粽子、挂艾草, 最燃...
零失败!5 分钟搞定的酸奶水果... 想吃甜品又怕麻烦?这款零失败的 5 分钟酸奶水果捞绝对是你的救星!无需复杂的烹饪技巧,也不用漫长的等...
甘肃庆阳面塑:非遗技巧指间藏 ... 央广网兰州5月31日消息(记者李红军 通讯员刘新艳)曾经,甘肃庆阳面塑是农家灶台上祭祀祈福的朴素供品...
原创 蒸... “一天一苹果,医生远离我”,这话大家肯定都听过。苹果可是咱生活里再常见不过的水果了,可你知道吗,蒸苹...