项目中遇到的一些问题总结(十)

news2025/1/10 15:34:58

nacos保护阈值

Nacos 中的保护阈值(Protection Threshold)是用来保护服务实例的一种机制。当某个服务实例出现故障或异常时,服务注册中心 Nacos 会通过心跳检测等方式将其从服务列表中移除,以避免客户端继续向其发送请求。但是,如果移除的实例过多,会导致服务的可用性降低,因此 Nacos 引入了保护阈值机制来避免这种情况的发生。

保护阈值的作用是当服务实例的健康状态低于指定的阈值时,Nacos 将不再将其从服务列表中移除。例如,如果将保护阈值设置为 0.5,当服务实例的健康状态低于 50% 时,Nacos 将不再移除该实例。这样可以保证即使出现故障或异常,仍然能够保留一定数量的服务实例,从而提高服务的可用性。

需要注意的是,保护阈值并不能解决服务实例的故障或异常问题,它只是一种机制来避免过度移除服务实例的问题。因此,在实际使用过程中,还需要针对服务实例的故障或异常问题进行监控和修复,以确保服务的正常运行。

总结:伤兵也要上

@SentinelResource

@SentinelResource是Sentinel的注解式API,用于标识被限流、降级等资源,并提供相应的处理方法。该注解的常用参数如下:

  • value:资源名称,也就是Sentinel控制台中配置限流规则时需要填写的「资源名」。必填参数。
  • entryType:流量控制针对的端点(请求来源),可选值包括 IN(入口流量)、OUT(出口流量,仅对 Dubbo 服务提供者生效)、DEFAULT(不区分入口和出口),默认值是 DEFAULT。
  • blockHandler:流控降级处理逻辑,即在触发限流规则后的处理方法,方法需要与被保护的方法在同一个类中。方法签名必须与原方法相同或兼容。
  • fallback:服务熔断降级处理逻辑,即在发生异常时的处理方法,方法需要与被保护的方法在同一个类中。该方法参数类型、返回值类型都需要与原方法相同或兼容。
  • defaultFallback:通用熔断降级处理逻辑,该方法没有参数,返回类型需要与原方法相同或兼容。如果参数设置为 true,则所有 Sential 配置的 fallback 都失效,转而执行该默认 fallback。如果方法是静态方法或者构造函数,或者同时配置了 fallback 和 defaultFallback,则忽略 defaultFallback 配置。

此外,该注解还有很多其它参数,比如 metrics 单位、出错信息等等。需要根据不同场景配置适当的参数。

blockHandlerClass 参数

@SentinelResource 注解中,blockHandlerClass 是用于设置「处理 BlockException 的函数」所在类的 Class 对象。它可以为 BlockException 异常设置一个专属的处理函数,并且该处理函数必须定义在 blockHandlerClass 指定的类中,方法签名必须与原方法相同或兼容。

例如,如果在资源限流或熔断时,希望使用一个专门的处理方法进行处理,可以将 blockHandlerClass 设置为一个专用的处理 BlockException 的类,同时该类中定义一个和被保护方法参数和返回值类型相同的处理方法(例如 public User fallbackHandleForGetUser(String id){...}),然后在 @SentinelResource 中设置 blockHandlerClassblockHandler,如下所示:

@SentinelResource(
    value = "getUser",
    blockHandlerClass = CustomBlockHandler.class,
    blockHandler = "fallbackHandleForGetUser"
)
@GetMapping("/user")
public User getUser(@RequestParam("id") String id) throws Exception {
    // 这里是被限流保护的业务逻辑
    // ...
}

在 CustomBlockHandler 这个类中,定义如下处理方法:

public class CustomBlockHandler {
    public static User fallbackHandleForGetUser(String id){
        // 处理被限流时的逻辑
    }
}

这样当 getUser 方法被 Sentinel 限流时,就会自动执行 CustomBlockHandler.fallbackHandleForGetUser 方法来进行处理。

Sentinel 流控规则和熔断降级区别

