Sentinel使用教程

news2025/1/15 23:56:37

文章目录

    • 一、Sentinel简介
    • 1.sentinel介绍
    • 2.sentinel应用场景
    • 3.sentinel与hystrix
    • 4.sentinel组件介绍
    • 二、Sentinel使用说明
    • 1.控制台Dashboard
    • 2.Sentinel 流量控制和熔断降级
    • 3.常见报错解决

一、Sentinel简介

1.sentinel介绍

Sentinel 是由阿里巴巴中间件团队开发的开源项目,是一种面向分布式微服务架构的轻量级高可用流量控制组件。

2.sentinel应用场景

Sentinel 主要以流量为切入点,从流量控制、熔断降级、系统负载保护、实时监控和控制台等多个维度来帮助用户提升服务的稳定性。

3.sentinel与hystrix

SentinelHystrix
隔离策略基于并发数线程池隔离/信号量隔离
熔断降级策略基于响应时间或失败比率基于失败比率
实时指标实现滑动窗口滑动窗口(基于 RxJava)
规则配置支持多种数据源支持多种数据源
扩展性多个扩展点插件的形式
基于注解的支持即将发布支持
调用链路信息支持同步调用不支持
限流基于 QPS / 并发数,支持基于调用关系的限流不支持
流量整形支持慢启动、匀速器模式不支持
系统负载保护支持不支持
实时监控 API各式各样较为简单
控制台开箱即用,可配置规则、查看秒级监控、机器发现等不完善
常见框架的适配Servlet、Spring Cloud、Dubbo、gRPC 等Servlet、Spring Cloud Netflix

4.sentinel组件介绍

(1)Sentinel 组成
①Sentinel 核心库:Sentinel 的核心库不依赖任何框架或库,能够运行于 Java 8 及以上的版本的运行时环境中,同时对 Spring Cloud、Dubbo 等微服务框架提供了很好的支持。
②Sentinel 控制台(Dashboard):Sentinel 提供的一个轻量级的开源控制台,它为用户提供了机器自发现、簇点链路自发现、监控、规则配置等功能。
(2)基本概念
①资源:资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如由应用程序提供的服务或者是服务里的方法,甚至可以是一段代码。
Sentinel 定义资源的方式有下面几种:适配主流框架自动定义资源、通过 SphU 手动定义资源、通过 SphO 手动定义资源、注解方式定义资源。这个稍后会有使用方法教程。

其中注解方式定义资源@SentinelResource参数介绍如下:

参数解释
valueSentinel资源的名称,我们不仅可以通过url进行限流,也可以把此值作为资源名配置,一样可以限流。
entryType条目类型(入站或出站),默认为出站(EntryType.OUT)
resourceType资源的分类(类型)
blockHandler块异常函数的名称,默认为空
blockHandlerClass指定块处理方法所在的类。默认情况下, blockHandler与原始方法位于同一类中。 但是,如果某些方法共享相同的签名并打算设置相同的块处理程序,则用户可以设置存在块处理程序的类。 请注意,块处理程序方法必须是静态的。
fallback后备函数的名称,默认为空
defaultFallback默认后备方法的名称,默认为空
defaultFallback用作默认的通用后备方法。 它不应接受任何参数,并且返回类型应与原始方法兼容
fallbackClassfallback方法所在的类(仅单个类)。默认情况下, fallback与原始方法位于同一类中。 但是,如果某些方法共享相同的签名并打算设置相同的后备,则用户可以设置存在后备功能的类。 请注意,共享的后备方法必须是静态的。
exceptionsToTrace异常类的列表追查,默认 Throwable
exceptionsToIgnore要忽略的异常类列表,默认情况下为空

②规则:围绕资源而设定的规则。Sentinel 支持流量控制、熔断降级、系统保护、来源访问控制和热点参数等多种规则,所有这些规则都可以动态实时调整。

二、Sentinel使用说明

1.控制台Dashboard

(1)下载地址,选择sentinel-dashboard-1.8.6.jar

下载即可。
(2)打开命令窗口,进入jar包存放目录,使用java -jar sentinel-dashboard-1.8.2.jar进行服务启动即可。
(3)登录网址:http://localhost:8080/,用户名密码为sentinel/sentinel
在这里插入图片描述

2.Sentinel 流量控制和熔断降级

(1)首先我们需要构建一个SpringBoot项目,项目结构如下:
在这里插入图片描述

(2)然后在pom.xml引入sentinel的依赖。

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

(3)application.yml配置

server:
  port: 8800
