Sentinel组件学习

news2024/11/15 6:52:36

Sentinel组件学习

    • 1. Sentinel是什么
    • 2. Sentinel的作用
    • 3. 为啥使用Sentinel
    • 4. SpringCloud整合Sentinel代码示例
      • 4.1. 搭建Sentinel Dashboard
      • 4.2. SpringCloud项目接入Sentinel
      • 4.3. 使用@SentinelResource注解
    • 5. Sentinel Dashboard使用
      • 5.1 流控规则
        • 流控模式
        • 流控效果
      • 5.2 熔断规则
        • 熔断策略
      • 5.3 热点规则
      • 5.4 授权规则
      • 5.5. 自定义异常处理
      • 5.6 openFegin使用Sentinel

1. Sentinel是什么

​ Sentinel是阿里巴巴开源的一款面向分布式系统的实时监控和自动化故障恢复工具。它主要用于流量控制熔断降级系统负载保护,旨在帮助开发者有效地保护应用程序,防止故障和异常情况的发生。Sentinel不仅支持Java语言,还提供了Go、C++等多语言的原生实现,广泛应用于微服务架构中。

常见的容错解决方案

方案名描述
隔离将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。当有故障发生时,
能将问题和影响隔离在某个模块内部,不波及其它模块。常见的隔离方式有:线程池隔离和信号量隔离.
超时在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断
开请求,释放掉线程。
限流限流就是限制系统的输入和输出流量已达到保护系统的目的。为了保证系统的稳固运行,一旦达到的需要
限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的。
熔断在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,
可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断。
降级降级其实就是为服务提供一个托底方案,一旦服务无法正常调用,就使用托底方案。

2. Sentinel的作用

Sentinel提供了以下几个核心功能:

  1. 实时监控:Sentinel可以监控分布式系统中的各种指标,如QPS(每秒查询率)、CPU、内存等,并提供实时的监控数据和报警功能。
  2. 流量控制:根据系统的负载情况动态调整流量,以保证系统的稳定性和可靠性。
  3. 熔断降级:当系统负载过高或某个服务出现故障时,Sentinel可以自动熔断降级,减少对整体系统的影响。
  4. 系统负载保护:通过多种手段保护系统不被过载请求压垮。
  5. 热点流量防护:对热点参数进行流量控制,防止流量突增导致的系统崩溃。

3. 为啥使用Sentinel

相较于传统的熔断降级工具如Hystrix,Sentinel具有以下优势:

  1. 更广泛的应用场景:Sentinel不仅适用于Spring Cloud,还适用于Dubbo、gRPC、Servlet等多种应用场景。
  2. 更丰富的功能:Sentinel除了熔断降级、流量控制外,还提供了系统保护、热点流量防护、授权等多种功能。
  3. 灵活的规则配置:Sentinel提供了丰富的规则配置功能,支持动态调整,易于管理和维护。
  4. 高效的性能:Sentinel采用了高效稳定的设计和实现,可以在大规模分布式系统中运行良好。
  5. 开源免费和社区支持:Sentinel是一款开源软件,可以免费使用和修改,并且拥有一个活跃的开源社区,开发者可以获得持续的支持和帮助。
SentinelHystrixresilience4j
隔离策略线程池隔离/信号量隔离信号量隔离 (并发线程数限流)信号量隔离
熔断降级基于异常比率、响应时间基于异常比率基于异常比率、异常数
实时统计滑动窗口 (LeapArray)滑动窗口 (基于 RxJava)Ring Bit Buffer
动态规限支持多种数据源有限支持支持多种数据源类型
扩展性多个扩展点,插件的形式接口的形式基于注解的支持
限流基于QPS,支持基于调用关系的限流有限的支持Rate Limiter
流量整形支持预热模式、匀速器模式、预热排队简单的 Rate Limiter不支持
系统自适应保护支持不支持不支持
控制台提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现简单的监控查看不提供控制台,可对接其他监控系统

4. SpringCloud整合Sentinel代码示例

4.1. 搭建Sentinel Dashboard

