[SpringBoot 分布式调度elasticjob 整合 ]

news2024/9/24 5:26:43

目录

🥫前言:

🥫配置作业

🥫实现任务处理类

🥫启动SpringBoot应用程序

🥬下面是代码是我另一个文章看见 记录的笔记,  我前面也使用了elastic-job做重试机制,有兴趣可以看一下

🥬依赖:

🥬elastic job提供了2种类型的定时任务:SimpleJob、DataflowJob,根据需要实现即可,都需要放到spring容器中

🥬配置文件:

🥬下载 lite ui 的二进制tar包(不是源码包),版本尽量与 maven 引入的 lite 版本保持一致​编辑

🥬解压,根据需要修改 conf/application.properties

🥬常见操作说明

🥬xxl-job

🥬web控制台的部署

下载最新稳定版的压缩包,解压,在IDEA中导入

父项目 xxl-job包含3个子项目

3、修改 xxl-job-admin 的配置文件

🥬4、打包部署,访问 http://localhost:8080/xxl-job-admin 登录系统,默认账号密码 admin/123456

🥬5、初始化系统数据

🥬编写定时任务

🥬2、复制 application.properties 的相关配置项

🥬3、复制配置类

🥬4、仿照 service.jobhandler.SampleXxlJob 写定时任务

🥬策略说明执行器集群部署时,调度中心支持的路由策略如下

🥬调度过于密集,执行器来不及处理任务实例时,调度中心提供的阻塞处理策略如下


🥫前言:

    笔记,elastic-job可以通过可视化界面去操作动态控制参数配置,也可以通过代码配置文件去实现,  我这边用得最多的还是  elastic-job重试机制,大家根据自己情况去判断使用,我主要记录笔记一下

配置注册中心:

elasticjob:
  zookeeper:
    server-lists: 127.0.0.1:2181
    namespace: elasticjob

🥫配置作业

在使用Elastic-Job时,需要先配置作业的相关信息,包括任务处理类、分片总数、分片参数等。在SpringBoot中,可以通过Java Config的方式来配置作业信息。

@Configuration
public class ElasticJobConfig {

    @Autowired
    private ZookeeperRegistryCenter registryCenter;

    @Bean(initMethod = "init")
    public JobScheduler simpleJobScheduler(final OrderMessageConsumer orderMessageConsumer,
                                           @Value("${elasticjob.simpleJob.cron}") final String cron,
                                           @Value("${elasticjob.simpleJob.shardingTotalCount}") final int shardingTotalCount,
                                           @Value("${elasticjob.simpleJob.shardingItemParameters}") final String shardingItemParameters) {
        LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(
                new SimpleJobConfiguration(
                        JobCoreConfiguration.newBuilder("orderJob", cron, shardingTotalCount)
                                .shardingItemParameters(shardingItemParameters)
                                .build(),
                        orderMessageConsumer.getClass().getCanonicalName()
                )
        ).overwrite(true).build();

        return new SpringJobScheduler(
                orderMessageConsumer,
                registryCenter,
                liteJobConfiguration,
                new ElasticJobListener()
        );
    }
}

 在Java Config中,我们使用@Bean注解来创建SpringJobScheduler对象,并将任务处理类、作业配置信息、注册中心和作业监听器传入该对象中。作业配置信息中包含了任务名、任务处理类、分片总数、分片参数等信息。

🥫实现任务处理类

在使用Elastic-Job时,需要实现任务处理类(Job),用来处理具体的业务逻辑。在SpringBoot中,我们可以将任务处理类配置为一个Bean,并在SpringJobScheduler对象的构造函数中传入该Bean。

@Component
public class OrderMessageConsumer implements SimpleJob {

    @Autowired
    private OrderService orderService;

    @Override
    public void execute(ShardingContext shardingContext) {
        // 处理业务逻辑
        orderService.createOrder(shardingContext.getShardingParameter());
    }
}

