【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-adminaccessToken: default_tokenexecutor:address:appname: xxl-job-executor-sampleip:port: 9999logpath: /data/applogs/xxl-job/jobhandlerlogretentiondays: 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;@Beanpublic 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那些轻量级定时框架留下的问题,做的一个比较全面的解决方案。

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

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

相关文章

【userfaultfd 条件竞争】starCTF2019 - hackme

前言 呜呜呜&#xff0c;这题不难&#xff0c;但是差不多一个多月没碰我的女朋友 kernel pwn 了&#xff0c;对我的 root 宝宝也是非常想念&#xff0c;可惜这题没有找到我的 root 宝宝&#xff0c;就偷了她的 flag。 哎有点生疏了&#xff0c;这题没看出来堆溢出&#xff0c…

Linux引导过程与服务控制

目录 一、操作系统引导过程 1. 过程图示 2. 步骤解析 2.1 bios 2.2 mbr 2.3 grup 2.4 加载内核文件 3. 过程总结 4. centos6和centos7启动区别 5. 小结 二、服务控制及切换运行级别 1. systemd核心概念 2. 运行级别 3. Systemd单元类型 4. 运行级别所对应的Syst…

基于YOLOv8深度学习的人脸面部表情识别系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

js文件上传 分片上传/断点续传/极速秒传

(极速秒传)利用md5判断上传的文件是否存在 MD5信息摘要算法&#xff0c;一种被广泛使用的密码散列函数&#xff0c;可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;用于确保信息传输完整一致。 每一个文件都会生成…

对接第三方接口鉴权(Spring Boot+Aop+注解实现Api接口签名验证)

前言 一个web系统&#xff0c;从接口的使用范围也可以分为对内和对外两种&#xff0c;对内的接口主要限于一些我们内部系统的调用&#xff0c;多是通过内网进行调用&#xff0c;往往不用考虑太复杂的鉴权操作。但是&#xff0c;对于对外的接口&#xff0c;我们就不得不重视这个…

Elasticsearch:结合 ELSER 和 BM25 文本查询的相关搜索

Elastic Learned Spare EncodeR (ELSER) 允许你执行语义搜索以获得更相关的搜索结果。 然而&#xff0c;有时&#xff0c;将语义搜索结果与常规关键字搜索结果相结合以获得最佳结果会更有用。 问题是&#xff0c;如何结合文本和语义搜索结果&#xff1f; 首先&#xff0c;让我…

Java异常篇----第二篇

系列文章目录 文章目录 系列文章目录前言一、 Excption与Error包结构二、Thow与thorws区别三、Error与Exception区别?四、error和exception有什么区别前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女…

1213:八皇后问题 深度优先搜索算法

1213&#xff1a;八皇后问题 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 在国际象棋棋盘上放置八个皇后&#xff0c;要求每两个皇后之间不能直接吃掉对方。 【输入】 (无) 【输出】 按给定顺序和格式输出所有八皇后问题的解&#xff08;见样例&#xff09;。 题目…

Spring源码之依赖注入(二)

书接上文 文章目录 一. Autowire底层注入逻辑1. 属性注入逻辑 一. Autowire底层注入逻辑 前面我们分析了Spring时如何找到某个目标类的所有注入点这一个核心逻辑&#xff0c;但还没又对核心注入方法inject进行详细分析&#xff0c;下面我们就来详细分析Spring拿到所有的注入点…

【CASS精品教程】CASS11计算城镇建筑密度

CASS中可以很方便计算建筑密度。 文章目录 一、建筑密度介绍二、CASS计算建筑密度1. 绘制宗地范围2. 绘制建筑物3. 计算建筑密度三、注意事项一、建筑密度介绍 建筑密度(building density;building coverage ratio),指在一定范围内,建筑物的基底面积总和与占用地面积的比…

纠删码ReedSolomon

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

Spring Boot 2.7.11 集成 GraphQL

GraphQL介绍 GraphQL&#xff08;Graph Query Language&#xff09;是一种用于API的查询语言和运行时环境&#xff0c;由Facebook于2012年创建并在2015年公开发布。与传统的RESTful API相比&#xff0c;GraphQL提供了更灵活、高效和强大的数据查询和操作方式。 以下是GraphQL…

Spring技术内幕笔记之SpringMvc

WebApplicationContext接口的类继承关系 org.springframework.web.context.ContextLoader#initWebApplicationContext 对IOC容器的初始化 SpringMvc如何设计 DispatcherServlet类继承关系 MVC处理流程图如下&#xff1a; DispatcherServlet的工作大致可以分为两个部分&#xf…

NFC物联网开发智能衣橱解决方案

智能衣橱是智能家居的重要内容&#xff0c;现代家居市场对家居智能化控制尤为重视。但是&#xff0c;传统家居生产功能和模式已经无法满足智能化时代的需求&#xff0c;所以家居智能化成为家居行业发展的主要需求。与传统衣橱对比&#xff0c;智能衣橱的功能强大方便人们的生活…

Android--Jetpack--WorkManager详解

2024已经到来&#xff0c;愿你安睡时&#xff0c;山河入梦。愿你醒来时&#xff0c;满目春风。愿你欢笑时&#xff0c;始终如一。愿你行进时&#xff0c;前程似锦&#xff0c;坦荡从容。 编程语言的未来&#xff1f; 目录 一&#xff0c;定义 二&#xff0c;特点 三&#xff0c…

‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。这个问题如何解决?

这个错误信息 vue-cli-service 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件 表示 vue-cli-service 命令在你的系统上未被识别。这通常是因为 Vue CLI 没有被正确安装或其路径没有被加入到系统的环境变量中。以下是几个解决这个问题的步骤&#xff1a; 确认 …

LinkedList与ArrayList的比较

1.LinkedList 基于双向链表&#xff0c;无需连续内存 随机访问慢&#xff08;要沿着链表遍历&#xff09; 头尾插入删除性能高 占用内存多 2.ArrayList 基于数组&#xff0c;需要连续内存 随机访问快&#xff08;指根据下标访问&#xff09; 尾部插入、删除性能可以&…

从0搭建github.io网页

点击跳转到&#x1f517;我的博客文章目录 从0搭建github.io网页 文章目录 从0搭建github.io网页1.成果展示1.1 网址和源码1.2 页面展示 2.new对象2.1 创建仓库 3.github.io仓库的初始化3.1 千里之行&#xff0c;始于足下3.2 _config.yml3.3 一点杂活 4.PerCheung.github.io.p…

Linux 命令echo

命令作用 输出一行字符串在shell中&#xff0c;可以打印变量的值输出结果写入到文件在显示器上显示一段文字&#xff0c;起到提示的作用 语法 echo [选项] [字符串] 参数 字符含义-n不自动换行-e解释转义字符-E不解释转义字符 如果-e有效&#xff0c;则识别以下序列&…

SpringBoot 项目如何生成 swagger 文档

推荐使用 springdoc-openapi 的理由 1、springdoc-openapi 是 spring 官方出品&#xff0c;与 springboot 兼容更好&#xff08;springfox 兼容有坑&#xff09; 2、springdoc-openapi 社区更活跃&#xff0c;springfox 已经 2 年没更新了 3、springdoc-openapi 的注解更接近 …