首先,需要下载Sentinel Dashboard的jar包,并启动Dashboard服务。

sentinel 提供一个轻量级的控制台, 它提供机器发现、单机资源实时监控以及规则管理等功能。

1 下载jar包,解压到文件夹

https://github.com/alibaba/Sentinel/releases

2 启动控制台

# 下载Sentinel Dashboard jar包  
# 启动Dashboard服务  (这里使用静默启动) 
nohup java -Dserver.port=8081 -Dcsp.sentinel.dashboard.server=localhost:8081 -Dproject.name=sentinel-dashboard -jar /home/sentinel-dashboard-1.8.8.jar >nohuout &

3 访问请求

启动后,你可以在浏览器中通过访问 http://localhost:8081(或者你指定的端口)来访问 Sentinel Dashboard。默认的用户名和密码都是 sentinel
在这里插入图片描述

4.2. SpringCloud项目接入Sentinel

在SpringCloud项目中引入Sentinel的依赖,并配置Dashboard地址。

pom.xml

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

application.yml

spring:  
  cloud:  
    sentinel:  
      transport:  
        # 项目使用该端口与Sentinel dashboard应用进行数据交互
        port: 8719  
        # Sentinel dashboard应用访问地址
        dashboard: localhost:8080
        

4.3. 使用@SentinelResource注解

在需要保护的方法上使用@SentinelResource注解,并指定资源名称和限流规则。

@Service  
public class UserServiceImpl implements UserService {  
  
    @Override  
    @SentinelResource(value="getUserById",blockHandler="限流方法",fallback="熔断方法")  
    public User getUserById(Long id) {
        return userDao.selectById(id);  
    }  
}
属性名称类型是否必填描述
value/nameString资源名称,用于在 Sentinel 控制台中标识和配置该资源。
blockHandlerString对应的 block 异常处理函数名称。当资源被限流、降级或系统保护时,会调用此函数。
blockHandlerClassClass<?>当 blockHandler 函数位于其他类时,需要指定该类。注意,对应的函数必须是 static 的。
fallbackString对应的 fallback 函数名称。当资源调用失败(如超时、异常等)时,会调用此函数进行回退处理。
fallbackClassClass<?>当 fallback 函数位于其他类时,需要指定该类。注意,对应的函数必须是 static 的。
defaultFallbackString否(自1.6.0起)默认的 fallback 函数名称,用于通用的 fallback 逻辑。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。
entryTypeEntryType资源的 entry 类型,默认为 EntryType.OUT,表示出站资源。还可以设置为 EntryType.IN 表示入站资源(如 Web 请求)。
exceptionsToIgnoreClass<? extends Throwable>[]否(自1.6.0起)指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

5. Sentinel Dashboard使用

我们可以在Sentinel Dashboard中配置流控规则(限流策略)、熔断规则(熔断策略)、热点规则(热点数据限流规则)。配置成功启动项目,随便访问一个接口,看控制台效果:。数据基于默认内存存储,被监控项目重启监控数据会被清掉(可以修改为ZooKeeper、redis、nacos、apollo)
在这里插入图片描述

5.1 流控规则

在这里插入图片描述

