【Java】SpringBoot整合xxl-job学习使用详解

文章目录

      • 介绍
      • 作用
      • 如何使用
        • 下载项目
        • 中央仓库地址
        • 环境
        • 调度中心
          • 初始化“调度数据库”
          • 配置部署“调度中心”
          • 部署项目
          • 调度中心集群(可选)
          • 其他:Docker 镜像方式搭建调度中心
          • 配置部署“执行器项目”
        • 执行器
          • maven依赖
          • 执行器配置
          • 执行器组件配置
          • 执行器集群(可选)
        • 执行效果
          • 编写业务代码
          • 新建调度规则
          • 启动一次
          • 启动
        • 细说策略
          • 路由策略
        • 总结
        • 总结

介绍

Xxl-Job是一款优秀的开源调度平台,用于管理和调度各种类型的任务,报告定时任务、分布式任务。

作用

分布式任务调度:XXL-JOB允许您在分布式环境中调度任务,这些任务可以在不同的节点上执行。它通过分布式协调和管理任务的执行,确保任务按计划运行。

Web界面:XXL-JOB提供了一个易于使用的Web界面,用于管理任务、查看任务执行日志、监控任务状态等。用户可以通过Web界面方便地创建、编辑和删除任务。

任务类型:XXL-JOB支持多种任务类型,包括定时任务(Cron表达式)、Bean任务(Java类方法)、分片任务(适用于数据分片处理)、流程任务(执行多个任务步骤的工作流程)等。

动态任务调度:XXL-JOB允许在运行时动态添加、修改和删除任务,而无需停止整个应用程序。这使得任务调度非常灵活。

任务依赖关系:您可以定义任务之间的依赖关系,确保某个任务在另一个任务成功执行后才能运行。

任务执行器:任务可以在不同的执行器上运行,例如Java、Shell、Python等。这样可以根据任务的类型和需求选择合适的执行器。

分片任务支持:XXL-JOB提供了分片任务的支持,允许将大任务分成多个小任务,每个小任务在不同的节点上并行执行,从而提高任务的执行效率。

任务日志:任务执行的日志可以在Web界面中查看,帮助用户跟踪任务的执行情况,排查问题。

报警和通知:XXL-JOB支持任务执行失败时发送报警通知,以及成功或失败后发送通知邮件。

权限管理:XXL-JOB提供了角色和权限管理功能,可以限制用户对任务调度的访问和操作。

历史任务记录:平台会保留任务执行的历史记录,用户可以随时查看历史任务的状态和日志。

集成和扩展性:XXL-JOB可以与Spring、Spring Boot、Quartz等框架集成,并提供了RESTful API,以便与其他系统进行集成。

高可用性和容错性:XXL-JOB的分布式架构支持高可用性和容错性,当某个节点出现故障时,任务可以在其他可用节点上执行。

开源和社区支持:XXL-JOB是一个开源项目,拥有活跃的社区支持,用户可以参与贡献和获取帮助。

如何使用

下载项目

可以科学上网的可以去github上clone项目,我这里是用的国内的码云进行下载项目。

我们可以从目录结构可以看出有以下三个项目子模块。

xxl-job-admin: 这个是xxl-job调度中心,这里我们不得不提一下,xxl-job其实本质是一个调度中心+执行器组成的一个框架。xxl-job本身不关注具体业务,它只负责调度。执行器启动之后要注册到调度中心,由调度中心配置具体的动作最后通信到指定的执行器上去执行具体的Handler。所以这里我们得把xxl-job-admin项目配置好启动起来,相当于一个中台了。

xxl-job-core: 这个应该就是xxl-job的核心源码,后续直接使用依赖直接注入就可以。要么你也可以打包,maven中央仓库应该有这个打包好的。

xxl-job-executor-samples:这个是xxl-job的执行样例,可以看这个上面的例子来实践,告诉你客户端的具体代码如何去写,然后调度中心就可以执行到具体的业务代码上。

