天天看點

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)

目錄

  • 1 背景概述
  • 2 集中式任務排程
  • 3 分布式任務排程
    • 3.1 集中式 的問題
    • 3.2 解決
  • 4 xxl-job 整體架構
  • 5 案例使用
  • 6 叢集
  • 7 路由政策(一緻性哈希)
    • 7.1 傳統hash算法
    • 7.2 傳統hash算法問題
    • 7.3 什麼是一緻性hash算法

1 背景概述

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)

2 集中式任務排程

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)
xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)

3 分布式任務排程

3.1 集中式 的問題

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)

3.2 解決

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)

4 xxl-job 整體架構

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)

5 案例使用

1 先下載下傳服務端,就是下載下傳這個web的管理背景

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)
xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)
xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)

我們自己寫一個項目,這個項目就是執行器了,在建立的項目裡面,将核心庫引入

<!-- 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
    }           

複制

以上的項目就是執行器項目,就完成了,之後打開管理中心,在管理中心裡面進行配置

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)
xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)
xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)

之後寫任務,就是這個執行器項目裡面有很多的任務,有的任務需要開啟,有的需要關閉,那麼每一個方法就是一個任務,那麼每一個都需要單獨的在這個管理平台進行注冊

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)
xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)

進行啟動就可以了;

以上就開發完成了;就實作了定時功能了;

6 叢集

就是我們的執行器項目,一下子部署了多個伺服器上面,但是任務執行,隻能同一個時間隻能一個進行執行,這個就涉及到叢集的 分布式排程、;

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)
xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)

以上就配置好了叢集 的模式;

7 路由政策(一緻性哈希)

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)

7.1 傳統hash算法

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)

7.2 傳統hash算法問題

就是新增伺服器節點,删除伺服器節點,存儲資料的時候,會根據節點個數進行重新計算,這個是會導緻之前的緩存進行失效,會造成緩存雪崩;是以就引出了一緻性的hash算法

7.3 什麼是一緻性hash算法

xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)
xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)
xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)
xxl-job 任務排程 項目的學習(架構使用步驟)1 背景概述2 集中式任務排程3 分布式任務排程4 xxl-job 整體架構5 案例使用6 叢集7 路由政策(一緻性哈希)