spring cloud 之 sentinel

news2024/11/23 23:45:36

sentinel概述

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

sentinel的两个部分 

核心库(Java 客户端): 不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持
控制台(Dashboard): 基于 Spring Boot 开发,打包后可以直接运行,默认访问端口8080,用户名密码均为sentinel

sentinel项目搭建 

环境介绍

我这里的搭建三个服务

cloud-gateway-service  网关服务,集成sentinel,这里转发到cloud-feign-client

cloud-feign-client  feign的客户端,在这里将调用cloud-test-service

cloud-test-service 测试服务,主要提供一个controller访问

项目采用nacos作为注册中心

cloud-gateway-service搭建

依赖引入

<dependencies>
        <!-- 网关依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--nacos客户端依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--spring cloud gateway整合sentinel的依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
        </dependency>

        <!--sentinel的依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

</dependencies>

项目配置文件

server:
  port: 10010
spring:
  application:
    name: could-gateway-server
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      routes:
        - id: cloud-feign-client
          uri: lb://cloud-feign-client
          predicates:
            - Path=/test/**
          filters:
            - StripPrefix=1
      discovery:
        locator:
          enabled: true
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080



cloud-feign-client搭建 

此服务中也加入了sentinel流控规则,对服务上的sentinel和gateway上的sentinel之间还是有着不同的

网关上做粗粒度的限流,而服务上能更精细化的限流

加入依赖

  <!--sentinel的依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>

 配置文件

spring:
  application:
    name: cloud-feign-client
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
server:
  port: 9300
feign:
  httpclient:
    connection-timeout: 5000


下面的代码块是一个feign调用测试服务的代码 

package com.slbuildenv.cloud.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value="cloud-test-service" )
public interface TestFeign {

    @GetMapping("/find/date")
    String findDate();
}
package com.slbuildenv.cloud.controller;

import com.slbuildenv.cloud.client.TestFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/feign")
public class TestFeignRemote {

    @Autowired
    private TestFeign testFeign;

    @GetMapping("/date")
    public String getRemoteDate() throws InterruptedException {
       return  testFeign.findDate();
    }

}

cloud-test-service搭建 

该服务仅仅是提供访问数据,目前不涉及service和mapper,只有一个controller,别忘了注册nacos,这里不列举配置啦

package com.slbuildenv.cloud.controller;

import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@RestController
@RequestMapping("/find")
@RefreshScope
public class TestFeign {


    @GetMapping("/date")
    public String getDate(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    }
}

启动项目 

启动三个项目向nacos注册,nacos控制台查看服务注册

需要下载sentinel dashbord 的jar包,由于该死的github太慢啦,我从别人网盘下载的,我这里下载的版本1.8.4 如有需要可以在传送门这里找云盘下载链接

下载完毕,java -jar sentinel-dashbord 1.8.4.jar 即可,访问8080端口登录,用户名密码均为

sentinel

Sentinel的资源定义方式 

定义资源

对于资源的定义有两种,一种是硬编码的方式,一种是通过 @SentinelResource 注解的方式,推荐使用注解方式,避免造成业务入侵

硬编码方式

 抛出异常的方式定义资源:SphU

    Entry entry = null;
    try {
        // 定义一个sentinel保护的资源,
        entry = SphU.entry(resourceName);
        // 被保护的业务逻辑
    } catch (BlockException e) {
        // 如果被保护的资源被限流或者降级了,就会抛出BlockException
        log.warn("资源被限流或降级了", e);
    } catch (InterruptedException e) {
        log.error("发生InterruptedException",e);
    } finally {
        if (entry != null) {
            entry.exit();
        }
    }

try-with-resources 来定义资源

public static void main(String[] args) {
    // 配置规则.
    initFlowRules();
 
    // 1.5.0 版本开始可以直接利用 try-with-resources 特性
    try (Entry entry = SphU.entry(resourceName)) {
        // 被保护的逻辑
        System.out.println("hello world");
    } catch (BlockException ex) {
        // 处理被流控的逻辑
        System.out.println("blocked!");
    }
}

 返回布尔值的方式定义资源  SphO.entry(“资源名”)

  // 资源名可使用任意有业务语义的字符串
  if (SphO.entry("自定义资源名")) {
    // 务必保证finally会被执行
    try {
      /**
      * 被保护的业务逻辑
      */
    } finally {
      SphO.exit();
    }
  } else {
    // 资源访问阻止,被限流或被降级
    // 进行相应的处理操作
  }

 @SentinelResource注解方式

  @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "block_testHotKey")
    public String testHotKey(@RequestParam(value = "test1")String test1,
                             @RequestParam(value = "test2")String test2){
        return "testHotKey....";
    }