在任务处理类中,我们需要实现Elastic-Job的SimpleJob接口,并实现execute方法。在execute方法中,我们可以通过ShardingContext来获取分片参数,用来处理具体的业务逻辑。

🥫启动SpringBoot应用程序

在完成以上步骤后,就可以启动SpringBoot应用程序,Elastic-Job会自动注册作业节点并启动作业。如果需要修改作业配置信息,可以在配置文件中修改对应的参数即可。

总的来说,使用SpringBoot整合Elastic-Job非常方便,只需要引入相关依赖、配置注册中心和作业信息,就可以启动分布式任务调度。同时,Elastic-Job提供了完善的任务调度和重试机制,可以方便地实现任务分片、任务重试等功能


🥬下面是代码是我另一个文章看见 记录的笔记,  我前面也使用了elastic-job做重试机制,有兴趣可以看一下

🥬依赖:

<dependency>
    <groupId>org.apache.shardingsphere.elasticjob</groupId>
    <artifactId>elasticjob-lite-spring-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>


根据情况设置对应版本
<dependency>
    <groupId>com.dangdang</groupId>
    <artifactId>elastic-job-lite-spring-boot-starter</artifactId>
    <version>${elastic-job.version}</version>
</dependency>

🥬elastic job提供了2种类型的定时任务:SimpleJob、DataflowJob,根据需要实现即可,都需要放到spring容器中

@Component
public class MySimpleJob implements SimpleJob {

    @Override
    public void execute(ShardingContext context) {
        //...
    }

}
@Component
public class MyDataflowJob implements DataflowJob<Order> {

    @Override
    public List<Order> fetchData(ShardingContext context) {
        //...
    }

    @Override
    public void processData(ShardingContext shardingContext, List<Order> orders) {
        // ...
    }

}

🥬配置文件:

elasticjob:
  #注册中心配置
  regCenter:
    #zk节点
    serverLists: localhost:2181
    #命名空间,即存储elastic job数据要zk node
    namespace: elasticjob-task
  #定时任务配置
  jobs:
    #自定义的任务名称
    mySimpleJob:
      #对应的类
      elasticJobClass: com.chy.mall.job.MySimpleJob
      cron: 0/10 * * * * ?
      #自定义参数
      jobParameter: xxx
      #分片总数
      shardingTotalCount: 3
      #自定义的分片参数
      shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou
    myDataFlowJob:
      elasticJobClass: com.chy.mall.job.MyDataflowJob
      cron: 0/10 * * * * ?
      shardingTotalCount: 3

定时任务已经注册到zk,后续在yml中修改cron表达式、自定义参数、分片总数这些任务配置项是不会生效的,需要到web控制台修改,来更新zk保存的任务信息

<dependency>
    <groupId>org.apache.shardingsphere.elasticjob</groupId>
    <artifactId>elasticjob-error-handler-email</artifactId>
     <version>3.0.0</version>
</dependency>
 

elasticjob:
  regCenter:
    ...
  jobs:
    ...
    jobErrorHandlerType: EMAIL 
  props:
    email:
      host: host
      port: 465
      username: username
      password: password
      useSsl: true
      subject: ElasticJob error message
      from: from@xxx.xx
      to: to1@xxx.xx,to2@xxx.xx
      cc: cc@xxx.xx
      bcc: bcc@xxx.xx
      debug: false

🥬下载 lite ui 的二进制tar包(不是源码包),版本尽量与 maven 引入的 lite 版本保持一致

 

🥬解压,根据需要修改 conf/application.properties

#使用的端口
server.port=8088

#账号、密码,root账号可修改配置,guest游客账号只能看、不能修改
auth.root_username=root
auth.root_password=root
auth.guest_username=guest
auth.guest_password=guest