Sentinel 中流控规则和熔断降级规则的主要区别在于:

  1. 流控规则的目的是控制流量的大小而不是服务的质量,主要是针对于请求量过大时对流量限制,防止系统崩溃;而熔断降级规则的目的是保证服务质量,防止服务访问出现异常时导致依赖服务致命故障。
  2. 流控规则是通过限制请求量来保证系统不会被资源耗尽导致服务不可用,而熔断降级规则是在发生异常或错误时,限制对该服务的调用,针对可能会引起系统崩溃的异常进行处理。
  3. 流控规则是通过限制实时请求处理的 QPS/并发线程数/响应时间等信息进行限制的,而熔断降级规则则是通过统计失败率或异常比率来触发熔断,然后在一段时间内关闭或返回异常数据。
  4. 流控是一种主动防御机制,当 QPS 达到设定的阈值时主动拦截流量进行处理;而熔断则是在系统出现错误或者异常情况时进行自动切换,降级或关闭服务。
  5. 流控一般应用于高峰期,发生短时间请求量剧增的情况,而熔断则一般应用于长时间或大量访问失败的情况。

综上所述,流控规则和熔断降级规则是两种不同的机制,但其都是为了保障服务的可靠性而设定的。

在实际应用中,应根据不同的业务场景来选择合适的规则来进行限制和熔断,以保证应用的稳定性和可靠性。

@PreAuthorize() 注解

@PreAuthorize 注解是 Spring Security 中的一种基于表达式的访问控制注解,用于描述方法调用所需的权限。@PreAuthorize() 的参数可以是一个字符串,也可以是一个 SpEL 表达式,用于指定权限要求。下面将分别介绍 @PreAuthorize 注解的参数及用法,并给出详细的示例代码。

首先,需要在 Spring Security 的配置类中开启表达式支持:

@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // ...
}

1. 使用角色作为表达式

可以使用 ROLE_ 前缀来代表角色,例如 ROLE_ADMIN 可以写作 hasRole('ADMIN')。示例代码如下:

@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/api/users")
public List<User> getAllUsers() {
    return userService.getAllUsers();
}

上面的示例代码代表只有具有 ADMIN 角色的用户能够获取所有用户的信息。

2. 使用权限作为表达式

可以使用 hasAuthority()hasAnyAuthority() 函数来代表权限,例如 VIEW_USER 可以写作 hasAuthority('VIEW_USER')。示例代码如下:

@PreAuthorize("hasAuthority('VIEW_USER')")
@GetMapping("/api/users/{id}")
public User getUserById(@PathVariable Long id) {
    return userService.getUserById(id);
}

上面的示例代码代表只有具有 VIEW_USER 权限的用户能够获取指定用户的信息。

3. 使用表达式组合

可以使用逻辑运算符 andornot 等对表达式进行组合。示例代码如下:

@PreAuthorize("hasRole('ADMIN') and hasAuthority('EDIT_USER')")
@PutMapping("/api/users/{username}")
public void updateUser(@PathVariable String username, @RequestBody User user) {
    userService.updateUser(username, user);
}

上面的示例代码代表只有同时具有 ADMIN 角色和 EDIT_USER 权限的用户才有权限更新指定用户的信息。

4. 使用 ${} 访问 Spring 数据库值

可以使用 ${} 访问 Spring 的环境变量或者数据库中的值。示例代码如下:

@PreAuthorize("hasRole('${admin.role}')")
@GetMapping("/api/users")
public List<User> getAllUsers() {
    return userService.getAllUsers();
}

上面的示例代码代表只有具有 ${admin.role} 角色的用户能够获取所有用户的信息。

5. 使用其他参数

可以使用其他参数,例如 authenticationfilterObject 等来编写更加复杂的表达式。示例代码如下:

@PreAuthorize("#user.username == authentication.principal.username")
@PutMapping("/api/users/{username}")
public void updateUser(@PathVariable String username, @RequestBody User user) {
    userService.updateUser(username, user);
}

上面的示例代码代表只有修改自己的信息的用户才有权限执行这个方法。其中 #user 表示方法传入的 user 参数,authentication.principal.username 表示当前认证用户的用户名。

Spring Security的执行流程

在这里插入图片描述

1.用户提交用户名、密码被SecurityFilterChain中的UsernamePasswordAuthenticationFilter过滤器获取到,封装为请求Authentication,通常情况下是UsernamePasswordAuthenticationToken这个实现类。

2.然后过滤器将Authentication提交至认证管理器(AuthenticationManager)进行认证

3.认证成功后,AuthenticationManager身份管理器返回一个被填充满了信息的(包括上面提到的权限信息,身份信息,细节信息,但密码通常会被移除)Authentication实例。