中央仓库地址
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>${最新稳定版本}</version>
</dependency>

这里是用的最新的2.4.0

环境
  • Maven3+
  • Jdk1.8+
  • Mysql5.7+
调度中心
初始化“调度数据库”

请下载项目源码并解压,获取 “调度数据库初始化SQL脚本” 并执行即可。

“调度数据库初始化SQL脚本” 位置为:

/xxl-job/doc/db/tables_xxl_job.sql

调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例;

如果mysql做主从,调度中心集群节点务必强制走主库;

在这里插入图片描述

配置部署“调度中心”

调度中心配置文件地址:

/xxl-job/xxl-job-admin/src/main/resources/application.properties

调度中心配置内容说明:

### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
### 报警邮箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### 调度中心通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体, 可选范围为 "zh_CN"/中文简体, "zh_TC"/中文繁体 and "en"/英文;
xxl.job.i18n=zh_CN
## 调度线程池最大线程配置【必填】
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;
xxl.job.logretentiondays=30
部署项目

如果已经正确进行上述配置,可将项目编译打包部署。

调度中心访问地址:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址)

默认登录账号 “admin/123456”, 登录后运行界面如下图所示。

在这里插入图片描述
在这里插入图片描述

到这一步之后,调度中心的环节算是成功了,后面可以直接去看执行器部分也是可以的。

调度中心集群(可选)

调度中心支持集群部署,提升调度系统容灾和可用性。

调度中心集群部署时,几点要求和建议:

  • DB配置保持一致;
  • 集群机器时钟保持一致(单机集群忽视);
  • 建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。
其他:Docker 镜像方式搭建调度中心
  • 下载镜像
// Docker地址:https://hub.docker.com/r/xuxueli/xxl-job-admin/     (建议指定版本号)docker pull xuxueli/xxl-job-admin
  • 创建容器并运行
docker run -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d xuxueli/xxl-job-admin:{指定版本}
/**
* 如需自定义 mysql 等配置,可通过 "-e PARAMS" 指定,参数格式 PARAMS="--key=value  --key2=value2" ;
* 配置项参考文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties
* 如需自定义 JVM内存参数 等配置,可通过 "-e JAVA_OPTS" 指定,参数格式 JAVA_OPTS="-Xmx512m" ;
*/
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d xuxueli/xxl-job-admin:{指定版本}
配置部署“执行器项目”
“执行器”项目:xxl-job-executor-sample-springboot (提供多种版本执行器供选择,现以 springboot 版本为例,可直接使用,也可以参考其并将现有项目改造成执行器)
作用:负责接收“调度中心”的调度并执行;可直接部署执行器,也可以将执行器集成到现有业务项目中。
执行器

这个执行器其实就是咋们自己的项目了,你的定时任务逻辑所在的Project。这里我要说明以下调度中心和执行器的关系有点类似Nacos微服务之间的关系。如果大家知道Nacos注册中心的话大概可以去那么理解,各个微服务启动之后都会把自己注册到Nacos中去,由Nacos统一来发现调度。

maven依赖

确认pom文件中引入了 “xxl-job-core” 的maven依赖;

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.4.0</version>
</dependency>
执行器配置

执行器配置,配置文件地址:

/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/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

yml如下配置

xxl:
  job:
    admin:
      addresses: http://127.0.0.1:8080/xxl-job-admin
    accessToken: default_token
    executor:
      address:
      appname: xxl-job-executor-sample
      ip:
      port: 9999
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: 30
执行器组件配置

执行器组件,配置文件地址:

/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java

参照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;
    }
执行器集群(可选)

执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。

执行器集群部署时,几点要求和建议:

  • 执行器回调地址(xxl.job.admin.addresses)需要保持一致;执行器根据该配置进行执行器自动注册等操作。
  • 同一个执行器集群内AppName(xxl.job.executor.appname)需要保持一致;调度中心根据该配置动态发现不同集群的在线执行器列表。

