集成OpenFeign和Sentinel实现自定义服务降级Fallback及网关流量控制

news2025/1/9 5:53:03

文章目录

      • sentinel下载安装
      • 启动sentinel
      • 访问sentinel
      • pmhub-gateway 整合 sentinel
        • 引入依赖
        • YML配置文件
        • Nacos持久化配置
      • 启动pmhub-gateway, 查看sentinel控制台
        • 启动结果如图
        • 相关名词解释
      • OpenFeign和 Sentinel 集成实现自定义 fallback 服务降级

  • Sentinel 和 Gateway 集成实现网关限流。
  • 通过 OpenFeign和 Sentinel 集成实现自定义 fallback 服务降级,减轻服务负担。

sentinel下载安装

  • 下载地址:https://github.com/alibaba/Sentinel/releases
  • 文档地址:https://sentinelguard.io/zh-cn/docs
  • 下载稳定的sentinel版本, ( 1.8.7 / 1.8.8 均可 )

image.png

启动sentinel

  • 打开命令窗CD到下载放置 sentinel-dashboard-1.8.8.jar 的文件夹
  • 执行**java -jar sentinel-dashboard-1.8.8.jar**就可以启动了

image.png

  • 如果出现端口被占用, 就将端口对应的进程kill掉即可
  • KILL进程 :
  1. Windows
netstat -ano | findstr port
taskkill /pid PID -f       # 第二个PID填写端口对应的PID

  1. Mac
lsof -i tcp:port
sudo kill -9 PID

访问sentinel

  • 访问 http://localhost:8080/`
  • 初始账号密码均为 : sentinel
  • 忽略左边的**pmhub-gateway**哈哈哈, 第一次启动是没有的

image.png

pmhub-gateway 整合 sentinel

  • Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流:
  • route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId
  • 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组
  • 在 PmHub 中主要是用的 route 维度,也即对应的微服务名

引入依赖
<!-- SpringCloud Alibaba Sentinel 核心依赖-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!-- SpringCloud Alibaba Sentinel Gateway,如果不是gateway可以不用引入 -->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

<!-- Sentinel Datasource Nacos 用来做持久化存储-->
<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

YML配置文件
spring: 
  cloud:
    sentinel:
      # 取消控制台懒加载
      eager: true
      transport:
        # 配置控制台服务地址
        dashboard: 127.0.0.1:8080
        # 默认 8719 端口,假如被占用会自动从 8719 开始依次 +1 扫描,直至找到未被占用的端口
        port: 8719
      # nacos配置持久化
      datasource:
        ds1:
          nacos:
            server-addr: 127.0.0.1:8848
            dataId: sentinel-pmhub-gateway
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: gw-flow

Nacos持久化配置

Sentinel 的配置默认是放在内存中,如果服务一旦重启,原先配置好的规则就都不见了,为了防止这样,所以需要配置数据持久化,因为在 PmHub 中,nacos 本身配置了持久化,也就是 nacos 的数据都会最终持久化到 MySQL 数据库。所以我们只需要将 Sentinel 的配置放到 nacos 配置统一管理起来就好了。

  • 上一步已经配置了持久化的配置,可以看到文件是 sentinel-pmhub-gateway。

image.png

启动pmhub-gateway, 查看sentinel控制台

启动结果如图

image.png
image.png

相关名词解释
参数名称参数值示例解释
API类型Route ID / API分组指定限流规则应用的API类型, 可以是路由ID或API分组
API名称pmhub-system被限流的具体API的名称
针对请求属性复选框是否根据请求属性, (如IP地址, 用户身份等), 进行限流
阈值类型QPS / 线程数限流的依据类型, 可以是美妙查询数( QPS ), 或并发线程数
QPS阈值1000指定每秒允许通过的最大请求数, 当超过此值时, 将触发限流
间隔1配合QPS阈值使用, 指定限流的时间窗口大小, 如1秒, 1分钟等
流控方式快速失败 / 匀速排队当达到限流阈值时, 采取的策略. 快速失败表示直接拒绝, 匀速排队表示排队等待
Burst size0突发请求数, 表示允许瞬间通过的请求数, 0表示不允许突发流量