spring:
  #允许循环依赖
  main:
    allow-circular-references: true
  application:
    name: sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
        #指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer,
        #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
        #port: 8719

#暴露/actuator/sentinel端点
management:
  endpoints:
    web:
      exposure:
        include: '*'

(4)SentinelApplication.java,我这里没有修改

package com.example.sentinel;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SentinelApplication {

    public static void main(String[] args) {
        SpringApplication.run(SentinelApplication.class, args);
    }

}

(5)SentinelServerController.java,其中test()是对springboot的联通测试,resource1()是SphU定义资源测试,resource2()是流量监控测试,resource3()是熔断测试。

package com.example.sentinel.controller;

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.CircuitBreaker;
import com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.EventObserverRegistry;
import com.alibaba.csp.sentinel.util.TimeUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.text.SimpleDateFormat;
import java.util.Date;

@Controller
public class SentinelServerController {


    @RequestMapping(value = "/test")
    @ResponseBody
    public String test() {
        return "Sentinel server";
    }



    @RequestMapping(value = "/resource1")
    @ResponseBody
    public String resource1() {
        return resource1bySphU();
    }

    /**
     * 通过 SphU 手动定义资源
     * @return
     */
    public String resource1bySphU() {
        Entry entry = null;
        try {
            entry = SphU.entry("resource1bySphU");
            //您的业务逻辑 - 开始
            return "resource1";
            //您的业务逻辑 - 结束
        } catch (BlockException e1) {
            //流控逻辑处理 - 开始
            return "resource1 limit";
            //流控逻辑处理 - 结束
        } finally {
            if (entry != null) {
                entry.exit();
            }
        }
    }

    //
    @RequestMapping(value = "/resource2")
    //blockHandler 限流后走的方法
    @SentinelResource(value="resource2byAnnotation",
            blockHandler = "resource2Limit",fallback = "resource2Fallback")
    @ResponseBody
    public String resource2()  {
        return "resource2";
    }

    public String resource2Limit(BlockException exception){
        return "您点击太快了,稍后重试!";
    }

    @RequestMapping(value = "/resource3/{id}")
    //抛出异常时,提供 fallback 处理逻辑
    //处于熔断开启状态时,原来的主逻辑则暂时不可用,会走fallback的逻辑。
    //在经过一段时间(熔断时长)后,熔断器会进入探测恢复状态(HALF-OPEN),此时 Sentinel 会允许一个请求对原来的主业务逻辑进行调用
    //若请求调用成功,则熔断器进入熔断关闭状态(CLOSED ),服务原来的主业务逻辑恢复,否则重新进入熔断开启状态(OPEN)
    @SentinelResource(value="resource3byAnnotation",fallback = "resource3Fallback")
    @ResponseBody
    public String resource3(@PathVariable("id") int id)  {
        monitor();
        System.out.println("主逻辑");
        //这里模拟服务报错
        int defaultId = 5;
        if(id < defaultId){
            throw new RuntimeException ("服务异常");
        }
        return "resource3";
    }

    //注意fallback返回值类型必须与原函数一致;方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常;
    //fallback 函数默认需要和原方法在同一个类中,若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析
    public String resource3Fallback (int id){
        return "服务出错,请您先访问这里!";
    }

    /**
     * 自定义事件监听器,监听熔断器状态转换
     */
    public void monitor() {
        EventObserverRegistry.getInstance().addStateChangeObserver("logging",
                (prevState, newState, rule, snapshotValue) -> {
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    if (newState == CircuitBreaker.State.OPEN) {
                        // 变换至 OPEN state 时会携带触发时的值
                        System.err.println(String.format("%s -> OPEN at %s, 发送请求次数=%.2f", prevState.name(),
                                format.format(new Date(TimeUtil.currentTimeMillis())), snapshotValue));
                    } else {
                        System.err.println(String.format("%s -> %s at %s", prevState.name(), newState.name(),
                                format.format(new Date(TimeUtil.currentTimeMillis()))));
                    }
                });
    }


}





(6)测试流程
首先启动springBoot项目,测试resource1方法是否能正常调通。此时在控制台可以看到服务已经监测成功。
在这里插入图片描述

在这里插入图片描述
然后测试resource2方法,先测试resource2方法是否能正常调通。然后在控制台的簇点链路的resource2对应的服务中选择新增流控指标,这里是每秒调用两次就会触发。
在这里插入图片描述
新增完后在快速点击该链接,发现流控实现成功
在这里插入图片描述
最后测试resource3方法,先测试resource3方法是否能正常调通。我这里设置传参5以上服务调用成功,否则失败。
在这里插入图片描述
然后在控制台新增熔断设置,选择策略为异常数,这里代表在一秒内有两个以上请求失败两次以上则会熔断。
在这里插入图片描述
可以看到服务调用失败时成功触发了熔断机制,并且正确的调用和错误的调用重复几次,可以看到熔断状态的变化