最终启动执行器的项目看以下是否成功。

在看以下调度中心上的执行器管理中,是否成功注册。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

执行效果

有人执行到这里就开始纳闷了,那我这也注册了啊,我怎么通过这些东西去执行我想要的东西呢?我们到这一步先捋一下思路,思考一下我们完成了什么。我们弄了一个调度中心,就是一个管家,然后启动了一个执行器的项目,一个马仔,并且呢这个马仔还跟管家联系上了。还没完成的是要执行任务的业务代码好像还没写,写哪里呢?又应该怎么调用执行呢?如果有些小伙伴仔细看了xxl-job的那三个子模块,很快就会发现,其实我们平时写的定时任务的业务代码它写在了执行器里,不难理解,我们通过调度中心这个管家可以随意配置一些调度信息,去管理那些马仔也就是执行器,而调度中心并不去关注具体业务逻辑是什么,它关注的是如何调度。

编写业务代码
@Component
public class TestJobTask {

    /**
     * 睡觉通知
     */
    @XxlJob("sleepNotice")
    public void sleepNotice() {
        System.out.println("开始睡觉啦......");
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("醒啦........");
    }
}

这里我们要注意,要使用xxl-job中的一个注解@XxlJob,后续调度中心会根据注解里的值来找到对应的Handler,并执行里面的业务代码。

新建调度规则

在这里插入图片描述
在这里插入图片描述

启动一次

有时候我们的业务场景经常会是这样,定时任务比如每2小时一次,但是呢我们希望是部署成功后,先立马执行一次。这里我们就可以选择执行一次的按钮,先执行一次任务。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

启动

这个是让任务按照设置的Cron表达式定时启动。这里是每3秒执行一次。

在这里插入图片描述
在这里插入图片描述

细说策略
路由策略

在这里插入图片描述

第一个:总是第一个执行。比如一个任务量很大,要三个实例同时运行,但是总是只有第一个去执行。

最后一个:总是最后一个执行。跟上面那个相反。

轮询:三个实例注册到调度中心,调度中心公平的每个都平均执行过去,所谓雨露均沾,大家都有份。

随机:这个跟轮询就相反了,大家看运气了,老天爷赏饭吃。

分片广播:这个是整个策略里重点的东西,干货的玩意。大家可以搜索度娘搜索一下相关资料,类似于可以分布式计算,比如1000W数据量的任务,利用分片广播,可以让各个注册成功的实例,去拿到对应区段的数据,互不干扰,相当于1000W的数据被切成3个通道,每个通道里只消化自己通道里的数据,这样效率就成倍提高了。其实底层原理就是执行器注册到调度中心之后,调度中心给每个执行器都分给他们2个参数,一个是机子的总数,一个是当前机子的索引数。说白了就是你家有兄弟姐妹四人,你出去逢人就说起家里人的时候,你起码得知道2个信息,一个是你爸生了四个孩子,你排第几。这2个信息你肯定是知道的,总不能说你连你爸生几个你都不知道,那还玩个毛线,如果这样的话,那么数据量有部分就无法被消费掉或者执行掉。这里面有一个很经常用到的一个概念,就是Mod,取余的方式,可以度娘搜一下。

总结

以上就是我根据xxl-job官网的中文文档配合自己的实操写出来的体会,大家可以蛮看看,如果你经常用SpringTask的话对这个应该很快就能上手,因为我感觉它就是为了解决当初SpringTask那些轻量级定时框架留下的问题,做的一个比较全面的解决方案。

其实底层原理就是执行器注册到调度中心之后,调度中心给每个执行器都分给他们2个参数,一个是机子的总数,一个是当前机子的索引数。说白了就是你家有兄弟姐妹四人,你出去逢人就说起家里人的时候,你起码得知道2个信息,一个是你爸生了四个孩子,你排第几。这2个信息你肯定是知道的,总不能说你连你爸生几个你都不知道,那还玩个毛线,如果这样的话,那么数据量有部分就无法被消费掉或者执行掉。这里面有一个很经常用到的一个概念,就是Mod,取余的方式,可以度娘搜一下。