#事件追踪数据源配置,这个不是必需的,数据库连接后续可以在web界面配置
#配置了elastic job会自动创建几张表,用于记录任务执行的历史记录、结果、总结摘要,便于分析,建议配上
#默认值引入了h2、postgresql的数据库驱动,如果要配置为mysql等其它数据库,可以把对应的驱动jar包放到 ext-lib目录下
spring.datasource.default.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.default.url=jdbc:mysql://localhost:3306/mall?serverTimezone=UTC
spring.datasource.default.username=root
spring.datasource.default.password=root
spring.jpa.show-sql=false

 

执行bin下的start脚本启动应用,浏览器访问 127.0.0.1:8088,输入账号、密码

添加注册中心,信息与yml配置的注册中心保持一致

🥬常见操作说明


1、状态

分片待调整:新的定时任务注册上去,尚未触发过即为此状态,到cron表达式指定周期时自动触发过1次,状态就正常了。
失效:暂时下线该定时任务,后续还可以上线。
终止:永久下线该定时任务,不能再上线。
 
2、分片总数、参数
这些配置参数都可以从上下文中获取到,用于向定时任务传递额外的配置,均可以在web控制台进行配置
 

#自定义参数
jobParameter: xxx
#分片总数,此定时任务每次触发时使用几个分片来执行
shardingTotalCount: 3
#自定义的分片参数,index=value,数量与分片总数保持一致
shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou
 
https://blog.csdn.net/chy_18883701161/article/details/106314007

@Component
public class MySimpleJob implements SimpleJob {

    @Override
    public void execute(ShardingContext context) {
        //自定义参数
        String jobParameter = context.getJobParameter();
        //分片总数
        int shardingTotalCount = context.getShardingTotalCount();
        //当前分片的index
        int shardingItem = context.getShardingItem();
        //当前分片项对应的值
        String shardingParameter = context.getShardingParameter();

        //...
    }

}

 

分片总数:指定该定时任务触发1次时,需要分配给几个副本执行。假设分片总数设置为3,定时任务所在服务

  • 部署了5个实例,分片分散情况往往是 1+1+1 ,触发1次时这3个实例会分别执行1次;
  • 部署了2个实例,分片分散情况往往时 1+2,触发1次时1个实例执行1次,另一个实例执行2个;
  • 部署了1个实例,这个定时任务的所有分片都集中在这个实例上,触发1次时这个实例会执行3次;
  • 分片总数通常设置为1,避免触发时重复执行。

 如果定时任务要处理的数据量级很大,可以将数据分配给多个分片共同处理,shardingItemParameters 指定分段(id分段、状态划分等),定时任务中判断当前分片对应的 shardingItemParameters,做相应处理

shardingTotalCount: 3 shardingItemParameters: 0=待付款,1=待发货,2=待退款

@Component
public class MySimpleJob implements SimpleJob {

    @Override
    public void execute(ShardingContext context) {
        switch (context.getShardingParameter()) {
            case "待付款":
                //...
                break;
            case "待发货":
                //...
                break;
            case "待退款":
                //...
                break;
            default:
        }
    }

}

🥬xxl-job

官网:分布式任务调度平台XXL-JOB
github:GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)

🥬web控制台的部署

下载最新稳定版的压缩包,解压,在IDEA中导入

父项目 xxl-job包含3个子项目
  • xxl-job-core:核心模块,提供公共依赖
  • xxl-job-admin:调度中心,提供web界面的控制台
  • xxl-job-executor-samples:执行器(定时任务)示例,不需要的可以删除这个模块。包含2个子项目,一个是springboot版本的示例,一个是frameless无框架版本的示例。

 
2、执行doc/db下的初始化sql脚本
 

3、修改 xxl-job-admin 的配置文件

application.properties:根据需要调整应用使用的端口、访问路径、数据库配置、报警邮箱配置。邮箱配置可以不管,但不能注释掉。
logback.xml 日志配置
xxl-job-admin 集群部署时,各 xxl-job-admin 节点务必连接同一个mysql数据库、节点机器的时钟务必保持一致;如果 mysql 做主从,xxl-job-admin 各节点务必强制走主库。
 