OpenFeign和 Sentinel 集成实现自定义 fallback 服务降级

  • SentinelResource 注解是 Sentinel 官方提供的流量防卫防护组件注解,
  • 用于指定防护资源,对配置的资源进行流量控制,熔断降级等功能。

  • 在接口上加上这个注解,就能够实现自定义限流提示和程序异常返回 fallback 服务降级
/**
 * 根据用户名获取当前用户信息
 */
@InnerAuth
@GetMapping("/info/{username}")
@SentinelResource(value = "infoSentinelResource",blockHandler = "handlerBlockHandler", fallback = "doActionFallback") // 演示SentinelResource细粒度管控服务流控和降级
public R<LoginUser> info(@PathVariable("username") String username) {
    SysUser sysUser = userService.selectUserByUserName(username);
    if (StringUtils.isNull(sysUser)) {return R.fail("用户名或密码错误");}
    // 角色集合
    Set<String> roles = permissionService.getRolePermission(sysUser);
    // 权限集合
    Set<String> permissions = permissionService.getMenuPermission(sysUser);
    LoginUser loginUser = new LoginUser();
    loginUser.setUser(sysUser);
    loginUser.setRoles(roles);
    loginUser.setPermissions(permissions);
    loginUser.setUserId(sysUser.getUserId());
    loginUser.setDeptId(sysUser.getDeptId());
    loginUser.setNickName(sysUser.getNickName());
    return R.ok(loginUser);
}
  • 所谓 fallback 服务降级是指,调用一个微服务出现异常时候,访问者要有fallback 服务降级的情况,也就是我们常见的一些提醒如:“服务繁忙,请稍后再试!”不要持续访问9001加大微服务负担,

  • 直接在接口的 @SentinelResource 方法直接加 fallback 降级,但是通过 feign 接口调用的方法各自不同,如果每个不同方法都加一个fallback 配对方法,会导致代码膨胀不好管理,工程埋雷…

  • 在 UserFeignService 中的 @FeignClient 注解上
  • 添加自定义 fallbackFactory 就能实现我们想要的功能,下面是具体的代码。
/**
 * @author canghe
 * @description 用户服务
 * @create 2024-04-24-22:38
 */
