Spring cloud alibaba 整合 Sentinel

news2024/11/22 11:50:35

Sentinel详解

  • Docker安装
    • 1、拉取镜像
    • 2、运行容器
    • 访问
  • 整合 spring-cloud-alibaba
    • 1、引入Maven依赖
    • 2、配置控制台
    • 3、编写控制器
    • 4、启动Sentinel访问
    • 自定义异常处理
    • 统一异常处理
  • 整合 OpenFeign
    • 引入Maven依赖:
  • 配置:
    • 编写 Feign 实现
    • 指定 Feign 容错类
    • 控制器
    • 运行测试:
  • Sentinel 规则持久
    • push模式
    • 1、添加依赖:
    • 2、nacos配置中心配置流控规则
    • 3、配置Nacos地址

指路:
Sentinel服务器容错简介
Sentinel规则详解

Docker安装

1、拉取镜像

docker pull bladex/sentinel-dashboard:1.8.0

2、运行容器

docker run --name sentinel -p 8858:8858 --ulimit nofile=1024 -d bladex/sentinel-dashboard:1.8.0
  • 如果启动报 library initialization failed - unable to allocate file descriptor table - out of memory 错误,也可以修改 docker 服务的默认设置vim/usr/lib/systemd/system/docker.service 然后添加如下内容:
[Service]
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity

访问

  • 浏览器访问 http://你的虚拟机IP/ ,就可以看到sentinel的控制台了。
  • 需要输入账号和密码,默认都是:sentinel,就可以登录。

整合 spring-cloud-alibaba

  • 为微服务集成 Sentinel 非常简单, 只需要加入 Sentinel 的依赖即可。
  • 在order-sentinel-service中整合sentinel,并连接sentinel的控制台,步骤如下:

1、引入Maven依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、配置控制台

  • 修改application.yaml文件,添加下面内容:
    • clientIp:跟实际项目运行的主机的某一ip地址(sentinel所在虚拟机能ping通的)
      • 若实际项目所运行的主机的所有ip都能ping通,则可以忽略
spring:
  cloud:
    sentinel:
      transport:
        dashboard: 虚拟机ip:8858

3、编写控制器

  • 案例:我们在 OrderController 控制器类中添加 message1 和 message2 两个方法,用于测试服务容错。
@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {
    @GetMapping("/message1")
    public String message1() {
        return "message1";
    }
    @GetMapping("/message2")
    public String message2() {
        return "message2";
    }
}

4、启动Sentinel访问

  • 打开浏览器,访问控制器接口 http://localhost:8072/order/message1。(需要先访问一遍接口才能出发 Sentinel 监控)
  • 通过浏览器访问 http://虚拟机ip:8858/ 进入控制台进行流控设置 ( 默认用户名密码是 sentinel/sentinel )
    • 如果监控不到,就试着增加 clientIp 的配置

自定义异常处理

  • @SentinelResource :修饰资源(方法):
    • value:设置 sentinel 资源名,默认为接口方法名。
    • blockHandler: 指定异常处理函数的名称,报错后会进入该函数。
      • 函数必须是本类的,若定义在其他类,则需设置 blockHandlerClass 属性。
    • blockHandlerClass:指定异常处理函数所在的类,其值是 Class<?>[]。
      • 此时异常处理函数必须是 static
      • 设置之后将只会从 blockHandlerClass 值中寻找异常处理函数,忽略本类。
@GetMapping("/message1")
@SentinelResource(value = "message1", blockHandler =
        "message1BlockHandler")
public String message1() {
    return "message1";
}
// 此处需要注意:是 BlockException,而不是 BlockedException
public String message1BlockHandler(BlockException e) {
    return "被流控了.....";
}
  • 异常处理函数注意:
    • 必须是 public 修饰的方法
    • 返回值必须要和源方法保持一致
    • 参数也必须包含源方法的参数且顺序一致
      • 参数最后需要增加一个 BlockException 类型的参数,通过它可以区分是什么样的异常
    • 其他类中的异常处理函数必须是 static 的。

统一异常处理

  • 如果使用 @SentinelResource 注解来自定义处理异常的结果都一样,那么就可以使用统一异常处理来简化代码编写。
  • 创建统一异常处理类 GlobalExceptionHandler ,实现 BlockExceptionHandler 接口并注册为 Spring 容器组件。
  • 重写 handle 方法,实现对于 sentinel 不同规则异常的处理。
    • BlockException 异常有个五个是实现类,分别对应不同的规则异常:
      • FlowException:流控;DegradeException:降级;ParamFlowException:热点;SystemBlockException:系统;AuthorityException:授权。
  • 注意:被 @SentinelResource 修饰的资源不会进入同一异常处理。