总结

以上就是我根据xxl-job官网的中文文档配合自己的实操写出来的体会,大家可以蛮看看,如果你经常用SpringTask的话对这个应该很快就能上手,因为我感觉它就是为了解决当初SpringTask那些轻量级定时框架留下的问题,做的一个比较全面的解决方案。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能_机器学习088_DBSCAN聚类案例_KMeans聚类算法效果展示---人工智能工作笔记0128

然后我们先来看一下上一节的代码首先导包 import numpy as np 导入数学计算包 import matplotlib.pyplot as plt 导入画图包 from sklearn.cluster import KMeans,DBSCAN 导入算法 from sklearn import datasets 导入数据集包 然后我们再去创建数据 X,y = datasets.make_c…

MyBatis学习一:快速入门

前言 公司要求没办法&#xff0c;前端也要了解一下后端知识&#xff0c;这里记录一下自己的学习 学习教程&#xff1a;黑马mybatis教程全套视频教程&#xff0c;2天Mybatis框架从入门到精通 文档&#xff1a; https://mybatis.net.cn/index.html MyBatis 快速入门&#xf…

纠删码ReedSolomon

随着大数据技术的发展&#xff0c;HDFS作为Hadoop的核心模块之一得到了广泛的应用。为了数据的可靠性&#xff0c;HDFS通过多副本机制来保证。在HDFS中的每一份数据都有两个副本&#xff0c;1TB的原始数据需要占用3TB的磁盘空间&#xff0c;存储利用率只有1/3。而且系统中大部分…

初识Linux下进程

&#x1f30e;初识进程 初识进程 简单认识一下进程 如何管理进程 进程属性信息 内核运行队列 查看进程 通过系统调用获取进程标识符       父子进程       查看运行中的进程 总结 前言&#xff1a; 我们在电脑上点开的一个个应用&#xff0c;其实就是一个个进程&am…

【输入npm install express出现的报错】

目录 输入&#xff1a;npm install express&#xff0c;出现如下的报错 分析原因 方法1&#xff1a;用管理员的身份进行安装 方法2&#xff1a;更改文件夹的权限 输入&#xff1a;npm install express&#xff0c;出现如下的报错 分析原因&#xff1a; npm在执行安装过程中…

HTML5和JS实现明媚月色效果