value:资源名称,必需项

entryType:entry 类型,可选项(默认为 EntryType.OUT)

blockHandler / blockHandlerClass:blockHandler 指定函数负责处理 BlockException 异常,可选项。blockHandler 函数默认需要和原方法在同一个类中,通过指定 blockHandlerClass 为对应类的 Class 对象,则可以指定其他类中的函数,但注意对应的函数必需为 static 函数,否则无法解析 

fallback /fallbackClass:fallback 指定的函数负责处理业务运行的异常,可选项,fallback 函数可以针对所有类型的异常(除了exceptionsToIgnore里面排除掉的异常类型)进行处理。fallback 函数默认需要和原方法在同一个类中,通过指定 fallbackClass 为对应类的 Class 对象,则可以指定指定为其他类的函数,但注意对应的函数必需为 static 函数,否则无法解析
defaultFallback:默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑。defaultFallback 函数默认需要和原方法在同一个类中,通过指定 fallbackClass 为对应类的 Class 对象,则可以指定指定为其他类的函数,但注意对应的函数必需为 static 函数,否则无法解析
exceptionsToIgnore:用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

Sentinel的规则 

流控规则

资源名: 唯一名称,默认请求路径,表示对该资源进行流控
针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)

阈值类型/单击阈值:

  • QPS(每秒钟的请求数量):当调用该api的QPS达到阈值时,进行限流
  • 线程数:当调用该线程数达到阈值的时候,进行限流

是否集群:不需要集群

流控模式:

  • 直接: api达到限流条件时,直接限流
  • 关联: 当关联的资源达到阈值时,就限流自己
  • 链路: 只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】

流控效果:

  • 快速失败: 直接失败,抛异常
  • Warm Up: 根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFctor,经过预热时长,才达到设置的QPS阈值
  • 排队等待: 匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

添加流控为每秒请求数为1的时候进行流控,目前流控效果如下:

http://localhost:9300/feign/date 多次点击触发此效果

降级规则 

RT 平均响应时间: 当1s内持续进入5个请求,且对应请求的平均响应时间(秒级)均超过阈值,那么在接下来的时间窗口期内,对该方法的调用都会自动的熔断。

注意Sentinel默认统计的RT上限是4900ms,超出此阈值的都会算作4900ms,若需要更改上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx来配置

异常比例: 当资源的每秒请求大于5,并且每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态,在接下来的时间窗口内,对该方法的调用都会自动的返回。异常的取值在[0.1,1.0]

异常数: 当资源近1分钟的异常数超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若时间小于60s,则结束熔断状态后仍可能再进入熔断状态

 热点key规则

sentinel可以根据当前经常被访问的数据,统计其被访问次数,然后进行降级操作,在cloud-feign-client中加入测试热点key的controller

@SentinelResource注解和Hystrix中的@HystrixCommand类似,之前的案例,限流、降级出问题了,都是用的sentinel默认的提示信息,这个注解就是类似hystrix的注解,自定义兜底方法,某个方法出问题,就找对应的兜底方法
value = “testHotKey”:就是该资源的唯一标识,blockHandler = “block_testHotKey”:就是兜底方法

package com.slbuildenv.cloud.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.slbuildenv.cloud.client.TestFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/feign")
public class TestFeignRemote {

    @Autowired
    private TestFeign testFeign;

