Sentinel授权规则与规则持久化

news2024/11/26 17:35:35

🌳🌳🌳🌳🌳🌳🌳

学习授权规则前,先想想SpringCloud Gateway的黑白名单,请求过网关,gateway会去鉴权。但如果有人把微服务信息泄露出去了呢?此时微服务直接暴露在外,绕过网关直接访问微服务,又该如何解决?

文章目录

  • 1、授权规则
  • 2、授权规则的代码实现逻辑
  • 3、自定义异常结果
  • 4、规则持久化
  • 5、push方式的实现

1、授权规则

授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。

  • 白名单:来源(origin)在白名单内的调用者允许访问
  • 黑名单:来源(origin)在黑名单内的调用者不允许访问

在这里插入图片描述
例如,我们限定只允许从网关来的请求访问order-service,那么流控应用中就填写网关的名称。

在这里插入图片描述

2、授权规则的代码实现逻辑

Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的。

public interface RequestOriginParser {
    /**
      * 从请求request对象中获取origin,获取方式自定义
     */    
     String parseOrigin(HttpServletRequest request);
}

但默认情况下,该方法都返回default,即不能分辨是来自网关的请求还是直接调用的请求。在微服务order中重写下这个方法的逻辑:

@Component
public class HeaderOriginParser implements RequestOriginParser {
    @Override    
    public String parseOrigin(HttpServletRequest request) {
    	String origin = request.getHeader("origin");        
    	if(StringUtils.isEmpty(origin)){            
    		return "blank";    //origin为空,则返回blank    
		}       
		return origin;    //否则返回origin
	}
}

现在从网关和直接访问的请求头中都不带origin,无法分辨,但如果我让网关过来的请求头中带上origin,就可以分辨了。想加请求头,当然是网关的AddRequestHeader过滤器。

在gateway服务中,利用网关的过滤器添加名为gateway的origin头:

spring:
  cloud:    
  	gateway:      
  		default-filters:        
  			- AddRequestHeader=origin,gateway # 添加名为origin的请求头,值为gateway

重启order和gateway。在Sentinel配置授权规则:

在这里插入图片描述

此时我用8088端口直接访问order服务,绕过网关:

在这里插入图片描述

再通过网关访问:

在这里插入图片描述

总结:Sentinel授权规则就是对请求的来源做一个限制。实现逻辑是请求头,而请求头可以用SpringCloud Gateway的过滤器来添加。

3、自定义异常结果

默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方,而直接抛出异常信息,对用户很不友好,因此需要自定义异常的返回结果。

如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口:

public interface BlockExceptionHandler {    
	/**     
	* 处理请求被限流、降级、授权拦截时抛出的异常:BlockException     
	*/   
	void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception;
}

而BlockException包含很多个子类,分别对应不同的场景:

在这里插入图片描述

接下来在调用方order-service中定义类,实现BlockExceptionHandler接口,并借助instanceof来

@Component
public class SentinelBlockHandler implements BlockExceptionHandler {
    @Override    
    public void handle(
                HttpServletRequest httpServletRequest,            
    			HttpServletResponse httpServletResponse, BlockException e) throws Exception {       
    String msg = "未知异常";        
    int status = 429;        
    if (e instanceof FlowException) {           
    	msg = "请求被限流了!";        
    } else if (e instanceof DegradeException) {            
    	msg = "请求被降级了!";         
    } else if (e instanceof ParamFlowException) {
        msg = "热点参数限流!";        
    } else if (e instanceof AuthorityException) {
        msg = "请求没有权限!";            
        status = 401;         
    }        
    httpServletResponse.setContentType("application/json;charset=utf-8");        
    httpServletResponse.setStatus(status);        
    httpServletResponse.getWriter().println("{\"message\": \"" + msg + "\", \"status\": " + status + "}");    
    }
}

添加一个流控规则,看下异常是否是自定义的:

在这里插入图片描述

4、规则持久化

之前定义的限流规则,在服务重启后就被清空了,这是因为这些规则存于内存中。Sentinel的控制台规则管理有三种模式:

  • 原始模式
  • pull模式
  • push模式

原始模式: 控制台配置的规则直接推送到Sentinel客户端,也就是我们的应用服务。然后保存在内存中,微服务重启则规则丢失

在这里插入图片描述

pull模式:控制台将配置的规则推送到Sentinel客户端,而客户端会将配置规则保存在本地文件或数据库中。以后会定时去本地文件或数据库中查询,更新本地规则。

