九、Sentinel熔断与限流

news2024/11/25 16:31:09

Sentinel实现熔断与限流

Sentinel介绍

官网

https://github.com/alibaba/Sentinel

中文

https://github.com/alibaba/Sentinel/wiki/介绍

是什么

一句话解释,之前的Hystrix

能干嘛

去哪下

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

怎么玩

https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_sentinel

  • 服务使用中的各种问题
    • 服务雪崩
    • 服务降级
    • 服务熔断
    • 服务限流

安装Sentinel控制台

sentinel组件由2部分组成

Sentinel 分为两个部分:

核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。

控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

  • 后台
  • 前台8080

安装步骤

下载

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

下载到本地sentinel-dashboard-1.8.2.jar

运行命令

前提

java8环境OK

8080端口不能被占用

命令

java -jar sentinel-dashboard-1.8.2.jar

访问sentinel管理界面

http://localhost:8080

登录账号密码均为sentinel

初始化演示工程

启动Nacos8848成功

http://localhost:8848/nacos/#/login

案例

创建Module:cloudalibaba-sentinel-service8401

POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2021</artifactId>
        <groupId>com.aqrlmy.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloudalibaba-sentinel-service8401</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.aqrlmy</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

YML

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719  #默认8719,应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用HttpServer

management:
  endpoints:
    web:
      exposure:
        include: '*'

https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-endpoints

主启动

package com.aqrlmy.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class MainApp8401{
    public static void main(String[] args) {
        SpringApplication.run(MainApp8401.class, args);
    }
}

业务类FlowLimitController

package com.aqrlmy.springcloud.alibaba.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FlowLimitController{
    @GetMapping("/testA")
    public String testA() {
        return "------testA";
    }

    @GetMapping("/testB")
    public String testB() {
        return "------testB";
    }
}

启动Sentinel8080

java -jar sentinel-dashboard-1.8.2.jar

启动微服务8401

启动8401微服务后查看sentienl控制台

空空如也,啥都没有

Sentinel采用的懒加载说明

执行一次访问即可

http://localhost:8401/testA

http://localhost:8401/testB

效果

结论

sentinel8080正在监控微服务8401

流控规则

基本介绍

进一步解释说明

计算机生成了可选文字: . O 快速失败: 协厄肋Up 抛异常 O 根续乳叫eFador(冷加载因子,默认3)的值,从阂何cede「ador,经过预热时长,才达至恨 置的Qps阂值 。排队等待 匀速排队,让请求以匀速的速度通过,阂值类型必须设置为QpS,否则无效

流控模式

直接(默认)

  • 直接->快速失败
    • 系统默认
      • 测试QPS
        • 配置及说明
          • 表示1秒钟内查询1次就是OK,若超过次数1,就直接-快速失败,报默认错误

  • 快速点击访问: http://localhost:8401/testA
  • 结果
    • Blocked by Sentinel (flow limiting)
  • 测试线程数

  • 快速点击访问: http://localhost:8401/testA
  • 结果
    • 不会出现Blocked by Sentinel (flow limiting)(线程处理请求很快)

但是,在映射方法里添加sleep后,同样也会出现Blocked by Sentinel (flow limiting)默认提示信息。

  • 思考???
    • 直接调用默认报错信息,技术方面OK but,是否应该有我们自己的后续处理?
      • 类似有一个fallback的兜底方法?

关联

  • 是什么?
    • 当关联的资源达到阈值时,就限流自己
      • 当与A关联的资源B达到阈值后,就限流自己
      • B惹事,A挂了

配置A

  • 设置效果:
    • 当关联资源/testB的QPS阀值超过1时,就限流/testA的REST访问地址,当关联资源到阀值后闲置配置的的资源名。

JMeter模拟并发密集访问testB

  • 运行
    • 大批量线程高并发访问B,导致A失效了
  • 运行后发现testA挂了
    • 点击访问http://localhost:8401/testA
    • 结果
      • Blocked by Sentinel (flow limiting)

链路

  • 多个请求调用了同一个微服务

流控效果

直接->快速失败(默认的流控处理)

  • 直接失败,抛出异常:Blocked by Sentinel (flow limiting)
  • 源码:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController

预热

  • 说明
    • 公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值

  • 限流 冷启动

    https://github.com/alibaba/Sentinel/wiki/限流---冷启动

  • 源码

    • com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController

  • Warmup配置

    默认 coldFactor 为 3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。

  • 案例:阈值为10 + 预热时长设置5秒。

  • 系统初始化的阈值为10/3约等于3,即阈值刚开始为3;然后过了5秒后阈值才慢慢升高,恢复到10

  • 多次点击http://localhost:8401/testB
  • 刚开始不行,后续慢慢OK
  • 应用场景
    • 如:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值。