在这里插入图片描述

在这里插入图片描述

3.常见报错解决

(1)dashboard控制器启动失败:Web server failed to start. Port 8080 was already in use
找到该端口的id然后杀掉该进程即可

 netstat -aon|findstr "8080"
 taskkill /pid 11596 /f

(2)The dependencies of some of the beans in the application context form a cycle:

org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration
┌─────┐
| com.alibaba.cloud.sentinel.SentinelWebAutoConfiguration (field private java.util.Optional com.alibaba.cloud.sentinel.SentinelWebAutoConfiguration.sentinelWebInterceptorOptional)
└─────┘

这是循环依赖问题,由于springBoot版本与cloud版本不匹配导致的,可以参考版本说明。
实在没有合适的版本可以采取粗暴的方式直接允许循环依赖。

spring:
  #允许循环依赖
  main:
    allow-circular-references: true

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

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

相关文章

Java三大特性篇之——继承篇(超详解的好吧!)

&#x1f60d;&#x1f60d;&#x1f60d;欢迎欢迎欢迎欢迎&#xff0c;我的朋友&#xff0c;答应我&#xff0c;看完好吗&#xff1f;&#x1f974; 文章目录前言&#xff1a;何为继承&#xff1f;不谈钱的继承实现&#xff01;嘘&#xff1a;偷偷访问父类的私密成员&#xff…

OkHttp相关知识(二)

okhttp中一次网络请求的大致过程&#xff1a; Call对象对请求的封装 dispatcher对请求的分发 getResponseWithInterceptors()方法 一、OkHttp同步方法总结&#xff1a; 创建OkHttpClient和构建了携带请求信息的Request对象将Request封装成Call对象调用Call的execute()发送…

【11.16】Codeforces 刷题

DP\text{DP}DP &#xff1a;&#xff08;今天做的这两道都没啥 DP 相关来着 D. Match & Catch 题意&#xff1a; 给定两个字符串 1≤∣s1∣,∣s2∣≤50001\leq |s_1|,|s_2|\leq 50001≤∣s1​∣,∣s2​∣≤5000 &#xff0c;求最短的满足各只出现一次的连续公共字串。 思…

实验27:红外遥控三级控速风扇实验

今天介绍一个稍微复杂点的实验,复杂在设计和代码 ——OK,受了抖音西湖大学教授刺激,任何人都可以做研究 ——实验:红外遥控三级风速小电扇 ——每按一下CH-,风速从1-2-3-1-2-3-1循环 ——按下CH+,风扇停止 ——没有背景音乐目的是听风扇声音大小判断风速 OK实验介绍完了…

五个可以永远相信的神仙网站推荐

早八的我们是不是偶尔会处在焦虑中呢&#xff1f;一方面年轻人工作压力大&#xff0c;另一方面我们偶尔会感慨我们的碌碌无为&#xff0c;不知道怎样提升自己。今天为大家推荐五个焦虑时可以随手打开看&#xff0c;不知不觉悄悄提升自己的软件。 1.全历史 全历史是一个把历史以…

《元宇宙2086》亮相金鸡奖中国首部元宇宙概念院线电影启动

2022年中国金鸡百花电影节暨第35届中国电影金鸡奖于11月10日至12日在福建厦门举办&#xff0c;中国动漫集团控股子公司北京中文发文化发展有限公司与《元宇宙2086》作者高泽龙在金鸡奖创投论坛正式签约&#xff0c;宣布将共同启动筹拍中国首部元宇宙概念的院线电影。 当日下午&…

如何在Docker中安装MySQL数据库

1、Docker环境 视频教程&#xff1a;https://www.bilibili.com/video/BV1xv4y1S7kA 2、搜索镜像 https://hub.docker.com/网站搜索MySQL&#xff0c;确定其安装版本&#xff0c;这里安装8.0.31版&#xff1b; 3、拉取镜像 [rootlocalhost ~]# docker pull mysql:8.0.31 8.…

市级专精特新的申报条件

一、基本条件&#xff1a;&#xff08;各市政策不同具体情况也不同&#xff0c;下面为济南市企业的申报条件&#xff09; 1、连续经营3年以上&#xff0c;上年度企业营业收入在800万元以上&#xff1b; 2、近两年营业收入复合增长率不低于8%&#xff08;2021年参照国 家级调…