@RestControllerAdvicepublic class GlobalExceptionHandler implements BlockExceptionHandler {

    @Override    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        String s = null;
        if (e instanceof FlowException) {
            s = "流控限流....";
        } else if (e instanceof DegradeException) {
            s = "服务降级....";
        } else if (e instanceof ParamFlowException) {
            s = "热点参数限流....";
        } else if (e instanceof SystemBlockException) {
            s = "触发系统保护规则....";
        } else if (e instanceof AuthorityException) {
            s = "授权规则不通过....";
        }
        response.setStatus(500);
        response.setCharacterEncoding("utf-8");
        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        response.getWriter().print(s);
    }
}

整合 OpenFeign

引入Maven依赖:

<!--nacos注册中心客户端-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--Rabbit负载均衡-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--feign组件-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

配置:

  • 开启 Feign 对 Sentinel 的支持。
    • feign.sentinel.enabled=true
  • 其他:
server:
  port: 8072
spring:
  application:
    name: order-service # 服务的名称,它会注册到注册中心中,这个名称唯一
  cloud:
    # 配置nacos地址
    nacos:
        discovery
          server-addr: 192.168.65.128:8848 # 指定注册中心中心地址
    # 配置Feign日志
    openfeign:
      client:
        config:
          order-service:
            logger-level: basic
    sentinel:
      transport:
        dashboard: 192.168.65.128:8858
        clientIp: 192.168.65.1
      webContextUnify: false # 关闭context收敛
feign:
  sentinel:
    enabled: true

编写 Feign 实现

  • 为所有 Feign 接口编写 实现类,添加注解注入IOC,并重写所有方法。
    • 实现类重写的方法就代表:当远端服务没找到、服务出错时的一个处理方法。
@Component
public class OpenFeignClientImpl implements OpenFeignClient {
    // 当远端服务没找到、服务出错时的一个处理方法。
    @Override
    public String reduce(String commodityCode, int count) {
        return "请求稍后再试......";
    }
}

指定 Feign 容错类

  • 为所有 Feign 接口的 @FeignClient 注解设置 fallback 属性值。
    • fallback:指定的 Feign 客户端接口的回退类。回退类必须实现由该注释注释的接口Class<?>,并且必须是一个有效的 spring bean。

控制器

  • 控制器正常书写调用 feign 等。
@RestController@RequestMapping("/order")
public class OrderController {
    @Resource    private OpenFeignClient openFeignClient;
    @GetMapping("/add/{commodityCode}/{count}")
    public Map<String, Object> add(@PathVariable String commodityCode, @PathVariable int count) {
        String result = openFeignClient.reduce(commodityCode, count);
        Order order = Order.builder()
                .commodityCode(commodityCode)
                .count(count)
                .money(300)
                .build();
        Map<String, Object> map = new HashMap<>();
        map.put("order", order);
        map.put("storage", result);
        return map;
    }
}

运行测试:

  • 启动两个服务,正常调用运行,一切OK
  • 尝试关闭被OpenFeign的那个服务,再次访问,发现执行了 fallback 的容错处理方法。
    在这里插入图片描述

Sentinel 规则持久

每次重启服务都要重新在 Sentinel客户端设置规则,太麻烦了。

push模式

  • 生产环境下一般更常用的是 push 模式的数据源,如远程配置中心(Zookeeper、Nacos、Apollo等),推送的操作不应由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送。数据源仅负责获取配置中心推送的配置并更新到本地。

  • 因此推送规则正确做法应该是 配置中心控制台 > 配置中心 > Sentinel数据源 > Sentinel,而不是经 Sentinel 数据源推送至配置中心。
    在这里插入图片描述

  • 其原理就是使用 nacos 配置中心编写 json配置文件,其中配置了 Sentinel 规则;启动 Spring 是由Spring 导入配置,Sentinel 便能自动识别到配置文件,并生成规则。

1、添加依赖:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2、nacos配置中心配置流控规则

  • Data ID: order-sentinel-flow-rule
  • Group: DEFAULT_GROUP
  • 配置格式: JSON
  • 配置内容示例:
[
    {
        "resource": "/order/message1",
        "limitApp": "default",
        "grade": 1,
        "count": 2,
        "strategy": 0,
        "controlBehavior": 0
    }
]

3、配置Nacos地址

server:
  port: 8072
spring:
  application:
    name: order-service # 服务的名称,它会注册到注册中心中,这个名称唯一
  cloud:
    sentinel:
      transport:
        dashboard: 192.168.65.128:8858
        clientIp: 192.168.65.1
      webContextUnify: false # 关闭context收敛
      datasource:
        flow-rule:  # 此名称可以自定义
          nacos:
            server-addr: 192.168.65.128:8848  # nacoc地址
            dataId: order-sentinel-flow-rule
            groupId: DEFAULT_GROUP
            rule-type: flow # 还可以是:degrade、authority、param-flow 等
  • 运行程序,访问服务接口,此时就能在 Sentinel 客户端中看见配置的规则了,并且是处于生效状态。
  • 缺点:在 Sentinel 控制台中修改规则后不会自动配置到 nacos 中。

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

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

相关文章

ROS2在改造ros1时,报警相关库异常排查

一、在make时&#xff0c;存在以下报警&#xff0c;检查h中是已经包含相关的头文件了&#xff0c;并且也已改为ros2的格式。 二、解决&#xff1a; 检查发现&#xff0c;在CMakelists.txt中未添加相关依赖包&#xff0c;重新添加后&#xff0c;报警解除&#xff0c;编译通过。…

商家们的“疗效”焦虑,巨量引擎、阿里妈妈、腾讯广告们都在怎么满足?

文 | 螳螂观察 作者 | 青月 有人的地方就有营销。 虽然这是一门永不褪色的“生意”&#xff0c;但在增量见顶、红利消失的互联网&#xff0c;数字营销变得越来越听不见“水响”。 就连在号称“史上最卷”的今年618&#xff0c;同台竞技的各大数字营销服务商都在强调自己的“…

difflib 比较文本相似度,找出错误值

在日常的数据分析过程中&#xff0c;我们可能会遇到这样的问题。在处理数据时&#xff0c;有的文本内容是同一类目&#xff0c;但是由于手工输入错误 或者大小写的问题&#xff0c;可能会造成将产品分到不同的类目下&#xff0c;这时候就需要对数据进行清洗。如何实现快速比较…

Selenium基础篇之屏幕截图方法

文章目录 前言一、用途1.捕获页面错误2.调试测试用例3.展示测试结果4.记录页面状态 二、方法1. save_screenshot2. get_screenshot_as_file3. get_screenshot_as_png4. get_screenshot_as_base64 总结 前言 大家好&#xff0c;我是空空star&#xff0c;本篇给大家分享一下Selen…

IDEA+SpringBoot + Mybatis + Shiro+Bootstrap+Mysql智慧仓库系统

IDEASpringBoot Mybatis ShiroBootstrapMysql智慧仓库系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.主页3.货位一览4.入库单5. 库存明细6. 呆滞过期报表7. 转库记录8.入库记录9.出库记录10.出库单11.物料信息12.仓库设置13.用户管理14.操作员管理15.角色管理16.账…

Python实现SMOGN算法解决不平衡数据的回归问题

本文介绍基于Python语言中的smogn包&#xff0c;读取.csv格式的Excel表格文件&#xff0c;实现SMOGN算法&#xff0c;对机器学习、深度学习回归中&#xff0c;训练数据集不平衡的情况加以解决的具体方法。 在不平衡回归问题中&#xff0c;样本数量的不均衡性可能导致模型在预测…

解决Navicat连接Oracle报ORA-28547

《进入Oracle官网》 下载Instant Client Products --------------》Oracle Database download database --------------》Download Oracle Database X Instant Client - C/C Drivers (OCI, OCCI, ODBC) and Utilities Download Now 根据自己的操作系统下载对应的Oracle …

【深入浅出Apache Jackrabbit】第三章 Repository 配置文件

系列文章目录 第一章 初见 Apache Jackrabbit 第二章 Apache Jackrabbit 入门 第三章 Repository 配置文件 第四章 Apache Jackrabbit 文件存储 第五章 Apache Jackrabbit 版本管理 文章目录 系列文章目录一、创建一个 Repository 配置文件二、初始化 Repository Apache Jackr…