字段名说明默认值
resource资源名,资源名是限流规则的作用对象
count限流阈值,即允许的请求数量或线程数
grade限流阈值类型,可以是QPS或线程数模式QPS 模式, 示例:单机阈值为1时候,如果每秒请求数量大于1则会触发限流规则
并发线程数,示例:单机阈值为1,如果并发请求超过1则会触发限流规则
limitApp流控针对的调用来源,用于区分不同应用default,代表不区分调用来源
strategy调用关系限流策略:直接、链路、关联根据具体实现和版本可能有所不同,这里不提供默认值
controlBehavior流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流直接拒绝
流控模式
  1. 直接模式
    • 定义:直接模式是最基本的流控模式,它直接针对当前资源进行流量控制,通过设置QPS(每秒查询率)或并发线程数等阈值来限制资源的访问。
    • 特点:适用于需要对单个资源进行严格控制的场景,如API接口、微服务等。
    • 应用:在直接模式下,当资源的实际流量超过配置的阈值时,Sentinel将拒绝或降级该资源的访问请求,以保护系统不受过大流量的冲击。
  2. 关联模式
    • 定义:关联模式是一种更为灵活的流控方式,它允许将多个相关的资源进行关联,并在整体上进行流量控制。
    • 特点:通过定义资源之间的关联关系,当某个资源的访问达到一定限制时,会触发关联的其他资源的流控,以适应多资源之间的复杂交互。
    • 应用:例如,在电商系统中,当订单支付接口的访问量达到阈值时,可以关联限制商品查询接口的访问,以防止系统因资源分配不均而崩溃。
  3. 链路模式
    • 定义:链路模式主要适用于微服务架构中的流量控制,它基于整个调用链路进行流量控制,确保整个系统的稳定性。
    • 特点:链路模式可以识别并控制整个请求链路中的流量,从而有效地应对分布式系统中可能出现的问题。
    • 应用:在微服务架构中,不同服务之间的调用关系复杂,链路模式可以确保在整个调用链路中,资源的访问不会超过预设的阈值,从而保护系统的稳定性。
流控效果
  1. 快速失败
    • 定义:当流量超过设定的阈值时,新的请求会被立即拒绝,并抛出异常(如FlowException)。
    • 特点:这是一种简单的流控效果,能够快速响应流量激增的情况,避免系统过载。
    • 应用:适用于对系统稳定性要求较高的场景,如核心接口、高频接口等。
  2. 预热模式(Warm Up)
    • 定义:预热模式是一种更为平滑的流控效果,它允许系统在启动时或流量突然增大时,逐渐放宽限流策略,使系统从空闲状态过渡到繁忙状态。
    • 特点:通过设置一个预热时长和冷却因子,系统在预热期内逐渐提高流量阈值,从而避免系统在短时间内因流量激增而崩溃。
    • 应用:适用于系统启动初期或需要应对突发流量的场景,如秒杀系统、抢购活动等。
  3. 排队等待
    • 定义:排队等待模式允许所有请求按照先后次序排队执行,但两个请求的间隔不能小于指定时长。
    • 特点:这种流控效果可以在一定程度上缓解流量峰值对系统的冲击,但也可能导致请求响应时间延长。
    • 应用:适用于对系统响应时间有一定容忍度的场景,如非实时性业务、后台任务等。

5.2 熔断规则

在这里插入图片描述

Field说明默认值
resource资源名,即规则的作用对象-
grade熔断策略,支持慢调用比例/异常比例/异常数策略慢调用比例
count慢调用比例模式下为慢调用临界RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值-
timeWindow熔断时长,单位为秒(s)-
minRequestAmount熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)5
statIntervalMs统计时长(单位为毫秒ms),如60*1000代表分钟级(1.8.0 引入)1000 ms
slowRatioThreshold慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)-
熔断策略
  1. 慢调用比例 (SLOW_REQUEST_RATIO)
    • 说明:当资源的响应时间超过设定的阈值时,将其视为慢调用。如果慢调用的比例超过设定的阈值,则触发熔断。
    • 重要属性:
      • count:慢调用临界RT(即响应时间阈值),超出此值的调用被统计为慢调用。
      • timeWindow:统计时间窗口,单位为秒,用于计算慢调用比例。
  2. 异常比例 (ERROR_RATIO)
    • 说明:当资源调用出现异常的比例超过设定的阈值时,触发熔断。
    • 重要属性:
      • count:异常比例阈值,范围是[0.0, 1.0],代表0%到100%的异常比例。
      • timeWindow:统计时间窗口,单位为秒,用于计算异常比例。
  3. 异常数 (ERROR_COUNT)
    • 说明:当资源调用在统计时间窗口内的异常数超过设定的阈值时,触发熔断。
    • 重要属性:
      • count:异常数阈值,即统计时间窗口内允许的最大异常数。
      • timeWindow:统计时间窗口,单位为秒。