4.SecurityContextHolder安全上下文容器将第3步填充了信息的Authentication,通过SecurityContextHolder.getContext().setAuthentication(…)方法,设置到其中。

5.可以看出AuthenticationManager接口(认证管理器)是认证相关的核心接口,也是发起认证的出发点,它的实现类为ProviderManager。而Spring Security支持多种认证方式,因此ProviderManager维护着一个List列表,存放多种认证方式,最终实际的认证工作是由AuthenticationProvider完成的。咱们知道web表单的对应的AuthenticationProvider实现类为DaoAuthenticationProvider,它的内部又维护着一个UserDetailsService负责UserDetails的获取。最终AuthenticationProvider将UserDetails填充至Authentication。

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

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

相关文章

在Linux中为Simulink添加ROS自定义消息类型

在Linux中为Simulink添加ROS自定义消息类型 基于Matlab/Simulink的ROS自定义消息类型的添加方法 ROS与Simulink联合仿真(三):自定义Message 1、下载 ROS Toolbox Interface for ROS Custom Messages 将 roscustommsg.mlpkginstall 文件放入 MATLAB 工作空间 双击 roscustommsg…

Nature -- 人类首个 “泛基因组”旨在编目人类遗传多样性

在人类基因组项目发布第一个人类基因组草图的20多年后,研究人员发布了人类“泛基因组”草图——这预示着一种新的参考基因组的出现,它能捕获到更多的人类遗传多样性信息。 泛基因组变异图由两个元素组成:序列图&#xff0c;其ode表示定向DNA链&#xff0c;双向边表示连通性关系…

学系统集成项目管理工程师(中项)系列25_计算机网络知识

1. OSI七层协议 1.1. 物理层 1.1.1. RS232、V.35、RJ-45、FDDI 1.2. 数据链路层 1.2.1. 【21上选17】 1.2.2. IEEE802.3/.2、HDLC、PPP、ATM 1.3. 网络层 1.3.1. IP、ICMP、IGMP、IPX、ARP 1.3.2. 路由选择 1.3.2.1. 【20下选17】 1.4. 传输层 1.4.1. TCP、UDP、SPX…

越小越好: Q8-Chat,在英特尔至强 CPU 上体验高效的生成式 AI

大语言模型 (LLM) 正在席卷整个机器学习世界。得益于其 transformer 架构&#xff0c;LLM 拥有从大量非结构化数据 (如文本、图像、视频或音频) 中学习的不可思议的能力。它们在 多种任务类型 上表现非常出色&#xff0c;无论是文本分类之类的抽取任务 (extractive task) 还是文…

又一批令人惊艳的 AI 工具,诞生了!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 自 ChatGPT 发布以后&#xff0c;AIGC 行业的热度也一直在持续发酵。几个月过去了&#xff0c;对比之前&#xff0c;各类 AI 工具的热度不减反增&#xff0c;各行各业的人都早开始拥抱 AIG…

SAP工具箱 MR22自定义BAPI