    @GetMapping("/date")
    public String getRemoteDate() throws InterruptedException {
       return  testFeign.findDate();
    }

    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "block_testHotKey")
    public String testHotKey(@RequestParam(value = "test1")String test1,
                             @RequestParam(value = "test2")String test2){
        return "testHotKey....";
    }
    public String block_testHotKey(String p1, String p2, BlockException exception){
        return "testHotKey被限流了...";
    }

}

 通过测试得知,我们的第一个参数被降级限流啦

系统规则

系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量

系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性

 Sentinel的规则持久化

将持久化规则放入Nacos中持久化

加入依赖

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

加入配置

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

更加详细配置请参考sentinel规则持久化

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

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

相关文章

社保卡读卡器用的NCN8025接触式芯片供电问题

社保卡读卡器接触式卡座里面用了NCN8025芯片&#xff0c;NCN8025芯片的电压输入端&#xff0c;选择5V输出的时候&#xff0c;最小应该是4.75V&#xff0c;对应到读卡器USB这边那最好是不低于4.8V 如果电压过低&#xff0c;低于4.8就会出现可能无法读取社保卡情况&#xff0c;即…

Cesium 加载发光材质的行政区边界

在 cesium 中可以为 entities 设置材质,比如一条发光的线可以像如下这样设置: viewer.entities.add({name: "",polyline: {positions: Cesium.Cartesian3.fromDegreesArrayHeights([104.57311103029339, 30.71454550939871, 451.0205115032204,104.57369073762032,…

Appium+python自动化(三)- SDK Manager(超详解)

简介 本来一开始打算用真机做的&#xff0c;所以在前边搭建环境时候就没有下载SDK&#xff0c;但是由于许多小伙伴留言说是没有真机&#xff0c;所以顺应民意整理一下模拟器。SDK顾名思义&#xff0c;Android SDK Manager就是一个Android软件开发工具包管理器&#xff0c;就像一…

部署langchain+chatglm

先参考&#xff1a;window零基础部署langchain-ChatGLM_飞奔的屎壳郎的博客-CSDN博客 安装一部分&#xff0c; 1.GCC安装 gcc64位下载 一定要装64位的gcc&#xff0c;因为我的电脑是w10 64位的&#xff0c;装32位运行langchain报错并配置环境变量 可直接用压缩包中的文件&am…

改进 Elastic Stack 中的信息检索:混合检索 - hybrid retrieval

作者&#xff1a;Quentin Herreros, Thomas Veasey 在上一篇博文中&#xff0c;我们介绍了 Elastic Learned Sparse Encoder&#xff0c;这是一种经过训练可有效进行零样本文本检索的模型。 Elasticsearch 还具有强大的词汇检索功能和丰富的工具来组合不同查询的结果。 在本博客…

测试开发必备技能:JMeter 二次开发函数

一、简介 1、概述 Apache JMeter 是 Apache 基于 Java 开发的开源压力测试工具 最初被设计用于 Web 应用测试&#xff0c;但后来扩展到了其他测试领域&#xff0c;像接口测试 但&#xff0c;随着 IT 行业的快速发展&#xff0c;不同企业或组织需求更加丰富&#xff0c;JMeter…

C# Linq 详解四

目录 概述 二十、SelectMany 二十一、Aggregate 二十二、DistinctBy 二十三、Reverse 二十四、SequenceEqual 二十五、Zip 二十六、SkipWhile 二十七、TakeWhile C# Linq 详解一 1.Where 2.Select 3.GroupBy 4.First / FirstOrDefault 5.Last / LastOrDefault C# Li…

PMP,一场不可能fail的考试

2018年我参加了PMP考试&#xff0c;结果毫无悬念地轻松通过了。和我一起参加考试的七位伙伴也都取得了不错的成绩。 我是在去年7月份报名的&#xff0c;准备参加9月初的PMP考试。我记得我花费了3800元的培训费和3300元的考试费。由于PMP国内考试的报名条件之一是要求参加过由国…

C++ 指向vector[0]的指针

结论&#xff1a;指针p指向vector的第0个元素 p &v[0] 可以使用p[i]继续访问vector的其他元素&#xff0c;见test3 #include <vector> #include <iostream>/* 测试目的&#xff0c;指针p0指向vector的第0个元素 p &v[0] 可以使用p[i]继续访问vector的…

骨传导耳机好用吗?盘点五款好用的骨传导耳机推荐

在骨传导耳机还没有火之前&#xff0c;相信很多朋友都是使用入耳式和头戴式耳机比较多一点&#xff0c;但是慢慢的会发现&#xff0c;这两种耳机都存在很大的问题&#xff0c;比如说入耳式耳机&#xff0c;长时间佩戴会造成耳朵痛等问题&#xff0c;而头戴式耳机因为隔音效果好…

Spark编程-键值对RDD(K,V)创建及常用操作

简述 SparkRDD中可以包含任何类型的对象&#xff0c;在实际应用中&#xff0c;“键值对”是一种比较常见的RDD元素类型&#xff0c;分组和聚合操作中经常会用到&#xff0c;尤其是groupByKey和reduceByKey。 Spark操作中经常会用到“键值对RDD”&#xff08;Pair RDD&a…

swiper滚动块宽度踩坑记录

背景&#xff1a;需要给swiper增加图片懒加载优化性能&#xff0c;这里使用的是swiper自带的 lazy api。但是加了懒加载后发现滚动块的宽度变长了&#xff0c;这里的原因是我只给滚动条设置了宽度的样式但是没有给滚动块设置宽度的样式。于是我按照官方文档的做法给滚动块设置宽…

STM32单片机语音识别台灯控制系统人检测亮度调节

实践制作DIY- GC00156-语音识别台灯控制系统 一、功能说明&#xff1a; 基于STM32单片机设计-语音识别台灯控制系统 二、功能说明&#xff1a; 电路&#xff1a;STM32F103C系列最小系统串口语音识别模块LED灯板1个红外传感器 1.任何时候没有人则关闭灯。有人可以自动打开灯。…

LIS检验信息系统

LIS检验信息系统是以病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标&#xff0c;将医学检验、科室管理和财务统计等工作进行整合&#xff0c;全面改善检验科室的工作现状。 LIS把检验、检疫、放免、细菌微生物及科研使用的各类分析仪器&#xff0c;通…

pandas的DataFrame转存MATLAB的mat格式

有的时候需要把 pandas 处理好的 DataFrame 进一步交给MATLAB来处理。当然可以保存成 excel 文件&#xff0c;不过当数据量比较大的时候&#xff0c;读取比较慢&#xff0c;这个时候转存成 MATLAB 可读的 mat 文件更合适&#xff08;MATLAB 能快速读取&#xff09;。 标准的操…

接口自动化测试的最佳工程实践 (ApiTestEngine)

目录 前言&#xff1a; 背景 核心特性 特性拆解介绍 写在后面 前言&#xff1a; 接口自动化测试是现代软件开发中不可或缺的一环。一个良好的测试框架和最佳工程实践可以提高测试效率和质量。 背景 当前市面上存在的接口测试工具已经非常多&#xff0c;常见的如Postman…

建筑结构健康监测常见问题及解决措施

建筑结构健康监测(SHM)是指利用无损传感技术&#xff0c;通过对结构特性进行分析&#xff0c;达到检测结构损伤或退化的目的&#xff0c;是当前守护建筑安全的一种新型技术手段&#xff0c;通过建筑结构健康监测管理者可以直观的了解到建筑物的健康状态&#xff0c;为建筑维护和…

【力扣算法13】之 12. 整数转罗马数字 python

文章目录 问题描述示例1示例2 示例 3:示例 4:示例 5:提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果 完结 问题描述 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符数值I1V5X…

AP5193 DC-DC宽电压LED降压恒流驱动器 LED电源驱动IC

产品 AP5193是一款PWM工作模式、外围简单、内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度降压LED恒流驱动芯片。电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光脚有效电压范围0.55-2.6V.AP5193 工作频率可以通过RT 外部电阻编程来设定&#xff0c;同时…

centos环境搭建nsq集群

简言 1. nsq是go语言开发的实时的分布式消息处理平台&#xff0c;目的是用来大规模地处理每天数以十亿计级别的消息。它具有分布式和去中心化拓扑结构&#xff0c;该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征 2. nsq官网地址 NSQ Docs 1.2.1 …