每种熔断策略都允许设置timeWindow来定义统计时间窗口,以及触发熔断的阈值(如慢调用RT、异常比例或异常数)。Sentinel通过这些策略来保护系统,避免因为不稳定的服务或资源而导致整个系统的崩溃。

5.3 热点规则

Sentinel的热点规则(ParamFlowRule)用于控制对包含热点参数的资源调用的流量。热点参数规则可以针对包含特定参数的请求进行流量控制,以防止某个热点参数导致的流量过载。
在这里插入图片描述

以下是热点规则(ParamFlowRule)相关属性的列表及其说明:

属性名类型说明
resourceString资源名,必填项,用于标识受保护的热点资源。
gradeint限流模式。目前Sentinel热点参数限流支持QPS模式(0)。
countdouble限流阈值,针对参数索引的单个统计周期(如秒)内的请求数阈值。
durationInSecint统计时间窗口,单位为秒,默认是1秒。
controlBehaviorint流控效果,支持快速失败(0,默认)和匀速排队(1)。
paramIdxint热点参数的索引,在请求的参数列表中,从0开始计数。
paramFlowItemListList热点参数规则的详细列表,可以针对多个参数分别设置限流规则。

5.4 授权规则

基于调用方身份的黑白名单控制,以确保只有特定的调用方能够访问敏感资源。以下是授权规则(AuthorityRule)的相关属性:
在这里插入图片描述

  1. resource:资源名,即授权规则的作用对象。它指定了哪些资源需要应用此授权规则。
    • 这个属性是必填的,因为授权控制是针对特定的资源进行的。
  2. limitApp:对应的黑名单/白名单,这是授权规则的核心部分。它指定了哪些调用方(origin)被允许或拒绝访问资源。
    • 在白名单模式下,只有列在limitApp中的调用方才能访问资源。
    • 在黑名单模式下,列在limitApp中的调用方将被拒绝访问资源,而其他调用方则可以访问。
    • 不同的origin之间用逗号分隔,如"appA,appB"。
  3. strategy:授权类型,决定了listApp是作为白名单还是黑名单使用。
    • AUTHORITY_WHITE:白名单模式,只有列在limitApp中的调用方才能访问资源。
    • AUTHORITY_BLACK:黑名单模式,列在limitApp中的调用方将被拒绝访问资源。
    • 默认为白名单模式。

5.5. 自定义异常处理

​ 因为按照默认的实现,不管限流、熔断、热点,返回的值都是Blocked by Sentinel (flow limiting),自定义可以更好的处理对应的异常

//自定义异常
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
    /**
     * Handle the request when blocked.
     *
     * @param request  Servlet request
     * @param response Servlet response
     * @param e        the block exception
     * @throws Exception users may throw out the BlockException or other error occurs
     */
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        String msg = "未知异常";
        int status = 429;
 
        if (e instanceof FlowException) {
            msg = "请求被限流了";
        } else if (e instanceof ParamFlowException) {
            msg = "请求被热点参数限流";
        } else if (e instanceof DegradeException) {
            msg = "请求被降级了";
        } else if (e instanceof AuthorityException) {
            msg = "没有权限访问";
            status = 401;
        }
 
        response.setContentType("application/json;charset=utf-8");
        response.setStatus(status);
        response.getWriter().println("{\"msg\": " + msg + ", \"status\": " + status + "}");
    }
}

配置流控规则:单机,qps =1 1秒内请求超过1则出发控流规则
在这里插入图片描述

没有使用自定义异常控流

在这里插入图片描述

使用自定义异常

在这里插入图片描述

5.6 openFegin使用Sentinel

Sentinel 适配了 Feign 组件。

依赖:

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

添加配置:

#配置文件打开 Sentinel 对 Feign 的支持:
feign:
  sentinel:
    enabled: true

java代码

@FeignClient(name = "service-provider", fallback = EchoServiceFallback.class)
public interface EchoService {
    @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
    String echo(@PathVariable("str") String str);
}

