谷粒商城のsentinelzipkin

news2024/11/5 14:45:10

文章目录

  • 前言
  • 一、Sentinel
    • 1、什么是Sentinel
    • 2、项目配置
    • 3、使用案例
      • 3.1、流控
      • 3.2、降级
      • 3.3、黑白名单设置
  • 二、Zipkin
    • 1、什么是Zipkin
    • 2、项目配置
    • 3、整合案例


前言

  本篇介绍Spring Cloud Ali的sentinel组件,用于对微服务的熔断降级,以及链路追踪zipkin的使用,对应视频P326-P338。本篇为谷粒商城分布式高级部分的最后一篇,重点在于sentinel和zipkin在项目中的运用。后续更新集群部署篇


一、Sentinel

1、什么是Sentinel

  Sentinel是Spring Cloud Ali的组件,主要用于分布式系统中的流量控制、熔断降级和系统监控。在原生Spring Cloud中,是Hystrix承担着同样的作用。Sentinel 的主要概念和功能:

  1. 流量控制:Sentinel 通过限流策略控制请求的数量,其中常见的限流策略有:QPS(每秒请求数),并发线程数,令牌桶和漏斗算法。
  2. 熔断与降级:在系统出现异常(如请求超时或错误率过高)时,Sentinel 可以自动触发熔断机制,拒绝后续请求以保护系统。降级功能允许你在系统负载过高时,自动将某些服务的请求转向较简单的处理,保障系统的整体可用性。

  其中限流策略,QPS是通过控制台设定某个资源每秒允许的最大请求数量,超出这个数量的请求会被拒绝或延迟。而并发线程数则是通过限制同一时刻可以处理的请求数量来实现流量控制。令牌桶算法则是请求的到来需要从桶中获取令牌。令牌以固定的速率生成,当请求到来时,需要消耗一个令牌才能通过。如果没有可用的令牌,请求会被拒绝或延迟。漏斗算法通过维护一个“漏斗”来控制请求的流入速率。请求以恒定的速率流入漏斗,当请求超过漏斗容量时,多余的请求会被拒绝。
  而熔断主要体现在,A服务调用B服务,如果B服务长时间没有返回响应,或者直接出现错误,则会直接返回失败,后续A也不会再调用B服务了。在熔断状态持续一段时间后,熔断器会进入“半开”状态。在这个状态下,系统会允许一部分请求(例如,1%或2%的请求)尝试访问该服务,以检查服务是否已恢复。如果这些请求成功,则熔断器会完全恢复,重新允许所有请求。如果请求仍然失败,熔断器将保持熔断状态,继续拒绝请求。降级主要体现在,例如双11电商系统访问量激增,而主要的业务可能体现在下单,秒杀,后端服务可能无法承受大量请求。此时可以选择对一些非核心功能进行降级,将用户的某些请求引导到默认的页面(实现服务的基本可用)。

2、项目配置

  需要在项目中运用Sentinel,首先引入依赖(我是直接加入到了common模块下,注意,common模块中加入了某项依赖,除了需要刷新common模块,还需要刷新所有引用了common模块的微服务maven,否则可能不会生效):

			<!--        开启sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--        sentinel的图表统计-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.1.8.RELEASE</version>
        </dependency>

  并且配置文件中加入:

# 控制台的端口号
spring.cloud.sentinel.transport.dashboard=localhost:8080
spring.cloud.sentinel.transport.port=8719
#使用 * 表示允许所有管理端点都被暴露。即所有可用的 Actuator 端点都将通过 web 访问。
management.endpoints.web.exposure.include=*
## 开启远程调用支持
feign.sentinel.enabled=true

  如果需要在网页上通过可视化界面进行操作,则需要下载sentinel的dashboard,使用java -jar 运行,默认是8080端口。如果有冲突可以自行修改:
在这里插入图片描述  访问localhost:8080进入控制台

3、使用案例

3.1、流控

  启动服务,在浏览器中直接访问某个链接:
在这里插入图片描述  在控制台配置流控规则:
在这里插入图片描述  设置1s只能访问一次:
在这里插入图片描述  同时可以自定义配置降级页面;

@Configuration
public class SeckillSentinelConfig {

    public SeckillSentinelConfig() {
        WebCallbackManager.setUrlBlockHandler((httpServletRequest, httpServletResponse, e) -> {
            R error = R.error(ExceptionEnum.TOO_MANY_REQUEST_EXCEPTION.getCode(), ExceptionEnum.TOO_MANY_REQUEST_EXCEPTION.getValue());
            httpServletResponse.setContentType("application/json;charset=utf-8");
            httpServletResponse.getWriter().write(JSON.toJSONString(error));
        });
    }
}

  1s内多次刷新页面,说明流控规则生效:
在这里插入图片描述  sentinel也提供了多种定义受保护资源的方式,包括jdk8的新特性try-with-resource,以及@SentinelResource注解:
  try-with-resource定义受保护资源的用法:

    public SecKillSkuRedisTO getCurrentSeckillSkuById(Long skuId) {
        //定义受保护的资源方式一
        try(Entry entry = SphU.entry("getCurrentSeckillSkuById")) {
 					//自己的业务逻辑
        } catch (BlockException e) {
            log.info("{}:流控规则生效","getCurrentSeckillSkuById");
        }
        return null;
    }

  @SentinelResource注解定义受保护资源的用法:

    /**
     * 创建流控规则方式二
     * @param ex
     * @return
     */
    public List<SecKillSkuRedisTO> CurrentSeckillSkusHandler(BlockException ex) {
        log.info("{}:流控规则生效","getCurrentSeckillSkus");
        return null;
    }

    @Override
    @SentinelResource(value = "getCurrentSeckillSkus",blockHandler = "CurrentSeckillSkusHandler")
    public List<SecKillSkuRedisTO> getCurrentSeckillSkus() {
     	//自己的业务逻辑
    }

3.2、降级

  可基于响应时间,异常数,异常比例设定降级策略:
  例如基于异常数,如图所示,只要出现1个异常,就触发降级,降级持续时间为1000ms:
在这里插入图片描述  对于被保护的资源,手动抛出一个异常:

    @GetMapping("/currentSeckillSkus")
    public R getCurrentSeckillSkus(){
        int i = 1/0;
        List<SecKillSkuRedisTO> secKillSkuRedisTOS =  secKillSkuService.getCurrentSeckillSkus();
        return R.ok().put("data",secKillSkuRedisTOS);
    }

  由于出现了异常,第一次访问就出现了自定义的降级提示,也就是降级的操作生效了
在这里插入图片描述

3.3、黑白名单设置

  sentinel也支持对于访问受保护资源的权限进行控制,例如假设我访问的路径中包含currentSeckillSkus,则不允许访问,直接返回失败,则需要进行配置:

@Component
public class RequestOriginParserImpl implements RequestOriginParser {


    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        String requestURI = httpServletRequest.getRequestURI();
        if (requestURI.contains("/currentSeckillSkus")) {
                return "blackList";
        }
        return "whiteList";
    }
}

  控制台加入流控应用
在这里插入图片描述  再次访问被拦截,直接进入失败页面
在这里插入图片描述  以上就是关于sentinel的简单用法的案例演示,同时需要提醒注意的是,在 Sentinel 中,默认情况下流控规则和配置是在内存中存储的,因此每次应用重启后,原有的流控规则会丢失。所以我们需要配置持久化策略,常见的有持久化入数据库,或是Redis。
  而对于feign远程调用的熔断,个人理解通常应该是在调用方进行设置。如果设置在被调用方,可能会存在一种情况,即A和B两个服务同时调用C,而A对于C的访问频率大于B对于C的访问频率,如果是在C进行熔断设置,则有可能导致B无法正常访问C。


二、Zipkin

1、什么是Zipkin

  Zipkin是一个用于链路追踪的组件,可以追踪一个请求在微服务架构中的整个生命周期,包括其经过的服务、调用时间和执行顺序,并且提供了详细的执行时间信息以及错误记录。
  下面介绍几个Zipkin 中的概念:

  • Span 是 Zipkin 中的基本概念,表示一次请求的执行过程。每个 Span 包含信息,如开始时间、结束时间、执行状态和标签等。一个请求通常由多个 Span 组成,每个服务调用都生成一个 Span。
  • Trace 是由一系列相关的 Span 组成的完整请求路径。一个 Trace 描述了请求在微服务中的完整执行过程。
  • 在 Span 中,开发者可以添加不同的注解(Annotations),用于记录特定事件(如请求开始、结束、错误等)。这些注解可以帮助更好地理解请求的执行过程。

  Span中的Annotations有:

  1. cs (Client Send):表示客户端发送请求的时间。
  2. cr (Client Receive):表示客户端接收到响应的时间。
  3. ss (Server Send):表示服务器发送响应的时间。
  4. sr (Server Receive):表示服务器接收到请求的时间。

  通过sr-cs,可以计算出发送请求所消耗的时间,通过ss-cr,可以计算出服务端处理业务消耗的时间,通过cr-ss,可以计算出响应请求消耗的时间。
  在Zipkin中如何自定义一个Annotations?下面是一个简单的案例:

@Service
public class MyService {

    @Autowired
    private Tracer tracer;