HTML5和JS实现明媚月色效果 先给出效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html> <head><title>明媚月光效果</title><style>body {margin: 0;overflow: hidden;background-color: #000; /* 添加一个深色背景以便看到…

vscode中增加参数的一个方法

1 在settings.json 文件中增加参数 2. 在参数中配置 这里也是ok的

VMware 虚拟机 ubuntu 20.04 硬盘扩容方法

前言 最近由于需要编译 【RK3568】的 Linux SDK&#xff0c;发现 虚拟机默认的 200G 空间不足了&#xff0c;因此想增加这个 200G 空间的限制&#xff0c;通过网络上查找了一些方法&#xff0c;加上自己亲自验证&#xff0c;确认 硬盘扩容 正常&#xff0c;方法也比较的容易&a…

MySQL--安装与配置与向日葵的基本操作使用

一.MySQL介绍 1.1 MySQL简介 MySQL是一个开源的关系型数据库管理系统&#xff0c;最早由瑞典MySQL AB公司开发。这个数据库系统有着高可靠性、高性能和易用性的特点&#xff0c;在互联网上得到了广泛的应用。MySQL支持SQL语言&#xff0c;可以运行在多种操作系统上&#xff0c…

draw流程图工具导入云原生(CNCF)相关控件

目录 1、通过draw导入xml文件&#xff0c;获取云原生相关的空间 2、引用自己的资源链接&#xff1a; 1、通过draw导入xml文件&#xff0c;获取云原生相关的空间 导入资源图库&#xff0c;资源放在下方&#xff0c;大家可以下载&#xff1a; 2、引用自己的资源链接&#xff1a;…

C#中汉字转区位码

目录 一、关于区位码 1.区位码定义 2.算法 二、实例 三、生成效果 四、程序中的知识点 1.byte[] GetBytes(string s) 2.字节数组转short类型 一、关于区位码 1.区位码定义 区位码是一个4位的十进制数&#xff0c;每个区位码都对应着一个唯一的汉字&#xff0c;区位码…

小白综述:深度学习 OCR 图片文字识别

文章目录 1. OCR 算法流程1.1 传统 OCR 方法1.2 深度学习 OCR 方法1.2.1 two-stage方法&#xff1a;文字检测识别1.2.2 端到端方法 2. 文本检测算法3. 文本识别算法3.1 基于分割的单字符识别方法3.2 基于序列标注的文本行识别方法 1. OCR 算法流程 OCR (Optical Character Rec…

opencv期末练习题(3)附带解析

创建黑色画板&#xff0c;并支持两种画图功能 import mathimport cv2 import numpy as np """ 1. 创建一个黑色画板 2. 输入q退出 3. 输入m切换画图模式两种模式&#xff0c;画矩形和画圆形。用户按住鼠标左键到一个位置然后释放就可以画出对应的图像 "&qu…

Blender:从新手到专家的全方位指南

Blender&#xff0c;这款强大的开源3D建模和渲染软件&#xff0c;已经成为了CG行业的标准工具之一。它不仅拥有丰富的教程资源&#xff0c;而且还在不断发展和完善中。尽管Blender的教程主要集中在国外网站和YouTube上&#xff0c;但其全面的功能和易用性使它成为许多人的首选工…

基于深度卷积神经网络的猴痘分类识别系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文详细介绍了一基于深度卷积神经网络的猴痘分类识别系统。采用TensorFlow和Keras框架&#xff0c;通过卷积神经网络&#xff08;CNN&#xff09;进行模型训练和预测&#xff0c;利用迁移学习中的…

【ESP-NOW Web 服务器传感器仪表板 (ESP-NOW + Wi-Fi)】

【ESP-NOW Web 服务器传感器仪表板 &#xff08;ESP-NOW Wi-Fi&#xff09;】 1. 前言2. 同时使用 ESP-NOW 和 Wi-Fi3. 项目概况4. 先决条件4.1 环境配置4.2 DHT 库4.3 ESPAsyncWebSrv服务器库4.4 Arduino_JSON4.5 所需零件4.6 获取接收板 MAC 地址4.7 ESP32 发送电路 5. ESP3…

Linux使用yum命令安装postgrepsql

1.检查安装源 yum search postgresql 2.安装 yum install postgresql-server 3.启动数据库 service postgresql start 4.查看启动状态 service postgresql status 5.登陆测试 su - postgrep psql \l6.远程连接 6.1修改配置文件 在pg_hba.conf增加host all all 0.0.0…

微服务整合:构建高效灵活的分布式系统

随着软件开发的不断演进和业务的复杂性增加&#xff0c;微服务架构已经成为一种流行的解决方案。然而&#xff0c;当涉及到多个微服务之间的整合时&#xff0c;我们需要谨慎考虑如何实现高效、灵活的分布式系统。 微服务架构的流行使得软件开发变得更加灵活和可扩展。然而&…

JDK、JRE、JVM的联系与区别

JDK、JRE、JVM的联系与区别 一、JDK,JRE,JVM定义 JDK(Java Development Kit),包含JRE,以及增加编译器和调试器等用于程序开发的文件。 JRE(Java Runtime Environment)&#xff0c;包含Java虚拟机、库函数、运行Java应用程序所必须的文件。 JVM(Java Virtual Machine)是一个虚…