基于单片机的智能温控风扇的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b; 液晶显示当前温度&#xff0c;风速等级&#xff0c;自动手动模式息&#xff1b; DS18B20检测当前的温度&#xff1b; 按键设置温度上限&#xff1b; 手动模式下&#xff1a; 直接控制风扇档位&#xff0c;可以开启/关闭风扇&a…

DragGAN在Windows11中下载安装

DragGAN是一种颠覆性的新型图像生成和编辑技术&#xff0c;它实现了前所未有的用户对图像创作过程的控制能力。使用DragGAN&#xff0c;用户可以用鼠标拖放的方式在空白画布上概括构思图像&#xff0c;系统会自动生成图像细节。例如&#xff0c;用户可以拖拽画一个矩形作为“汽…

js原生实现楼层效果

html文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>* {m…

TPU编程竞赛系列|第九届 “互联网+”大学生创新创业大赛产业命题赛道,算能6项命题入选!

近日&#xff0c;第九届中国国际“ 互联a网 ” 大学生创新创业大赛产业命题正式公布&#xff0c;算能提交的六 项企业命题成功入选正式赛题。算能六项赛题主要围绕国产 TPU 芯片的边缘计算系统和 RISC-V 架构处理器来设计&#xff0c;且为参赛选手提供了超强算力开发板等硬件资…

前端vue入门(纯代码)29_路由的params参数

手机里的钞票薄情寡义,身上的赘肉不离不弃&#xff01; 【27.Vue Router--路由的params参数】 params属性起到的作用和query差不多&#xff0c;都是用于传递和接收参数&#xff0c;只不过&#xff0c;它是在src/router/index.js文件中进行配置 // 该文件专门用于创建整个应用…

逆向某安卓游戏native层登录协议的过程记录

前言 主要参考白龙哥的unidbg学习&#xff1a;SO逆向实战十三篇 用到工具&#xff1a; frida(HOOK看参数) unidbg&#xff08;模拟&#xff09; ida&#xff08;静态分析&#xff09; charles&#xff08;抓包&#xff09; 准备 此处省略一大堆获取So文件流程&#xff0c;…

单片机编程要求的C语言水平和技能

如果你想从事单片机工作&#xff0c;你需要具备一定水平的C语言编程技能。以下是一些建议的技能和知识&#xff0c;可以帮助你为单片机编程做好准备&#xff1a; 熟悉C语言基础&#xff1a;掌握C语言的基本语法、数据类型、控制结构和函数等。这是你开始学习单片机编程的基础。…

实操:用Flutter构建一个简单的微信天气预报小程序

​ 微信小程序是一种快速、高效的开发方式&#xff0c;Flutter则是一款强大的跨平台开发框架。结合二者&#xff0c;可以轻松地开发出功能丰富、用户体验良好的微信小程序。 这里将介绍如何使用Flutter开发一个简单的天气预报小程序&#xff0c;并提供相应的代码示例。 1. 准备…

《C语言初阶篇》循环语句还没搞懂?这篇文章带你轻松学会循环语句!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《快速入门C语言》《C语言初阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言&#x1f4ac; 循环语句的介绍&#x1f4ac; while 语句的介绍&#x1f4ad; while中的break&#x1f4ad;…

numpy 多项式函数回归与插值拟合模型;ARIMA时间序列模型拟合

参考&#xff1a; https://blog.csdn.net/mao_hui_fei/article/details/103821601 1、多项式函数回归拟合 import numpy as np from scipy.optimize import leastsq import pylab as plx np.arange(1, 17, 1) y np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86,…

ELK 企业级日志分析系统----elk的部署

文章目录 一、ELK 简介1.1 ElasticSearch介绍1.2 ELK的组件ElasticSearchKiabanaLogstash可以添加的其它组件 1.3 为什么要使用 ELK1.4 完整日志系统基本特征1.5 ELK 的工作原理&#xff1a; 二、elk环境部署2.1 ELK Elasticsearch 集群部署&#xff08;在Node1、Node2节点上操…

vue3 处理elementPlus的Tree树状结构的选中和编辑数据回显

<!-- 添加角色 请求菜单:props"{ children: children, label: name }" children:后端返回的子集结构的key label&#xff1a;name后端返回的名字&#xff1a;data"menus" menus是后端返回的菜单权限列表--><el-treeref"elTreeRef":dat…