🥬4、打包部署,访问 http://localhost:8080/xxl-job-admin 登录系统,默认账号密码 admin/123456

🥬5、初始化系统数据

在用户管理中修改密码、增删用户
在任务管理中删除示例任务
在执行器管理中增删、修改执行器
 

🥬编写定时任务

从springboot版本的示例中copy所需内容

1、添加依赖,最好与控制台的版本保持一致

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.3.1</version>
</dependency>

🥬2、复制 application.properties 的相关配置项

### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=

### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-sample

### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=

### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=

### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999

### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler

### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30

🥬3、复制配置类

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * xxl-job config
 *
 * @author xuxueli 2017-04-28
 */
@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.appname}")
    private String appname;

    @Value("${xxl.job.executor.address}")
    private String address;

    @Value("${xxl.job.executor.ip}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;


    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }

    /**
     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
     *
     *      1、引入依赖:
     *          <dependency>
     *             <groupId>org.springframework.cloud</groupId>
     *             <artifactId>spring-cloud-commons</artifactId>
     *             <version>${version}</version>
     *         </dependency>
     *
     *      2、配置文件,或者容器启动变量
     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
     *
     *      3、获取IP
     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
     */


}

🥬4、仿照 service.jobhandler.SampleXxlJob 写定时任务

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;

@Component  //放到容器中
public class XxxJob {

    /**
     * 简单任务示例
     */
    @XxlJob("sampleJobHandler")
    public void sampleJobHandler() throws Exception {
        //执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
        XxlJobHelper.log("sampleJobHandler start");

        //可通过 XxlJobHelper.handleFail()/handleSuccess() 指定任务执行结果,未设置时默认默认为 handleSuccess() 成功
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            XxlJobHelper.handleFail();
        }
    }

    /**
     * 分片广播任务示例
     */
    @XxlJob("shardingJobHandler")
    public void shardingJobHandler() throws Exception {
        // 分片参数
        int shardIndex = XxlJobHelper.getShardIndex();
        int shardTotal = XxlJobHelper.getShardTotal();
        XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
        //...
    }

}

启动应用,调度中心 -> 任务管理 -> 增删、修改任务实例

 

运行模式使用 BEAN,JobHandler 与 @XxlJob 指定的 jobName 保持一致。

🥬策略说明
执行器集群部署时,调度中心支持的路由策略如下

ROUND(轮询)
FIRST(第一个):固定选择第一个节点
LAST(最后一个):固定选择最后一个节点
RANDOM(随机):随机选择在线的节点
CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某个节点,且所有任务均匀散列在不同节点上。
LEAST_FREQUENTLY_USED(最不经常使用):优先选择使用频率最低的节点。
LEAST_RECENTLY_USED(最近最久未使用):优先选择最久未使用的节点。
FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的节点选定为目标执行器并发起调度。
BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的节点选定为目标执行器并发起调度。
SHARDING_BROADCAST(分片广播):广播触发对应集群中所有节点执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务。
 

🥬调度过于密集,执行器来不及处理任务实例时,调度中心提供的阻塞处理策略如下

  • 单机串行(默认):调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行。
  • 丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败。
  • 覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务。

 
 相关URL:https://blog.csdn.net/chy_18883701161/article/details/106314007

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

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

相关文章

基于MATLAB的CFAR检测仿真程序分享

基于MATLAB的CFAR检测仿真&#xff0c;得到平均CFAR检测。 完整程序&#xff1a; clc; clear; close all; warning off; addpath(genpath(pwd)); cfar phased.CFARDetector(NumTrainingCells,200,NumGuardCells,50,Method,CA); % Expected probability of False Alarm (no u…

【瑞萨RA_FSP】CTSU——电容按键检测

