目錄
- 1 背景概述
- 2 集中式任務排程
- 3 分布式任務排程
- 3.1 集中式 的問題
- 3.2 解決
- 4 xxl-job 整體架構
- 5 案例使用
- 6 叢集
- 7 路由政策(一緻性哈希)
- 7.1 傳統hash算法
- 7.2 傳統hash算法問題
- 7.3 什麼是一緻性hash算法
1 背景概述
2 集中式任務排程
3 分布式任務排程
3.1 集中式 的問題
3.2 解決
4 xxl-job 整體架構
5 案例使用
1 先下載下傳服務端,就是下載下傳這個web的管理背景
我們自己寫一個項目,這個項目就是執行器了,在建立的項目裡面,将核心庫引入
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${project.parent.version}</version>
</dependency>
複制
自己寫業務,方法上寫注解
@XxlJob("自定義名稱")
複制
自己寫一個yml,裡面 的東西是
# web port
server.port=8081
# no web
#spring.main.web-environment=false
# log config
logging.config=classpath:logback.xml
### 排程中心部署根位址 [選填]:如排程中心叢集部署存在多個位址則用逗号分隔。
# 執行器将會使用該位址進行"執行器心跳注冊"和"任務結果回調";
# 為空則關閉自動注冊;
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 執行器通訊TOKEN [選填]:非空時啟用;
### xxl-job, access token
xxl.job.accessToken=default_token
### 執行器AppName [選填]:執行器心跳注冊分組依據;為空則關閉自動注冊
### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
### 執行器注冊 [選填]:優先使用該配置作為注冊位址,
# 為空時使用内嵌服務 ”IP:PORT“ 作為注冊位址。
# 進而更靈活的支援容器類型執行器動态IP和動态映射端口問題。
xxl.job.executor.address=
### xxl-job executor server-info
### 執行器IP [選填]:預設為空表示自動擷取IP,多網卡時可手動設定指定IP,
# 該IP不會綁定Host僅作為通訊實用;位址資訊用于 "執行器注冊" 和
# "排程中心請求并觸發任務";
xxl.job.executor.ip=
### 執行器端口号 [選填]:小于等于0則自動擷取;預設端口為9999,
# 單機部署多個執行器時,注意要配置不同執行器端口;
xxl.job.executor.port=9999
### xxl-job executor log-path
### 執行器運作日志檔案存儲磁盤路徑 [選填] :
# 需要對該路徑擁有讀寫權限;為空則使用預設路徑;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
### 執行器日志檔案儲存天數 [選填] : 過期日志自動清理,
# 限制值大于等于3時生效; 否則, 如-1, 關閉自動清理功能;
xxl.job.executor.logretentiondays=30
複制
自己寫一個配置類
package com.xxl.job.executor.core.config;
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();
*/
}
複制
自己的controller
@Component
public class SampleXxlJob {
private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);
/**
* 1、簡單任務示例(Bean模式)
*/
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
XxlJobHelper.log("XXL-JOB, Hello World.");
System.out.println("第"+"次");
for (int i = 0; i < 5; i++) {
XxlJobHelper.log("beat at:" + i);
System.out.println("執行");
System.out.println(i);
TimeUnit.SECONDS.sleep(2);
}
// default success
}
複制
以上的項目就是執行器項目,就完成了,之後打開管理中心,在管理中心裡面進行配置
之後寫任務,就是這個執行器項目裡面有很多的任務,有的任務需要開啟,有的需要關閉,那麼每一個方法就是一個任務,那麼每一個都需要單獨的在這個管理平台進行注冊
進行啟動就可以了;
以上就開發完成了;就實作了定時功能了;
6 叢集
就是我們的執行器項目,一下子部署了多個伺服器上面,但是任務執行,隻能同一個時間隻能一個進行執行,這個就涉及到叢集的 分布式排程、;
以上就配置好了叢集 的模式;
7 路由政策(一緻性哈希)
7.1 傳統hash算法
7.2 傳統hash算法問題
就是新增伺服器節點,删除伺服器節點,存儲資料的時候,會根據節點個數進行重新計算,這個是會導緻之前的緩存進行失效,會造成緩存雪崩;是以就引出了一緻性的hash算法