在这里插入图片描述

很明显,这种方式有时效性问题,数据持久化到本地文件,当规则更新,定时轮询到新规则前,规则缓存里还是旧的。

push模式:控制台将配置规则推送到远程配置中心,例如Nacos。Sentinel客户端去监听Nacos,获取配置变更的推送消息后完成本地配置更新。

在这里插入图片描述
简单说就是:

- 原始模式:保存在内存
- pull模式:保存在本地文件或数据库,定时去读取
- push模式:保存在nacos,监听变更实时更新

三种方式的对比:

在这里插入图片描述

5、push方式的实现

接下来实现修改OrderService,让其监听Nacos中的sentinel规则配置。

  • 在order-service中引入sentinel监听nacos的依赖
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
  • 在order-service中的application.yml文件配置nacos地址及监听的配置信息:
spring:
  cloud:
    sentinel:
      datasource:
        flow:
          nacos:
            server-addr: localhost:8848 # nacos地址
            dataId: orderservice-flow-rules
            groupId: SENTINEL_GROUP
            rule-type: flow # 还可以是:degrade、authority、param-flow
        #如果还有其他类型的限流,下面继续和flow同级写
        degrade:
          nacos:
            server-addr: localhost:8848 # nacos地址
            dataId: orderservice-degrade-rules
            groupId: SENTINEL_GROUP
            rule-type: degrade

SentinelDashboard默认不支持nacos的持久化,需要修改源码。关于这个操作,跳另一篇【Sentinel规则持久化到nacos的实现(源码修改)】

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

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

相关文章

输出函数print

print("hello world") # 可以输出数字 print(1111) print(2222) # 可以输出字符串 print(helloworld) print("helloworld") # 可以输出运算符的表达式 print(56) # 将数据输出文件中&#xff0c;注意点&#xff1a;1.所指定的盘符存在&#xff0c;2.使…

「苹果安卓」手机搜狗输入法怎么调整字体大小及键盘高度?

手机搜狗输入法怎么调整字体大小及键盘高度&#xff1f; 1、在手机上准备输入文字&#xff0c;调起使用的搜狗输入法手机键盘&#xff1b; 2、点击搜狗输入法键盘左侧的图标&#xff0c;进入更多功能管理&#xff1b; 3、在搜狗输入法更多功能管理内找到定制工具栏&#xff0c…

uni-app中全局设置页面背景颜色

在uni-app中设置背景颜色&#xff0c;想象中应该很简单&#xff0c;其实里面也还是有点小坑的&#xff0c;我们来一起看一下。 方法一&#xff1a;pages.json globalStyle 中设置 backgroundColor 结果&#xff1a;未生效 猜测可能是颜色不能用别名&#xff0c;换十六进制试一…

讯为RK3568开发板入门之-tftpnfs的配置

基础条件 VMware虚拟机 Ubuntu18.04 【网络配置陈桥接模式】 RK3568开发板【我是用讯为的RK3568】 网线连接路由器或者和电脑直连 配置TFTP和NFS的作用 使用tftp和nfs网络挂载可以很方便的进行软件的调试&#xff0c;挂载成功后只要把Ubuntu下编译好的文件程序放到挂载的目录…

有名管道(FIFO)的学习笔记

文章目录 有名管道介绍有名管道的使用创建 注意事项 有名管道介绍 有名管道的使用 创建 命令&#xff0c; mkfifo name函数&#xff0c;int mkfifo(const char *pathname, mode_t mode); 设置错误号&#xff1b; 向管道中写数据&#x1f447;&#xff1a; 从管道读数据&am…

数据库新闻速递 SingleStore Kai for MongoDB有以下6个关键特性, MONGODB 也疯狂

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到3群&#xff08;共…

Hive查询性能优化——物化视图(materialized view)

1. 背景&#xff1a; 在一次大表查询中&#xff0c;查询速度非常慢,插叙时间以分钟为单位&#xff0c;而生产需求要达到10s以内。造成这个问题的原因有多种&#xff0c;性能调优的方式也有多种&#xff0c;这里记录一下其中一种方案&#xff0c;采用物化视图&#xff08;Mater…

[JAVAee]synchronized关键字