文章目录 一、1. 电容按键介绍二、电容按键原理三、瑞萨QE在电容按键上面的运用四、电容按键实验1. 硬件设计2. FSP配置3.复制文件4.主函数 一、1. 电容按键介绍 电容式感应触摸按键可以穿透绝缘材料外壳 8mm &#xff08;玻璃、塑料等等&#xff09;以上&#xff0c;准确无误…

OpenStack(2)--项目(租户)、用户、角色

一、项目&#xff08;租户&#xff09;、用户、角色的关系 重点理解项目&#xff08;project/租户&#xff09;、用户&#xff08;user&#xff09;、角色&#xff08;role&#xff09;三者之间的关系&#xff0c;首先这三者都可以单独新建&#xff0c;但是绑定关系是通过open…

10 分钟玩转Elastcisearch——数据可视化分析

在当今这个快速发展的科技时代&#xff0c;Elasticsearch 已经成为企业和开发者的重要技术工具。随着数据的爆发式增长&#xff0c;Elasticsearch 可以帮助个人和企业更好的理解数据、发现数据中的规律趋势和模式、并从海量数据中洞察业务价值。 为了帮助开发者能够快速上手&am…

基于SpringBoot的电子文档管理系统(源码、文档、数据库)

网上文件管理系统所用的资料库是由 SpringBoot架构所建立的 Mysql资料库。在进行设计的时候&#xff0c;要充分地保证了系统代码拥有良好的可读性、实用性、易扩展性、通用性、便于后期维护、操作容易、页面简洁等优势。 一、开发工具及技术介绍 &#xff08;1&#xff09;.J…

JavaScript Day03 对象详解

文章目录 1. 什么是对象?2.对象的创建2.1 字面量模式2.2 构造函数模式 3 对象的访问4.新增删除对象中的属性5.Object显示类型转换(强制类型转换)5.1-ECMAScript中可用的3种强制类型转换如下&#xff1a;-Boolean(value)-String(value)-Number(value) 5.2-Object类型到Boolean类…

chatgpt赋能python:Python中的模块查找位置详解

Python中的模块查找位置详解 作为一门广受欢迎的高级编程语言&#xff0c;Python 拥有丰富的库和模块&#xff0c;这些工具让开发者能够更加高效地编写代码。但是&#xff0c;有时候当你在使用 Python 模块时&#xff0c;你可能会遇到找不到模块或者无法导入模块的错误。这时候…

【从零开始学习JAVA | 第四篇】标准的JavaBean类的构建

目录 前言&#xff1a; 构造方法&#xff1a; 构造标准JavaBean类&#xff1a; 对象内存图&#xff1a; 前言&#xff1a; 本片会详细的介绍JAVA中JavaBean类的手动构建&#xff0c;IDEA为我们提供的快捷键生成JAVA bean的方式&#xff0c;以及介绍一个可以快速生成…

OTT 的快速频道切换(FCC)

FCC&#xff08;Fast Channel Change&#xff09;快速频道切换是一种由FCC服务器下发特制的以I帧为起始的单播节目流来提升频道切换时间的方法, 通过在网络中部署FCC服务&#xff0c;可以回避等待I帧时间与IGMP交互时间&#xff0c;提升I帧传输时间&#xff0c;从而提高频道切换…

chatgpt赋能python:Python构造和析构:介绍和实例

Python 构造和析构&#xff1a;介绍和实例 当你编写 Python 程序时&#xff0c;你可能会注意到一个名为构造函数和析构函数的概念。这些函数可以在创建和删除一个对象时自动执行一些操作。本文将深入介绍 Python 中的构造和析构概念。 构造函数 Python 使用一种名为 __init_…

pkg打包nestjs项目问题点整理

打包运行过程中的警告 Warning Cannot include directory %1 into executable. The directory must be distributed with executable as %2. %1: node_modules\puppeteer.local-chromium %2: path-to-executable/puppeteer 解决方法&#xff1a; 警告大义为在路径如%1的某个目…