    public void myMethod() {
        // 获取 Span,并开始一个新的 Span
        Span span = tracer.nextSpan().name("myMethod").start();

        try {
            // 添加自定义 Annotation
            span.annotate("Starting processing"); // 自定义开始处理的注解

            // 模拟处理逻辑
            processBusinessLogic();

            span.annotate("Processing completed"); // 自定义处理完成的注解
        } catch (Exception e) {
            span.error(e); // 记录异常
        } finally {
            span.finish(); // 结束 Span
        }
    }

    private void processBusinessLogic() {
        // 业务处理逻辑
    }
}

2、项目配置

  在docker或本地安装Zipkin服务器,实现页面可视化监控

docker run -d -p 9411:9411 openzipkin/zipkin

  引入依赖:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

  配置文件中添加:

logging.level.org.springframework.cloud.openfeign: debug
logging.level.org.springframework.cloud.sleuth: debug
spring.zipkin.base-url= http://自己的虚拟机地址:9411/
#不将zipkin自身进行注册
spring.zipkin.discovery-client-enabled=false
spring.zipkin.sender.type=web
#抽样统计因子,1为全部统计
spring.sleuth.sampler.probability=1

3、整合案例

  整合完成后重启项目,执行业务,登录控制台页面,即可查看对应业务调用的链路信息,包括开始时间,结束时间,远程调用,异步调用信息,都会有所体现。
在这里插入图片描述

下一篇:k8s

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

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

相关文章

WPF+MVVM案例实战(十九)- 自定义字体图标按钮的封装与实现(EF类)

文章目录 1、案例效果1、按钮分类2、E类按钮功能实现与封装1.文件创建与代码实现2、样式引用与封装 3、F类按钮功能实现与封装1、文件创建与代码实现2、样式引用与封装 3、按钮案例演示1、页面实现与文件创建2、运行效果如下 4、源代码获取 1、案例效果 1、按钮分类 在WPF开发…

keepalived + nginx 实现网站高可用性(HA)

keepalive 一、keepalive简介二、实现步骤1. 环境准备2. 安装 Keepalived3. 配置 Keepalived 双机主备集群架构4. 配置 Nginx5. 启动Keepalived6. 测试高可用性7. 配置keepalived 双主热备集群架构 一、keepalive简介 目前互联网主流的实现WEB网站及数据库服务高可用软件包括&a…

破局智能制造:难点分析与对策

一、 智能制造过程中可能遇到难点: 1. --概念和技术繁多--: - 智能制造领域涉及众多概念和技术,如工业4.0、CPS、工业互联网等,让企业难以选择和应用。 2. --缺乏经验和成功案例--: - 企业在推进智能制造时缺乏经验,存在信息孤岛、自动化孤岛等问题,缺乏统一规划和系统推…

中汽测评观察 亲子出行健康为先,汽车健康用材成重要考量

在中国&#xff0c;亲子出行是驾车的主要场景之一。汽车不仅仅是一种便捷的交通工具&#xff0c;更是生活中的移动“第三空间”。在此背景下&#xff0c;汽车健康用材不仅是消费者关注的焦点问题&#xff0c;也成为汽车企业发力的重要方向。 对消费者而言&#xff0c;在家庭亲子…

阿里巴巴Seata分布式事务解决方案

Seata是什么 Seata是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 当开发框架为spring boot或者SSM&#xff0c;都可以使用Seata进行开发。 分布式事务是什么 在大型架构中&#xff0c;一般会把一个应用系统&#x…

Cuebric:用AI重新定义3D创作的未来

一、简介 Cuebric 是一家成立于2022年夏天的好莱坞创新公司,致力于为电影、电视、游戏和时尚等行业提供先进的AI多模态SaaS平台。自2024年1月正式推出以来,Cuebric 已经在市场上获得了广泛的认可和积极的反馈。目前,该平台正处于1.0版本的beta测试阶段,已募集约50万美元的…

【Spring IoCDI】IoC容器,IoC注解,Bean的使用

【Spring核心思想:IoC】 spring是一个开源框架&#xff0c;支持广泛的应用场景&#xff0c;简而言之:Spring是包含了众多工具方法的IoC容器 【IoC】 IoC的意思是「控制反转」&#xff0c;也就是说Spring是一个“控制反转”的容器 通用程序的实现代码&#xff0c;类的创建顺序…

Android笔记(三十一):Deeplink失效问题

背景 通过deeplink启动应用之后&#xff0c;没关闭应用的情况下&#xff0c;再次使用deeplink会失效的问题&#xff0c;是系统bug导致的。此bug仅在某些设备&#xff08;Nexus 5X&#xff09;上重现&#xff0c;launchMode并且仅当应用程序最初通过深层链接启动并再次通过深层…

深入理解Transformer中的位置编码