目录 1.synchronized的特性 ①互斥性 ②可重入性 2.synchronized的使用示例 ①修饰普通方法 ②修饰静态方法 ③修饰代码块 1.synchronized的特性 ①互斥性 互斥性,就像是给门上锁了一样. 当A线程使用了被synchronized修饰的代码块并对其上锁,其他线程(B线程,C线程)想要使…

从零开始学习自动驾驶路径规划-环境配置

从零开始学习自动驾驶路径规划-环境配置 前面&#xff0c;每个人遇到的问题不一样&#xff0c;这里记录了配置步骤和目前遇到的问题&#xff0c;会持续更新报错解决方法。配置时有报错请认真看报错经验 环境配置步骤&#xff08;18.04和20.04都可以&#xff0c;有些问题没遇到…

流媒体视频融合平台EasyCVR更新版本后,首页无法打开的原因排查与解决

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;包括&#xff1a;NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。平台具有强大的数据接入、处理及分发能力&#xff0c;可在复杂的网络环境中&#xff0c…

精通自动化,Pytest自动化测试框架-fixture用例的前后置(实现)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试用例实现前后…

软件项目验收测试报告-软件项目验收流程

目录 一、什么是项目验收&#xff1f; 二、软件项目验收材料的准备 三、软件项目验收&#xff0c;按照验收的流程&#xff0c;可分为验收准备、初步验收、最终验收和项目交接四个部分。 对甲方而言&#xff0c;项目验收是正式接受项目成果&#xff0c;将项目从建设转为运营。…

视频增强技术-去噪

本文介绍了关于视频增强技术的相关方法包括传统方法和基于深度学习的方法&#xff0c;并给出了他们的对比实验结果&#xff0c;最后对它们简单的做了总结&#xff0c;文中有一些图片和总结来自于网上其他博主的文章&#xff0c;已在文中标记并给出了相关的原文链接&#xff0c;…

JAVA基础-集合(List与Map)

目录 引言 一&#xff0c;Collection集合 1.1,List接口 1.1.1&#xff0c;ArrayList 1.1.1.1&#xff0c;ArrayList的add&#xff08;&#xff09;添加方法 1.1.1.2&#xff0c;ArrayList的remove&#xff08;&#xff09;删除方法 1.1.1.3&#xff0c;ArrayList的contai…

机器学习之主成分分析(Principal Component Analysis)

1 主成分分析介绍 1.1 什么是主成分分析 主成分分析&#xff08;Principal Component Analysis&#xff09;简称PCA&#xff0c;是一个非监督学习的机器学习算法&#xff0c;主要用于数据的降维&#xff0c;对于高维数据&#xff0c;通过降维&#xff0c;可以发现更便于人类理…

(css)自定义el-dialog对话框添加背景图片

(css)自定义el-dialog对话框添加背景图片 效果&#xff1a; // 文件管理对话框 /deep/ .el-dialog {background: transparent;background-image: url("../assets/image/file-upload-background.png");background-size: 100% 100%; } // 头部 /deep/ .el-dialog__titl…

2024考研408-操作系统 第五章-输入输出IO管理 学习笔记

文章目录 一、I/O管理概述1.1、I/O设备的概念与分类1.1.1、什么是I/O设备&#xff1f;1.1.2、I/O设备的分类&#xff1a;按照使用特性1.1.2、I/O设备的分类&#xff1a;按传输速率分类1.1.3、I/O设备的分类&#xff1a;按照信息交换的单位分类知识点回顾与重要考点 1.2、I/O控制…

【Linux】udp客户端windows版以及Tcp服务器的实现

windows版客户端更适合大多数人~ 文章目录 一. udp客户端windows版二.Tcp服务器的实现总结 一、udp客户端windows版 首先我们将上一篇文章中实现的udp大型聊天室的代码进行修改&#xff0c;注意我们只修改服务端代码将代码修改的很简单就好&#xff0c;因为我们只是做一个如何…

spring-事务

spring-事务 事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列&#xff0c;这些操作要么全部执行,要么全部不执行&#xff0c;是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成&#xff0c;它具有ACID特性。 为了在spring中…

UE特效案例 —— 骷髅爆点

一&#xff0c;环境配置 创建默认地形Landscape&#xff0c;如给地形上材质需确定比例&#xff1b;添加环境主光源DirectionalLight&#xff0c;设置相应的强度和颜色&#xff1b;添加天光反射SkyLight&#xff0c;用于天空反射&#xff1b;添加指数级高度雾ExponentialHeightF…