排队等待

  • 匀速排队,让请求以均匀的速度通过,阈值类型必须设置成QPS,否则无效。
    • 设置含义:/testB每秒1次请求,超过的话就排队等待,等待的超时时间为20000毫秒。

  • 官网

  • 源码:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController

  • 测试

    • 增加打印语句
    @GetMapping("/testB")
    public String testB() {
    log.info(Thread.currentThread().getName()+"\t ...testB");
    return "------testB";
    }
    
  • 增加线程组:直接10个线程并发,排队被依次处理

熔断规则

官网

https://github.com/alibaba/Sentinel/wiki/熔断降级

基本介绍

  • 整体介绍

熔断策略实战

慢调用比例

  • 是什么

  • 测试
    • 代码
    @GetMapping("/testA")
    public String testA() {

        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "------testA";
    }
  • 配置

  • 访问测试: http://localhost:8401/testA
  • 5秒内打进10个请求,由于每次请求都大于RT,并且比例阈值100%,所以,熔断器打开。

异常比例

  • 是什么

  • 测试
    • 代码
@GetMapping("/testB")
public String testB() {
        int age = 10/0;
        return "------testB";
}
  • 配置

  • 访问测试: http://localhost:8401/testB
  • 5秒内打进10个请求,由于每次请求都抛异常,异常比例阈值100%超过50%,所以,熔断器打开,10s后半开。如果再次访问有异常,则继续熔断。

异常数

  • 是什么

  • 测试
    • 代码
@GetMapping("/testB")
public String testB(){
    int age = 10/0;
    return "------testB 测试异常数";
}
  • 配置

  • 访问测试: http://localhost:8401/testB
  • 5秒内打进10个请求,由于每次请求都抛异常,异常数超过5个,所以,熔断器打开,10s后半开。如果再次访问有异常,则继续熔断。

热点规则

基本介绍

  • 是什么

官网

https://github.com/alibaba/Sentinel/wiki/热点参数限流

承上启下复习

  • 兜底方法
    • 分为系统默认和客户自定义,两种
      • 之前的case,限流出问题后,都是用sentinel系统默认的提示: Blocked by Sentinel(flow limiting)
      • 我们能不能自定义?类似hystrix,某个方法出现问题了,就找对应的兜底降级方法?
      • 结论
        • 从@HystrixCommand到@SentinelResource

代码

@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
                         @RequestParam(value = "p2",required = false) String p2) {
    //int age = 10/0;
    return "------testHotKey";
}

//兜底方法
public String deal_testHotKey (String p1, String p2, BlockException exception){
    return "------deal_testHotKey,o(╥﹏╥)o";  
}

com.alibaba.csp.sentinel.slots.block.BlockException

配置

  • 配置

计算机生成了可选文字: 热点参数限流规则 192月681,1.,8720 关键字 资潦名 t6St叫Ot众y 录折

  • 默认
    • @SentinelResource(value = “testHotKey”)
    • 异常打到了前台用户界面,不友好

  • 自定义兜底方法

    • @SentinelResource(value = “testHotKey”,blockHandler = “deal_testHotKey”) //value值与资源名一致即可
    • 方法testHostKey里面第一个参数只要QPS超过每秒1次,马上降级处理
  • 测试

    • error (1秒1下可以,但是,超过则降级,和p1参数有关)

      http://localhost:8401/testHotKey?p1=abc

  • error(1秒1下可以,但是,超过则降级,和p1参数有关)

    http://localhost:8401/testHotKey?p1=abc&p2=33

  • right(狂点不会触发降级,与p2参数无关)

    http://localhost:8401/testHotKey?p2=abc

参数例外项

  • 上述案例演示了第一个参数p1,当QPS超过1秒1次点击后马上被限流
    • 特殊情况
      • 普通
        • 超过1秒钟一个后,达到阈值1后马上被限流
      • 我们期望p1参数当它是某个特殊值时,它的限流值和平时不一样
      • 特例
        • 假如当p1的值等于5时,它的阈值可以达到200
    • 配置
      • 添加按钮不能忘

  • 测试

    http://localhost:8401/testHotKey?p1=5 对

    http://localhost:8401/testHotKey?p1=3 错

  • 当p1等于5的时候,阈值变为200

  • 当p1不等于5的时候,阈值就是平常的1

  • 前提条件

    • 热点参数的注意点,参数必须是基本类型或者String