点击蓝字 关注我们 一 前言 标准事务代码MR22 通过调整金额影响物料的成本价,前台界面中单个凭证中允许输入多行物料, 但是对应的BAPI函数仅支持输入单行物料 BAPI_MATVAL_DEBIT_CREDIT 正常库存BAPI_SALESORDSTCK_DEBIT_CREDIT 销售订单库存 这种情况 婶可忍叔不可忍 (感谢用户…

Python 闭包装饰器和多任务--闭包,装饰器,进程,线程

1.闭包案例 在函数嵌套的前提下&#xff0c;内部函数使用了外部函数的变量&#xff0c;并且外部函数返回了内部函数&#xff0c;我们把这个使用外部函数变量的内部函数称为闭包. 外层函数: config_name(),外层函数中的变量是 name 内层函数: inner(),inner()使用了外层函数的变…

34从零开始学Java之构造方法都有哪些特性?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前面的几篇文章中&#xff0c;壹哥给大家介绍了不少关于方法的内容&#xff0c;这些内容是我们日常…

zabbix监控之javasnmp自定义监控

1、客户端开启 java jmxremote 远程监控功能 上传 tomcat 软件包到 /opt 目录中 cd /opt tar zxvf apache-tomcat-9.0.16.tar.gz mv apache-tomcat-9.0.16 /usr/local/tomcat #配置 java jmxremote 远程监控功能 vim /usr/local/tomcat/bin/catalina.sh ...... #位置在 cygw…

嵌入式音视频开发面试过程遇到的问题!

前言&#xff1a; 今天继续给大家分享音视频面试过程会被常问到的一些问题&#xff01; 面试的具体题目&#xff1a; 1、说一下播放器的设计过程&#xff1a; 这里的话主要分以下几步完成&#xff1a; 开启一个线程进行解封装操作 , 这包括&#xff1a;读取音频、视频的压缩数据…

chatgpt赋能Python-python_ps图片

Python PS图片的SEO指南 Python在数字图像处理中广泛应用。其中&#xff0c;Photoshop文件&#xff08;psd&#xff09;是一种常见的图像文件格式。但是&#xff0c;如何在搜索引擎上优化Python PS图片并提高其排名仍然是一个挑战。 什么是Python PS图片&#xff1f; Python…

数据结构和算法基础学习1

​​​​​​​ 网址第01周b--1.1数据结构研究_哔哩哔哩_bilibili

学C的第十九天【实用调试技巧:1. 调试;2. Windows环境调试介绍;3. 一些调试的实例;4. 一些调试的实例】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a;学C的第十八天【指针初阶&#xff1a;5. 指针和数组、6. 二级指针、7. 指针数组&#xff1b;初识结构体&#xff1a;1. 结构体的声明、2. 结构体成员的访问、3. 结构体传参&#xff1b…

java中的栈、堆、方法区

栈&#xff08;stack&#xff09; Java栈与堆不同每一个线程都有一个stack&#xff0c;栈的区域非常小&#xff0c;大概只有1M左右&#xff0c;但是存储速度非常快&#xff0c;所以我们把快速执行的任务存储在stack。 特点&#xff1a;自动分配&#xff0c;连续空间&#xff0…

如何从文档中提取结构化数据?parsio.io

parsio.io 产品名&#xff1a;Parsio电子邮件解析器 技术&#xff1a;采用人工智能技术的电子邮件解析器。 支持多种格式&#xff1a; 可以解析电子邮件和附件中的数据&#xff0c;包括PDF、HTML、XLSX&#xff08;Excel&#xff09;、CSV、DOCX、XML、TXT等格式。 提取模版&am…

FANUC机器人作为EtherCAT通信从站的相关配置方法

FANUC机器人作为EtherCAT通信从站的相关配置方法 基本介绍: 前提条件: 硬件部分: 机器人需要使用EtherCAT从站板卡 A20B-8101-0821。使用带屏蔽层的网线连接板卡和PLC的网口。 本例中使用的网络接口为EC-IN(CD38Y) 软件部分: 机器人需要安装软件:1A05B-2600-J743! Et…

NLog使用

Nlog 日志组件的使用 这个博文关注 .net framework下的NLog日志组件的使用. 在项目中需要将日志写到日志文件中, 另外一些重要信息要显示在界面上. 使用 NLog 可以轻松做到这点.NLog wiki 页面 nuget 安装两个主要组件 NLogNLog.Windows.Forms 使用总结 日志文件 layout 按照 j…

程序员的 Windows 工具箱「GitHub 热点速览」

作者&#xff1a;HelloGitHub-小鱼干 如何精简 Windows 并快速配置开发环境呢&#xff1f;本周特推的 winutil 是一个程序员的 Windows 工具箱&#xff0c;它提供了开发工具的一键安装以及减少系统垃圾的功能&#xff0c;一切为了简洁、高效。同样高效的还有 C 日志库 spdlog&a…

对讲机亚音是什么?有什么作用?

一、对讲机亚音是什么&#xff1f; 对讲机亚音又被称为亚音频。是比音频信号频率更低的一种特殊信号&#xff0c;目的在于检查信号是否合法&#xff0c;是否对信号进行响应。 亚音是一种特殊的振幅信号&#xff0c;人耳无法感觉也无法听闻到这些信号&#xff0c;所以对于无线…

mac mongodb 安装及配置

1.官网下载地址&#xff1a;MongoDB: The Developer Data Platform | MongoDB 2.下载好压缩包&#xff0c;解压后放在想放的地方&#xff0c;例如&#xff1a; /Users/xiaokeai/environment/mongodb-macos-x86_64-5.0.18 3.打开终端后&#xff0c;在家目录中打开.bash_profil…