chatgpt赋能python:用Python进行nan值的查询

用 Python 进行 nan 值的查询 在数据分析和机器学习的过程中&#xff0c;我们经常会遇到 NaN 值&#xff0c;NaN 是代表不是数字的特殊值&#xff0c;通常意味着在数据中有缺失或者不可识别的数据。由于机器学习等技术需要处理的数据来源繁杂&#xff0c;有时候我们在数据处理…

第八章 总结【编译原理】

第八章 总结【编译原理】 前言推荐第八章 总结8.1 符号表的组织与作用8.1.1符号表的作用8.1.2符号表的组织方式 8.2 整理与查找8.2.1线性表8.2.2 对折查找与二叉树8.2.3杂凑技术 8.3 名字的作用范围8.3.1FORIRAN的符号表组织8.3.2Pascal的符号表组织 8.4 符号表的内容 最后 前言…

python基础学习4【Matplotlib、散点图、折线图绘制、读取存储不同数据源的数据(csv、txt、excel)、编码】

Matplotlib数据可视化基础&#xff08;绘图基础语法和常用参数&#xff09; 创建画布与子图 plt.figure()、plt.title()、plt.savefig()保存绘制的图、plt.show() 展示&#xff1a; plt.legend():创建图例 figure.add_subplot()&#xff1a;向figure添加一个Axes作为一subp…

极致呈现系列之:Echarts仪表盘的光影奇迹

目录 仪表盘介绍仪表盘的基本结构Echarts仪表盘的常用数据配置项Echarts仪表盘的常用样式配置项创建基本的仪表盘自定义仪表盘样式应用场景 仪表盘介绍 仪表盘通常模拟了传统汽车仪表盘的样式&#xff0c;包括刻度、指针、表盘等元素&#xff0c;用于显示单一指标或数据。它能…

【JavaWeb】前端之HTML基础认知

目录 1、第一个HTML程序 1.1、创建第一个HTML文件 1.2、HTML文件的基本结构 2、HTML常见标签 2.1、注释标签 2.2、标题标签&#xff1a;h1-h6 2.3、段落标签&#xff1a;p 2.4、换行标签&#xff1a;br 2.5、格式化标签 2.6、图片标签&#xff1a;img 2.7、超链接标签&…

vue源码理解之模板编译和组件化

一&#xff1a;模板编译 1、模板编译的主要目标是将模板(template)转换为渲染函数(render) template > render() 2、模板编译必要性 Vue 2.0需要用到VNode描述视图以及各种交互&#xff0c;手写显然不切实际&#xff0c;因此用户只需编写类似HTML代码的Vue模板&#xff0c;…

扩展卡尔曼滤波在目标跟踪中的应用(2)

上一节的内容中&#xff0c;我们对于扩展卡尔曼EKF算法进行了讲解&#xff0c;今天我们对上一节的内容进行仿真。 话不多说&#xff0c;开整&#xff01;&#xff01;&#xff01; 仿真背景 我们以一个目标的位置信息为例&#xff0c;其状态方程如下所示&#xff1a; X k 0…

黑马程序员前端 Vue3 小兔鲜电商项目——(二)初始化项目

文章目录 了解 Vue3初始化项目创建项目启动项目添加目录Git 管理项目jsconfig.json 配置别名路径 ElementPlus 引入安装配置按需导入测试组件 定制 elementPlus 主题安装sass准备定制化的样式文件自动导入配置 Axios 安装并简单封装安装 Axios基础配置封装请求函数并测试 路由整…

数据血缘分析

引入 做过大数据或者接触过数仓的同学,相信都有听到过数据治理、血缘分析的专业术语。不知道大家有没有思考过以下几个问题: 1、什么是血缘分析?主要分析什么东西? 2、为什么要做血缘分析,主要是为了解决什么痛点?做出来之后有什么价值?如何衡量这些价值? 3、如何做血…