其他

  • 手动添加一个异常看看…
    • @SentinelResource
      • 处理的是Sentinel控制台配置的违规情况,有blockHandler方法配置的兜底处理
    • RuntimeException
      • Int age = 10/0;这个是java运行时报出的运行时异常RuntimeException,@SentinelResource不管
    • 总结:
      • @SentinelResource主管配置出错,运行出错该走异常走异常

系统规则

是什么

https://github.com/alibaba/Sentinel/wiki/系统自适应限流

各项配置参数说明

配置全局QPS

@SentinelResource

官网

https://github.com/alibaba/Sentinel/wiki/注解支持

流控规则+自定义处理

  • 方法
//注意: 此处的value不能是/testC,否则请求/testC时会直接调用自定义的兜底方法
@SentinelResource(value = "testC", blockHandler = "backup_testC")
@GetMapping("/testC")
public String testC() {
    return "请求执行成功......testC";
}

//自定义兜底方法
public String backup_testC(BlockException e) {
    e.printStackTrace();
    return "自定义兜底数据......testC";
}
  • 配置流控规则

上面兜底方法面临的问题

  • 如果使用系统默认的,没有体现我们自己的业务要求。
    • 依照现有条件,我们自定义的处理方法又和业务代码耦合在一起,不直观。
    • 每个业务方法都增加一个兜底的,那代码膨胀加剧。
    • 全局统一的处理方法没有体现。

集中自定义处理

  • 创建CustomerBlockHandler类用于自定义限流处理逻辑
    • 自定义限流处理类
      • 方法必须是public static修饰的。
package com.aqrlmy.springcloud.alibaba.myhandler;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.aqrlmy.springcloud.entities.CommonResult;

public class CustomerBlockHandler {
    
public static String handleException1(BlockException exception){
        return "自定义限流处理信息.... CustomerBlockHandler --- 1";
    }

    public static String handleException2(BlockException exception){
        return "自定义限流处理信息.... CustomerBlockHandler --- 2";
    }
}
  • FlowLimitController
@SentinelResource(value = "testD", blockHandler = "handleException1",
        blockHandlerClass = CustomerBlockHandler.class)
@GetMapping("/testD")
public String testD() {
    return "请求执行成功......testD";
}
  • 启动微服务后先调用一次

    http://localhost:8401/testD

  • Sentinel控制台配置流控规则

  • 测试后我们自定义的出来了

更多注解属性说明

    /**
     * @SentinelResource  与 Hystrix 组件中的@HystrixCommand注解作用是类似的。
     *    value = "byResourceName"  用于设置资源名称,名称不能与方法的映射路径完全一致,否则正常的请求会直接调用降级方法
     *    blockHandler 用于引用降级方法。
     *    blockHandlerClass 用于引用降级方法的处理器类。注意:降级方法必须是static的。否则,无法解析
     *    blockHandler + blockHandlerClass 只处理配置违规,进行降级处理。代码出现异常,不执行的。
     *
     *    blockHandler + fallback 同时存在,配置违规,代码也有异常,这时,走blockHandler配置文件降级处理
     *
     *    exceptionsToIgnore 设置特定异常不需要降级处理,将异常原样抛出。
     */
    @RequestMapping("/fallback/{id}")
    @SentinelResource(value = "byFallbackName",
            blockHandler = "handleException2", blockHandlerClass = CustomerBlockHandler.class,
            fallback = "handleException3", fallbackClass = CustomerBlockHandler.class,
            exceptionsToIgnore = IllegalArgumentException.class
    )
    public String fallback(@PathVariable("id") Long id) {
        if (id == 4) {
            throw new IllegalArgumentException("IllegalArgumentException,非法参数异常....");
        }

        if (id == -1) {
            CommonResult<Payment> result = new CommonResult<>(444, "数据不存在", null);
            throw new NullPointerException("NullPointerException,该ID没有对应记录,空指针异常");
        }
        return "请求成功,获取到数据" + id;
    }

熔断框架比较

在生产环境中使用 Sentinel · alibaba/Sentinel Wiki (github.com)

规则持久化

是什么

一旦我们停止应用,该应用的Sentinel规则将消失,生产环境需要将配置规则进行持久化

怎么做

将限流配置规则持久化进Nacos保存,只要刷新8401某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对8401上Sentinel上的流控规则持续有效

