赞
踩
官方文档 https://www.xuxueli.com/xxl-job/
几个非常常见的业务场景:
这些场景往往都要求我们在某个特定的时间去做某个事情
分布式集群的模式下,如果采用集中式的任务调度方式,会带来一些问题,比如
由于集中式的定时任务调度需要解决一系列问题 ,所以在演进的过程中产生一些解决办法。
调度中心:服务端:是一个web管理后台
执行器:客户端:就是我们希望自动执行的代码,业务逻辑
自研的调度模块,通过RPC远程调用
因此,“调度”和“执行”两部分可以相互解耦,提高系统整体稳定性和扩展性。
从调度系统的角度来看,可以分成两类:
执行器管理是调度中心连接的多个执行器的名称、地址等进行管理。
任务管理是对xx执行器进行任务的具体设置,比如负责人、任务描述、超时时间、失败次数等等
在执行器集群部署时,使用不同的路由策略,比如:
FIRST(第一个):固定选择第一个机器;
RANDOM(随机):随机选择在线的机器;
ROUND(轮询)等等
Cron表达式是一个具有时间含义的字符串,字符串以56个空格隔开,分为67个域,格式为X X X X X X X
。其中X
是一个域的占位符。最后一个代表年份的域非必须,可省略。
具体设置方式参考:https://help.aliyun.com/document_detail/64769.html
运行模式为 “BEAN模式” 时生效,对应执行器中新开发的JobHandler类“@XxlJob”注解自定义的value值;
阻塞处理策略是调度过于密集执行器来不及处理时的处理策略。
运行报表、调度日志、执行器管理都比较常规。
用户管理(权限管理)的功能比较弱,一般公司会进行二次开发。
调度中心支持集群部署,提升调度系统容灾和可用性。支持Docker镜像搭建。
即实现多个调度中心,高可用,官方文档建议通过nginx为调度中心集群做负载均衡。
利用spring框架中集成的SMTP邮件服务
配置方法参考:
发件人是在调度中心application.properties中设置好,包括授权码
收件人在任务设置界面设置好
//执行器连接调度中心的地址和token要设置好
xxl.job.admin.addresses=http://127.0.0.1:8002/xxl-job-admin
xxl.job.accessToken=default_token
//执行器名字、端口、ip等
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.address=
xxl.job.executor.ip=
xxl.job.executor.port=9999
//建议使用自动获取IP,多网卡时可手动设置指定IP
里面有spring的bean
注意使用@Component注解@XxlJob注解。
还可以使用String param = XxlJobHelper.getJobParam()来获取参数(调度中心设置的参数)
进入调度中心
新增执行器(上述各种设置)
新增任务(上述各种设置)
调度中心-执行器管理-填写多个机器地址,逗号分隔
任务管理-设置路由策略,比如使用轮询的方式
测试
执行器集群部署时,官方要求:
利用IDEA实现本地“模拟集群”,即把同一个项目(执行器、实例、服务)同时在多个端口号运行。
通过Run中的Edit Configurations=> Allow multiple instances,修改一下端口号等配置,再点击运行实现本地多实例运行。
目标:将上述项目进行执行器集群部署、每隔两秒定时输出一行信息+调度中心传入的参数(paramtest)。
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
String param = XxlJobHelper.getJobParam();
System.out.println("任务执行测试"+"参数:"+param+"time:"+new Date());
}
执行器有两个同样的服务,模拟集群。
调度中心设置2秒执行一次,路由策略为轮询,两个服务轮流2s输出一次,正常
也进行了故障转移的测试。
Quartz作为开源作业调度中的佼佼者,是作业调度的首选。但是集群环境中Quartz采用API的方式对任务进行管理,从而可以避免上述问题,但是同样存在以下问题:
rtz进行对比
Quartz作为开源作业调度中的佼佼者,是作业调度的首选。但是集群环境中Quartz采用API的方式对任务进行管理,从而可以避免上述问题,但是同样存在以下问题:
XXL-JOB弥补了quartz的上述不足之处
这包含了学习过程中遇到的相关技术和知识,包括没接触过的和之前学过但需要再重点复习的。
同一个业务,部署在多个服务器上。代表技术:Nginx集群
一个业务分拆成多个子业务,部署在不同的服务器上。
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
好的设计应该是分布式和集群的结合,先分布式再集群,具体实现就是业务拆分成很多子业务,然后针对每个子业务进行集群部署,这样每个子业务如果出了问题,整个系统完全不会受影响。
面向服务架构。中间有ESB:企业服务总线。目的是将原先系统间散乱、无规划的网状结构,梳理成规整、可治理的星形结构。
为了解决分布式中出现的复杂的子业务直接的调用关系来提出的。
在SOA基础上进一步解决架构复杂问题。微服务的拆分更细,针对于单一的服务进行更细致化的拆分,更轻量化,并通过更高级、更轻量的rest-api通信取代了ESB。
微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
容器就是将软件打包成标准化单元,以用于开发、交付和部署。
Docker 是世界领先的软件容器平台
Java号称“一次编译,到处运行”,因为java虚拟机解决平台的兼容性问题,所以有java虚拟机的地方就能跑java代码;
Docker是:“一次封装,到处运行”,因为docker解决了应用环境的问题,安装了docker的平台就能跑“docker包”,这样就决绝了“开发环境能跑,一上线就崩”的尴尬。
Docker包含Image(镜像)、Container(容器)、Repository(仓库)
高可用(High availability)的主要目的是为了保障业务的连续性,即在用户眼里,业务永远是正常(或者说基本正常)对外提供服务的。
实现高可用基本思路
FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
AdminLTE 是一个完全响应管理模板,主要依赖于 Bootstrap 3、jQuery 1.11+ 这两个框架,插件中使用的基本都是Bootstrap和jQquery插件。
Spring Boot Actuator就是一款可以帮助你监控系统数据的框架,其可以监控很多很多的系统数据,它有对应用系统的自省和监控的集成功能,可以查看应用配置的详细信息,比如:
自动配置Autoconfigure
起步依赖Starter
命令行界面CLI
监控器Actuator
可以查询各种缺失的依赖:https://mvnrepository.com/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。