@Component
public class EchoServiceFallback implements EchoService {
    @Override
    public String echo(@PathVariable("str") String str) {
        return "echo fallback";
    }


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

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

相关文章

cmake--get_filename_component

作用 按照指定的方式获取文件或者目录的信息。 使用 get_filename_component(<variable> <filename> <component>) variable: 用于保存提取的信息。 filename: 指定路径的文件或者目录。 component: 链接1 component DIRECTORY: 提取文件或者目录的父…

西安国际数字影像产业园:什么让这里成为创新型数字园区的典范?

在数字化浪潮奔涌的时代&#xff0c;创新型数字园区如雨后春笋般涌现&#xff0c;而树莓集团倾力打造的西安国际数字影像产业园无疑是其中的佼佼者。究竟是什么让这里成为创新型数字产业园区的典范呢&#xff1f; 1、西安国际数字影像产业园拥有强大的产业集聚效应。树莓集团凭…

『功能项目』QFrameWork道具栏物品生成【64】

我们打开上一篇63QFrameWork框架重构OnGUI的项目&#xff0c; OnGUI优点&#xff1a; 简单易用&#xff1a;OnGUI是基于代码的UI系统&#xff0c;对于简单的调试界面或者小型项目来说&#xff0c;可以快速实现UI需求。即时更新&#xff1a;OnGUI的UI元素是即时更新的&#xff…

基于Benes网络的SIMD同态密文任意重排

摘要 RLWE的密文使用了SIMD后极大的增加的同态加密的效率。同态加密通过加密一个向量&#xff0c;实现对明文的快速加法和乘法。然而&#xff0c;加密为一个密文的向量的内部元素之间&#xff0c;无法高效的操作。 如一个密文加密了 [ a , b , c ] [a,b,c] [a,b,c]&#xff0c…

13 vue3之内置组件keep-alive

内置组件keep-alive 有时候我们不希望组件被重新渲染影响使用体验&#xff1b;或者处于性能考虑&#xff0c;避免多次重复渲染降低性能。而是希望组件可以缓存下来,维持当前的状态。这时候就需要用到keep-alive组件。 开启keep-alive 生命周期的变化 初次进入时&#xff1a;…

使用express或koa或nginx部署history路由模式的单页面应用

使用hash模式会有#&#xff0c;影响美观&#xff0c;所以使用history模式会是个更好的选择。 前端项目打包上线部署&#xff0c;可以使用下面的方式部署history模式的项目&#xff0c;下面以 jyH5 为例 expressjs部署 express脚手架搭建的app.js中添加如下代码&#xff1a; …

大模型团队招人(校招):阿里巴巴智能信息,2025届春招来了!

阿里巴巴智能信息&#xff0c;2025届春招开始啦&#xff0c;欢迎有意向的优秀同学扫码投递。实习的内容也是大语言模型的核心方向Alignment&#xff0c;在这里有丰富的实验资源、良好的数据支持、优秀的师兄师姐带领你进入大模型的全新领域。内推直达&#xff1a;https://talen…

【Python】探索 Blinker:Python 进程内信号/事件分发系统

没人疼就去健身 &#xff0c;练完浑身疼&#xff01; 在现代软件开发中&#xff0c;事件驱动编程是一种非常强大的模式&#xff0c;它允许系统组件之间进行松散耦合的通信。Blinker 是一个 Python 库&#xff0c;提供了一个快速的进程内信号/事件分发系统&#xff0c;使得事件…

Double-Fetch漏洞检测工具的部署、使用与原理分析

文章目录 前言1、概述1.1、简介1.2、工作原理1.2.1、内核空间与用户空间的信息传递1.2.2、Double-Fetch漏洞产生的原因1.2.3、产生Double-Fetch漏洞的情况1.2.4、一个Double-Fetch漏洞示例1.2.5、Double-Fetch漏洞检测工具原理 1.3、模式匹配原理分析1.3.1、Coccinelle介绍1.3.…

AN7563PT数据手册学习笔记1

AN7563PT AN7563PT1 Overview2 Feature3 Block Diagram AN7563PT 1 Overview AN7563PT是一款高度集成的单芯片解决方案&#xff0c;适用于以太网网关应用。集成4个千兆以太网物理层、1个DDR4/DDR3控制器、1个USB3.0主机接口、1个USB2.0主机接口、2个PCIe Gen2单通道、1个VoIP…

什么是损失函数?常见的损失函数有哪些?

损失函数 什么是损失函数&#xff1f;损失函数作用如何设计损失函数常见的损失函数有哪些&#xff1f; 什么是损失函数&#xff1f; 损失函数&#xff08;Loss Function&#xff09;&#xff0c;也称为误差函数&#xff0c;是机器学习和深度学习中的一个重要概念。它用于衡量模…

光伏设计软件的基本功能

一、屋顶绘制 光伏设计软件的首要功能是屋顶绘制。通过直观易用的界面&#xff0c;可以轻松绘制出建筑物的屋顶轮廓、结构细节等基本信息。软件支持多种屋顶类型的绘制&#xff0c;并允许用户自定义屋顶尺寸和形状。 二、参照物、障碍物放置 在光伏系统设计中&#xff0c;参照…

2024考研数学真题解析-数二:

第一类间断点&#xff1a;可去间断点&#xff0c;跳跃间断点。 幂指函数x的取值范围是x>0。 接着分母不能为0推出x1&#xff0c;x2是间断点&#xff0c;由幂指函数x>0可知&#xff0c;x0也是间断点。 先求x0处的极限&#xff0c;这里没有必要求0左右两边的极限&#xff0…

如何下载旧版本app或者旧版本的电脑软件?下载旧版本手机app和电脑软件的方法

下载旧版本软件的方法介绍&#xff0c;下面以下载旧版本剪映为例&#xff1a;

Java标识符、关键字和保留字

Java中的标识符、关键字和保留字 标识符概念标识符命名规则&#xff08;必须遵守&#xff09;标识符命名规范&#xff08;更加专业&#xff09;关键字保留字 标识符概念 1.Java对各种变量、方法和类等命名时使用的字符序列称为标识符。 2.凡是自己可以起名字的地方都叫标识符 …

鸿蒙生态应用

鸿蒙生态应用开发核心概念 HarmonyOS 应用&#xff1a;使用 HarmonyOS SDK 开发的应用程序&#xff0c;能够在华为终端设备 &#xff08;如&#xff1a;手机、平板等&#xff09;上运行&#xff0c;其有两种形态&#xff1a; ⚫ 传统方式的需要安装的 App。 ⚫ 轻量级&#xf…

ABAP 一步一步教你添加ALV界面菜单功能按钮

ABAP 一步一步教你添加菜单功能按钮。 程序里面找到这个组件小按钮 就可以看到GUI状态了。 在修改GUI STATUS 是如果要添加一个功能按钮&#xff0c;必须先创建一个功能键&#xff08;具体参照下方&#xff09;&#xff0c;之后再在应用程序工具栏输入该功能键的功能码否则报…

(c++)线程的创建、互斥锁的使用、线程数组

1.创建10个线程&#xff0c;每个线程都做10万次全局变量num1操作&#xff0c;然后输出这个全局变量&#xff0c;预想结果应该是100万。但是线程可能在cpu分配的一个时间片中做不完10万次1的操作&#xff0c;这时候cpu会被其他线程抢占&#xff0c;由于num1不是一个原子操作&…

MySQL的缓存策略

目录 一、MySQL 缓存方案用来干什么 二、提升MySQL访问性能的方式 1、读写分离&#xff08;MySQL的主从复制&#xff09; 2、连接池 3、异步连接 三、缓存方案是怎么解决的 1、缓存与MySQL一致性状态分析 2、制定热点数据的读写策略 四、缓存方案问题的解决方法 1、缓…

Python画笔案例-055 绘制七彩浪花

1、绘制七彩浪花 通过 python 的turtle 库绘制 七彩浪花&#xff0c;如下图&#xff1a; 2、实现代码 绘制七彩浪花&#xff0c;以下为实现代码&#xff1a; """七彩浪花.py """ import turtlecs [red,orange,yellow,green,cyan,blue,magenta]…