Nginx 反向代理

title: Nginx 反向代理 date: 2022-11-16 10:24 tags: [Nginx,反向代理,正向代理,代理] 文章目录〇、问题一、前言二、正向代理&反向代理2.1 正向代理2.2 反向代理三、Nginx配置反向代理参考更新〇、问题 什么是正向代理&#xff1f;什么是反向代理&#xff1f;Nginx如何配…

Mysql之视图、索引【第五篇】

大纲&#xff1a; 一、视图 1、什么是视图&#xff1f; 1) MySQL 视图(View)是一种虚拟的表&#xff0c;是从数据库中一个或多个表中导出来的表。视图由列和行构成&#xff0c;行和列的数据来自于定义视图的查询中所使用的表&#xff0c;并且还是在使用视图时动态生成的。 …

【蓝桥杯物联网赛项学习日志】Day3 关于IIC

经过昨天的学习&#xff0c;已经了解和初步学会配置CubeMax进行初始化配置。今天就开始下一章节的学习&#xff0c;关于IIC。 关键词&#xff1a;I2C OLED SSD1306 理论基础 串行通信接口通讯方式分&#xff0c;可以分为两种&#xff0c;分别是同步和异步。按照数据的传输方…

组成目标货币的最少张数

1、题目 arr 是货币数组&#xff0c;其中的值都是正数。再给定一个正数 aim。 每个值都认为是一张货币&#xff0c;返回组成 aim 的最少张数。 注意&#xff1a;因为是求张数&#xff0c;所以每张货币认为是相同或不同就不重要了。 2、思路 假设 arr [3&#xff0c;1&…

GD32F450的时钟笔记

GD32F450 标称 200MHz&#xff0c;但是在手册中又说 它是 240MHz。本文以 手册中的 240MHz 进行举例&#xff0c;我保险起见&#xff0c;产品中使用还是在 200MHz 下使用。 时钟树 手册上的时钟树图如下 GD32F450的 外部时钟源 有2个 LXTAL 外部低速时钟源 32.768 kHzHXTAL …

微信小程序登录获取不到头像和昵称解决办法!

微信小程序登录获取不到头像和昵称主要原因是&#xff1a;小程序wx.getUserProfile接口被收回&#xff01; 大家可以按照文档操作↓ PS&#xff1a; 针对小程序wx.getUserProfile接口将被收回后做出的授权调整 小程序文档中提出的调整说明 对于此次变化&#xff0c;现将小…

怎么使用股票委托下单接口?

都知道&#xff0c;在进行量化交易的时候&#xff0c;交易接口可以100%严格按照定制的计划执行交易&#xff0c;避免了出现下单犹豫和过量交易等问题&#xff0c;100%体现交易策略的收益性&#xff1b;今天主要来聊聊&#xff0c;关于怎么使用股票委托下单接口的问题&#xff1…

使用c#将aj-report桌面化1

说到底,aj-report是个工具,我想大多数人还是想快速使用它来创建一个可以展示的工具。通过之前的章节,你应该可以制作自己的报表页面了,下面我们来看看怎么把aj-report包装成一个桌面能够运行的软件。 当然作为扩展开发,受开源协议限制,我们不能大规模修改aj-report的源代…

[附源码]java毕业设计基于新高考模式下的排课系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

程序员“中年危机”?不,也可能是“人生转机”

程序员行业新技术发展迅猛&#xff0c;可以说是日新月异。也正是这个原因&#xff0c;中年危机成为我们必须面对和攻克的问题。 思考一个问题&#xff1a;那些能工作到45、50、甚至60的程序员们&#xff0c;究竟具备了哪些过人的能力&#xff1f; 就我过去的经历和观察来说&a…

【蓝桥杯真题练习】STEMA科技素养练习题库 答案版015 持续更新中~

1、牛顿运动定律描述了物体运动符合的规律,被誉为经典力学的基石。以下关于牛顿定律的描述中,不正确的选项是( )。 A、牛顿运动定律一共有三条 B根据牛顿定律,没有受到外力作用的物体运动速度会保持不变 C根据牛顿运动定律,两个物体作用于对方的力大小一定相等 D牛…

项目运营后阶段发力

前言 我记得之前有人跑过来问我&#xff1a;你知道为啥字节面试总会考算法吗&#xff1f;我没有回答&#xff0c;一方面是算法是大厂必考的东西&#xff0c;既然是必须的东西究竟个为什么有点白费心机&#xff0c;第二方面我没有进去过字节&#xff0c;所以我也拿捏不准为什么。…