步骤

修改:cloudalibaba-sentinel-service8401

POM

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

YML

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
        port: 8719
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: cloudalibaba-sentinel-service
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow

management:
  endpoints:
    web:
      exposure:
        include: '*'

添加Nacos业务规则配置

  • 内容解析
[
    {
         "resource": "/testA",
         "limitApp": "default",
         "grade": 1,
         "count": 1,
         "strategy": 0,
         "controlBehavior": 0,
         "clusterMode": false 
    }
]

启动8401并访问接口

访问8401的任意接口,如:http://localhost:8401/testA

刷新sentinel发现业务规则有了

计算机生成了可选文字: 应用名 搜索 C10Uda11baba一sentine卜Se四iCe 巨 O首页 CIOUdsllbsbs一Sentlne!- SerVICe (111)" 涂控规则 关键字 匹实时监控 资源名 阅值类型 阅值团值模式 圈簇点链路 Ir分teLlmltlbyUn 来源应用流控模式 defautt直接 OPS 单机 流控效果 快速失败 共1条记录,每页 手降级规则

快速访问测试接口

http://localhost:8401/testA

流控规则生效,响应默认的兜底数据

停止8401再看sentinel

因为应用停止,所以监测不到数据

重新启动8401并访问接口

访问8401的接口:http://localhost:8401/testA

再看sentinel,配置出现了,持久化验证通过

了解

若需要配置其它规则,参照对应类的属性进行json的配置

流控规则:com.alibaba.csp.sentinel.slots.block.flow.FlowRule

熔断/降级规则:com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule

热点规则:com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule

系统规则:com.alibaba.csp.sentinel.slots.system.SystemRule

授权规则:com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule

之前的配置可以让我们启动项目就加载nacos配置好的规则,但是在Sentinel 控制台上修改后,nacos中的配置文件不会修改。
如果要做到同步到nacos中,需要对源码进行扩展。
参考文档:
Sentinel 基于Nacos规则持久化-推模式
[(企业案例)使用Nacos持久化规则,改造sentinel-dashboard](

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

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

相关文章

vue学习笔记:还不会上传文件,10分钟教会你使用input file上传文件

最近在写一个用户上传MP3文件到服务器的小案例&#xff0c;我写一个这样的界面&#xff1a; 当用户点击input的时候&#xff0c;其实这里并不是input的样式&#xff0c;而是一个div将代替了input的原生样式&#xff0c;这样比较好看一点&#xff1a; <div class"addre…

Pycharm 安装配置 pyQt5 图文操作(全)

目录前言1. 安装模块2. Pycharm 配置 pyQt52.1 配置QtDesigner2.2 配置PyUic2.3 配置pyrcc3. pyQt5界面前言 Qt是开源的GUI库&#xff0c;自带的QtDesigner 可以轻松构建界面&#xff0c;而且有非常全面的工具代码库和APIpyQt 是 Qt 库的Python版本&#xff0c;目前最新版本是…

数据库--------代数运算和关系运算

目录 传统的集合运算专门的关系运算例题1例题2关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类。 传统的集合运算 并(∪): 差(-): 交(∩): 笛卡尔积():R的每一行S的矩阵 示例:

A-Level化学例题解析及练习(分子间作用力和沸点)

今日知识点&#xff1a;Intermolecular forces and boiling points 例题 Q: Nitrogen, N2, and carbon monoxide, CO, both have Mr 28. The boiling point of N2 is 77 K. The boiling point of CO is 82 K.What could be responsible for this difference in boiling point…

[附源码]计算机毕业设计JAVA校园共享单车系统

[附源码]计算机毕业设计JAVA校园共享单车系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

LinkedList源码分析

LinkedList源码分析 注意:本笔记分析对象为 Java8 版本,随版本不同,源码会发生变化。 基本介绍与类图 LinkedList 同时实现了 List 接口和 Deque 对口,也就是收它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack)。 这样看来,linke…

能力提高篇--协调能力【对接】

作为一名安防技术支持工程师&#xff0c;正常情况下我们的日常主要为解决问题&#xff0c;然而对于重大项目或者复杂项目&#xff0c;更多的情况下我们的职责为收集客户需求&#xff0c;拉通研发侧评估&#xff0c;确认需求&#xff0c;确认程序交付时间&#xff0c;测试和最终…

基于jsp+mysql+ssm协同办公系统-计算机毕业设计