1 位置编码的作用 由于注意力的作用机制&#xff0c;不论输入序列的顺序如何&#xff0c;输出结果都是一样的。 也就是丢失了位置信息。 但是对于语言模型&#xff0c; 我们都知道顺序是很重要的&#xff0c; 所以需要对输入序列额外注入位置信息。 2 位置编码方式 Transfor…

Ansible 部署应用

Ansible Ansible 是基于 Python 开发&#xff0c;集合了众多优秀运维工具的优点&#xff0c;实现了批量运行命令、部署程序、配置系统等功能的自动化运维管理工具。默认通过 SSH 协议进行远程命令执行或下发配置&#xff0c;无需部署任何客户端代理软件&#xff0c;从而使得自动…

根据问题现象、用户操作场景及日志打印去排查C++软件问题,必要时尝试去复现问题

目录 1、概述 2、通过现有信息无法定位问题时&#xff0c;则需要尝试去复现问题 3、非崩溃问题与崩溃问题的一般排查思路 3.1、非崩溃问题的排查思路 3.2、崩溃问题的排查思路 4、难以复现问题的可能原因总结 4.1、问题难以复现&#xff0c;可能和某种特殊的业务场景或操…

STL——string(2)

博客ID&#xff1a;LanFuRenC系列专栏&#xff1a;C语言重点部分 C语言注意点 C基础 Linux 数据结构 C注意点 今日好题 声明等级&#xff1a;黑色->蓝色->红色 欢迎新粉加入&#xff0c;会一直努力提供更优质的编程博客&#xff0c;希望大家三连支持一下啦 目录 1) …

Spark的集群环境部署

一、Standalone集群 1.1、架构 架构&#xff1a;普通分布式主从架构 主&#xff1a;Master&#xff1a;管理节点&#xff1a;管理从节点、接客、资源管理和任务 调度&#xff0c;等同于YARN中的ResourceManager 从&#xff1a;Worker&#xff1a;计算节点&#xff1a;负责利…

【大数据学习 | kafka】kafka的数据存储结构

以上是kafka的数据的存储方式。 这些数据可以在服务器集群上对应的文件夹中查看到。 [hexuanhadoop106 __consumer_offsets-0]$ ll 总用量 8 -rw-rw-r--. 1 hexuan hexuan 10485760 10月 28 22:21 00000000000000000000.index -rw-rw-r--. 1 hexuan hexuan 0 10月 28 …

【Leecode】Leecode刷题之路第40天之组合总和II

题目出处 40-组合总和II-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 40-组合总和II-官方解法 方法1&#xff1a;回溯 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&…

网络编程入门——网络原理初识

一、网络发展史 1.1 独立模式 即计算机之间相互独立&#xff0c;互不连通的。 1.2 网络互联 即将多台计算机连接在一起&#xff0c;完成数据共享。 数据共享本质是⽹络数据传输&#xff0c;即计算机之间通过⽹络来传输数据&#xff0c;也称为⽹络通信。 根据网络互联规模的不…

关于爬虫需要了解的基础知识 (一、 http协议)

声明 文章仅供学习与交流&#xff01;严禁用于任何商业与非法用途&#xff01;否则由此产生的一切后果均与作者无关&#xff01; 一、何为爬虫 爬虫&#xff08;Crawler&#xff09;是一种按照既定规则&#xff0c;在网络上自动爬取信息的程序或脚本&#xff0c;也称为网际网…

VidPanos:从随手拍摄的平移视频生成全景视频

在当今数字化时代,视频拍摄已经成为人们记录生活和分享经历的重要方式。然而,普通手机拍摄的视频往往受到视角的限制,无法完整地展现一个广阔的场景。今天,我们要介绍的 VidPanos 技术,为解决这个问题提供了一种创新的方法。 VidPanos 是由来自华盛顿大学、谷歌 DeepMind…

【05】如何解决tomcat命令提示符控制台乱码问题

Web项目开发过程中&#xff0c;直接在命令提示符窗口中通过输入startup.bat命令运行tomcat&#xff0c;在新弹出的tomcat命令提示符窗口中输出的中文是乱码问题的处理。 如何解决tomcat命令提示符控制台乱码问题 文章目录 如何解决tomcat命令提示符控制台乱码问题1.解决问题思路…

02- 模块化编程-003 LCD1602液晶显示时间与日期

1、液晶显示电路 2、电路原理简介 1. 电路组件与功能 PIC单片机&#xff08;PIC16F887&#xff09;&#xff1a; 主控制器&#xff0c;负责处理输入输出。 LCD显示屏&#xff08;LM061&#xff09;&#xff1a; 驱动数码管显示器&#xff0c;以显示时间和日期信息。 支持多个段…