@FeignClient(contextId = "userFeignService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = UserFeginFallbackFactory.class)
public interface UserFeignService {
    
    /**
     * 根据用户名获取当前用户信息
     */
    @GetMapping("/system/user/info/{username}")
    R<LoginUser> info(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    /**
     * 根据 userId 获取用户信息
     */
    @GetMapping("/system/user/getInfoByUserId/{userId}")
    R<LoginUser> getInfoByUserId(@PathVariable("userId") Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    /**
     * 根据条件获取用户列表
     */
    @PostMapping("/system/user/listOfInner")
    R<List<SysUserVO>> listOfInner(@RequestBody SysUserDTO sysUserDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    /**
     * 注册用户信息
     *
     * @param sysUser 用户信息
     * @param source 请求来源
     * @return 结果
     */
    @PostMapping("/system/user/register")
    R<Boolean> registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}

  • UserFeginFallbackFactory 降级处理
/**
 * 用户服务降级处理
 *
 * @author canghe
 */
@Component
public class UserFeginFallbackFactory implements FallbackFactory<UserFeignService>
{
    private static final Logger log = LoggerFactory.getLogger(UserFeginFallbackFactory.class);
    @Override
    public UserFeignService create(Throwable throwable)
    {
        log.error("用户服务调用失败:{}", throwable.getMessage());
        return new UserFeignService()
        {
            @Override
            public R<LoginUser> info(String username, String source) {
                return R.fail("根据用户名获取用户失败:" + throwable.getMessage());
            }
            @Override
            public R<LoginUser> getInfoByUserId(Long userId, String source) {
                return R.fail("根据userId获取用户失败:" + throwable.getMessage());
            }
            @Override
            public R<List<SysUserVO>> listOfInner(SysUserDTO sysUserDTO, String source) {
                return R.fail("根据调教获取用户列表失败:" + throwable.getMessage());
            }
            @Override
            public R<Boolean> registerUserInfo(SysUser sysUser, String source) {
                return R.fail("注册用户失败:" + throwable.getMessage());
            }
        };
    }
}

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

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

相关文章

苹果在iOS 18.1中向第三方开发者开放iPhone的NFC芯片

苹果公司今天宣布&#xff0c;开发者很快就能首次在自己的应用程序中提供 NFC 交易功能&#xff0c;而目前这主要是Apple Pay独有的功能。从今年晚些时候的 iOS 18.1 开始&#xff0c;开发者将可以使用新的 API 提供独立于 Apple Pay 和 Apple Wallet 的应用内非接触式交易。 这…

多线程之并发锁

多线程之并发锁 Synchronized 特性&#xff1a; 可重入&#xff0c;持有该锁的线程可以再次获取锁不可中断&#xff1a;获取了Synchronized锁之后就必须要等其释放锁&#xff0c;响应不了中断灵活性不高&#xff1a;使用Synchronized锁只能是进入到代码块内执行完了才释放锁…

基于DPU云盘挂载的Spark优化解决方案

1. 方案背景和挑战 Apache Spark&#xff0c;作为当今大数据处理领域的佼佼者&#xff0c;凭借其高效的分布式计算能力、内存计算优化以及强大的生态系统支持&#xff0c;已牢固确立其在业界的标杆地位。Spark on Kubernetes&#xff08;简称K8s&#xff09;作为Spark与Kuber…

代码随想录训练营 Day30打卡 贪心算法 part04 452. 用最少数量的箭引爆气球 435. 无重叠区间 763. 划分字母区间

代码随想录训练营 Day30打卡 贪心算法 part04 一、 力扣452. 用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球…

YoloV8改进策略:Block改进|LeYOLO,一种用于目标检测的新型可扩展且高效的CNN架构|复现LeYolo,轻量级Yolo改进

摘要 在目标检测中&#xff0c;深度神经网络的计算效率至关重要&#xff0c;尤其是随着新型模型越来越注重速度而非有效计算量&#xff08;FLOP&#xff09;。这一发展趋势在某种程度上忽视了嵌入式和面向移动设备的AI目标检测应用。在本文中&#xff0c;我们基于FLOP关注于高…

热泵干燥应用举例

热泵在木材加工中的应用主要是热泵干燥&#xff0c;具有能耗低、干燥质量好等特点。热泵木材干燥装置的基本结构是封闭式干燥窑&#xff0c;其中热泵机组的结构有单热源型&#xff08;图18-4&#xff09;、双热源型&#xff08;图18-5&#xff09;和空气回热型&#xff08;图18…

深入理解Java中的ConcurrentHashMap:高效线程安全的并发容器

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Java并发:内存屏障,Atomic类,CAS函数,伪共享

阅读本文之前可以看一看 Java 多线程基础&#xff1a; Java&#xff1a;多线程&#xff08;进程线程&#xff0c;线程状态&#xff0c;创建线程&#xff0c;线程操作&#xff09; Java&#xff1a;多线程&#xff08;同步死锁&#xff0c;锁&原子变量&#xff0c;线程通信&…

【学习笔记】A2X通信的协议(十)- 通过PC5的直接探测与避让(DDAA)

3GPP TS 24.577 V18.1.0的技术规范&#xff0c;主要定义了5G系统中A2X通信的协议方面&#xff0c;特别是在PC5接口和Uu接口上的A2X服务。以下是文件的核心内容分析&#xff1a; 8. 通过PC5的直接探测与避让&#xff08;DDAA&#xff09; 8.1 概述 本条款描述了UE之间以及UE上…

论文阅读:Efficient Core Maintenance in Large Bipartite Graphs | SIGMOD 2024

还记得我们昨天讨论的《Querying Historical Cohesive Subgraphs over Temporal Bipartite Graphs》这篇论文吗? https://blog.csdn.net/m0_62361730/article/details/141003301 这篇(还没看的快去看) 这篇论文主要研究如何在时间双向图上查询历史凝聚子图&#xff0c;而《E…

CAD二次开发IFoxCAD框架系列(18)-块表操作

1. 块表的查询 1.1 查找名为“自定义块”的块表中的图块记录 using var tr new DBTrans(); if (tr.BlockTable.Has("自定义块")) {//要执行的操作 }遍历块表并打印所有的块表的图块名称 public void Test_DBTrans_BlockCount() {using var tr new DBTrans();var…

CentOS7.9上通过KVM安装Centos虚拟机

目录 1 开发前准备&#xff08;先确保服务器可以虚拟化&#xff09;&#xff1a; 2、安装KWM环境 3、创建镜像文件存放目录 4、创建镜像文件存放目录 5、安装桥连接虚拟网络 6、安装虚拟机 7、配置操作系统 8、虚拟机配置网卡地址 9、克隆虚拟机执行 1开发前准备&am…

Git文件管理技巧:轻松删除与查看文件,忽略不必要的文件与文件夹!

避免文件混乱&#xff1a;Git 文件操作技巧 一、Git工作原理概述二、删除文件三、查看指定文件的修改四、指定不需要 Git 管理的文件五、总结 一、Git工作原理概述 Git是一种分布式版本控制系统&#xff0c;其核心在于其高效的快照机制、强大的分支与合并功能、本地开发的灵活…

数据集与数据库:有什么区别?

数据集和数据库是我们在处理数据时经常听到的两个常用词。虽然它们听起来很相似&#xff0c;但它们具有不同的特征并用于不同的用途。本文深入探讨数据集和数据库之间的主要区别&#xff0c;探索了它们的结构、数据类型和各种其他功能&#xff0c;以帮助您做出明智的决定&#…

回归预测|基于灰狼优化GWO-Transformer-BiLSTM组合模型的数据回归预测Matlab程序 多特征输入单输出

回归预测|基于灰狼优化GWO-Transformer-LSTM组合模型的数据回归预测Matlab程序 多特征输入单输出 文章目录 前言回归预测|基于灰狼优化GWO-Transformer-BiLSTM组合模型的数据回归预测Matlab程序 多特征输入单输出GWO-Transformer-BiLSTM 一、GWO-Transformer-BiLSTM模型二、实验…

uniapp打包H5的时候 清楚缓存(不安装依赖的前提下)

问题 在写项目的时候&#xff0c;打包好一个H5 发布成功&#xff0c;后来又重新打包新的包进行更新迭代&#xff0c;但是用户手机上还是上一个版本&#xff0c;本地缓存还是没有清除。 解决问题 步骤一&#xff1a;html不缓存 在html中&#xff0c;解决缓存的方法主要是依赖…

文章解读与仿真程序复现思路——电力自动化设EI\CSCD\北大核心《海上风电全直流汇集送出系统自适应振荡抑制策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【小bug】springMVC通过json传参无法解析参数

0.问题描述 通过postman测试使用json传参的时候&#xff0c;发现不论怎么修改&#xff0c;都无法获取参数&#xff0c;解析对象。 反复检查请求url&#xff0c;请求内容均为正常。 以下是postman测试结果&#xff1a; 日志提示无法解析参数&#xff0c;内容如下&#xff1a;…

C# VideoCapture 多路视频播放

目录 效果 项目 代码 下载 效果 C#VideoCapture多路视频播放 项目 代码 using OpenCvSharp; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.Threading.Tasks…

MS5046T/5047T/5048T/5048N_2kSPS、16bit Σ-Δ ADC

MS5046T/MS5047T/MS5048T/MS5048N 是适合高精 度、低成本测量应用的 16bit 模数转换器。其内部集成低 噪声可编程增益放大器、高精度 Δ-Σ 模数转换器和内部振 荡器。 MS5047T 、 MS5048T 、 MS5048N 内部还集成低温 漂基准和两路匹配的可编程电流源。 MS5048T/MS50…