项目介绍 本公司文档协同办公管理系统采用SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发,主要包括系统用户管理模块、用户信息模块、文件信息管理、个人事务管理、资料信息管理、登录模块、和退出模块等多个模块. 本系统主要包含了等系统用户管理、用户信息管理…

蓝桥杯---动态规划(1)

动态规划专题&#xff08;1&#xff09;1.糖果&#xff08;状压dp&#xff09;2.调手表&#xff08;状压dp)3.矩阵计数(状压dp)4.蒙德里安的梦想&#xff08;状压dp模板题&#xff09;5.跳跃&#xff08;动态规划&#xff0c;搜索&#xff09;5.字符排序&#xff08;逆序对&…

如何定位慢查询SQL以及优化

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; MySQL ❤️ 支持我&#xff1a;&#x1f44d;点赞 &#x1f33…

个人健康监测小程序开发,多元化健康生态管理平台

生活水平的提升让人们对身体健康的关注度越来越高&#xff0c;健康生活的意识越来越浓烈。现在很多人的身体都处于一种亚健康的状态&#xff0c;因此需要定时进行体检&#xff0c;及时了解自身健康状况。但是由于工作或者其他原因&#xff0c;很多人都难以抽出时间到医院进行定…

Web3中文|“你们眼中的互联网革命,是我生活的日常”

来源 | coindesk 编译 | BoweniNFTnews.com 中心化产品会发生单点故障。 10月4日&#xff0c;社交网站Facebook遭遇六小时的网络中断&#xff0c;从其子公司 Instagram 和 Whatsapp 到其实体工厂都受到影响。 据称这是该社交网站有史以来最严重的一次服务中断。相关消息显示…

数据结构(7)树形结构——红黑树(概念、插入过程、删除过程)

7.1.概述 平衡二叉树是要求任意结点的左右子树高度差不超过1&#xff0c;因此在AVL中用旋转来保证树的绝对平衡&#xff0c;但是这些旋转操作步骤繁多很耗时间&#xff0c;所以在面对经常会有数据插入的场景时&#xff0c;AVL不是一个性能优秀的选择。这时候反过来思考一个问题…

图神经网络简介

本篇文章是我在2022年阅读完distill上一篇文章"A Gentle Introduction to Graph Neural Networks"后自己的一些心得。 目录 一、不同类型的数据如何以图的形式保存 二、图结构可以处理的问题 三、图机器学习的挑战 四、图神经网络 一、不同类型的数据如何以图的…

【智能优化算法-算术算法】基于算术优化算法 (MAOA)求解多目标优化问题附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Java并发编程—java中守护线程和用户线程

一、概念&#xff1a; ​ 守护线程&#xff1a;是一种特殊的线程&#xff0c;在后台默默地完成一些系统性的服务&#xff0c;比如垃圾回收线程 ​ 用户线程&#xff1a;是系统的工作线程&#xff0c;它会完成这个程序需要完成的业务操作&#xff1b;我们使用 Thread类创建的线…

求先序遍历序列中第(1<=k<=二叉树中结点个数)个结点的值

本题本质上就是一个遍历算法的实现&#xff0c;只不过用一个全局变量的来记录访问的序号&#xff0c;求其他遍历序列的第k个结点也采用相似的方法。二叉树的遍历算法可以引申出大量的算法题&#xff0c;因此考生务必熟练掌握二叉树的遍历算法。 C语言代码&#xff1a; //本题本…

mapbox地图动画一键飞行

最近&#xff0c;Mapbox GL JS 从 v2.9 开始支持将地图显示为 3D 地球。 话不多说&#xff0c;马上看看效果怎么样&#xff1a; mapbox地图动画我们通过设置投影属性projection&#xff1a;globe&#xff0c;即可将地图更改为地球 const map new mapboxgl.Map({container: m…

mybatis实战:二、mybatis xml 方式的基本用法

注释都在代码里&#xff0c;最好复制了再看&#xff01; 1.创建表 CREATE TABLE sys_user( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 用户 ID, user_name VARCHAR(50) COMMENT 用户名, user_password VARCHAR(50) COMMENT 密码, user_email VARCHAR(50) COMMENT 邮箱, user…

manjaro 记录 1 安装流程

manjaro 记录 1 安装流程 初manjaro 记录 1 安装流程下载好镜像镜像写入U盘重启电脑&#xff0c;进入U盘安装进入界面&#xff1a;找到 launch installer 进行安装安装流程设置语言设置位置与时区设置键盘磁盘分区设置用户与管理员密码安装初 希望能写一些简单的教程和案例分享…