在本文中,我将向您展示如何在 AWS Elastic Container Service (ECS) 上使用 Fargate 启动类型部署 XXL-Job-Admin。XXL-Job 是一款分布式任务调度平台,由 Java 编写,提供 Web 界面进行任务管理。我们将使用 AWS 应用程序负载均衡器 (ALB) 公开 XXL-Job-Admin 服务。

前提条件

在开始之前,请确保您已经具备以下条件:

  • 一个 AWS 账户
  • 已安装并配置好 AWS CLI
  • 已安装 Docker

初始数据

https://github.com/xuxueli/xxl-job/blob/2.2.0/doc/db/tables_xxl_job.sql
或
https://gitee.com/xuxueli0323/xxl-job/blob/2.2.0/doc/db/tables_xxl_job.sql
  • 1.
  • 2.
  • 3.

步骤

1. 创建 VPC 和子网

如果您还没有 VPC 和子网,请先创建它们。Fargate 需要使用专用子网。您可以按照  AWS 文档 创建 VPC 和子网。

记录下您的 VPC ID 和子网 ID,稍后会用到。

2. 创建 ECS 集群

使用 AWS CLI 创建一个 ECS 集群:

aws ecs create-cluster --cluster-name my-fargate-cluster
  • 1.

3. 创建任务定义

创建一个 task-definition.json 文件,内容如下:

{
    "family": "dev-xxl-job-admin",
    "executionRoleArn": "ecsTaskExecutionRole",
    "networkMode": "awsvpc",
    "containerDefinitions": [
        {
            "name": "xxl-job-admin",
            "image": "xuxueli/xxl-job-admin:2.2.0",
            "portMappings": [
                {
                    "containerPort": 8080,
                    "hostPort": 8080,
                    "protocol": "tcp"
                }
            ],
            "environment": [
                {
                    "name": "PARAMS",
                    "value": "-XX:MaxRAMPercentage=100.0 -XX:InitialRAMPercentage=5 --spring.datasource.username=YOUR_DB_USERNAME --spring.datasource.password=YOUR_DB_PASSWORD --xxl.job.login.password=YOUR_XXL_PASSWORD --spring.datasource.url=YOUR_DB_URL"
                }
            ],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-create-group": "true",
                    "awslogs-group": "/ecs/dev-xxl-job-admin",
                    "awslogs-region": "YOUR_AWS_REGION",
                    "awslogs-stream-prefix": "ecs"
                }
            },
            "healthCheck": {
                "command": [
                    "CMD-SHELL",
                    "curl -f http://localhost:8080/xxl-job-admin/actuator/health || exit 1"
                ],
                "interval": 30,
                "timeout": 5,
                "retries": 3
            }
        }
    ],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "256",
    "memory": "512"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.

注意替换以下值:

  • YOUR_DB_USERNAME: 您的数据库用户名
  • YOUR_DB_PASSWORD: 您的数据库密码
  • YOUR_XXL_PASSWORD: xxl-job-admin 的登录密码
  • YOUR_DB_URL: 您的数据库连接 URL
  • YOUR_AWS_REGION: 您的 AWS 区域

例如如下参数:

-XX:MaxRAMPercentage=100.0 -XX:InitialRAMPercentage=5 --spring.datasource.username=root --spring.datasource.password=123456 --xxl.job.login.password=1342023 --spring.datasource.url=jdbc:mysql://test-cluster.cluster-cviu5goyqplm.us-east-1.rds.amazonaws.com:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false
  • 1.

参数说明:

-XX:MaxRAMPercentage=100.0

  • 这是一个 Java 虚拟机参数,用于设置 Java 进程可以使用的最大内存百分比。在这里,它被设置为 100%,表示可以使用所有可用的内存资源。

-XX:InitialRAMPercentage=5

  • 这也是一个 Java 虚拟机参数,用于设置 Java 进程初始化时分配的内存百分比。在这里,它被设置为 5%,表示初始化时只分配 5% 的内存资源。

--spring.datasource.username=root

  • 这是一个 Spring 应用程序的配置参数,用于设置连接数据库时使用的用户名。在这里,用户名被设置为 "root"。

--spring.datasource.password=123456

  • 这是一个 Spring 应用程序的配置参数,用于设置连接数据库时使用的密码。在这里,密码被设置为 "123456"。

--xxl.job.login.password=1342023

  • 这是一个 XXL-Job-Admin 应用程序的配置参数,用于设置 Web 界面的登录密码。在这里,登录密码被设置为 "1342023"。

--spring.datasource.url=jdbc:mysql://test-cluster.cluster-cviu5goyqplm.us-east-1.rds.amazonaws.com:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false

  • 这是一个 Spring 应用程序的配置参数,用于设置连接数据库时使用的 JDBC URL。在这里,URL 指向一个 Amazon RDS 数据库实例,数据库名称为 "xxl_job"。URL 中还包含了一些其他的连接选项,如字符编码、是否允许多查询和是否使用 SSL 等。

注册任务定义:

aws ecs register-task-definition --cli-input-json file://task-definition.json
  • 1.

4. 创建 ALB

创建一个 Application Load Balancer (ALB):

aws elbv2 create-load-balancer \
    --name my-alb \
    --scheme internet-facing \
    --type application \
    --ip-address-type ipv4 \
    --subnets $SUBNET_IDS
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

将 $SUBNET_IDS 替换为您的公共子网 ID,用逗号分隔。

5. 创建目标组

创建一个目标组,用于将流量路由到您的 Fargate 服务:

aws elbv2 create-target-group \
    --name my-target-group \
    --protocol HTTP \
    --port 80 \
    --vpc-id $VPC_ID \
    --target-type ip \
    --health-check-path "/xxl-job-admin/actuator/health"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

将 $VPC_ID 替换为您的 VPC ID。

6. 创建 ALB 监听器

创建一个 ALB 监听器,用于监听传入的流量:

aws elbv2 create-listener \
    --load-balancer-arn $LOAD_BALANCER_ARN \
    --protocol HTTP \
    --port 80 \
    --default-actions Type=forward,TargetGroupArn=$TARGET_GROUP_ARN
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

将 $LOAD_BALANCER_ARN 替换为上一步创建的 ALB 的 ARN,将 $TARGET_GROUP_ARN 替换为上一步创建的目标组的 ARN。

7. 创建 Fargate 服务

创建一个 Fargate 服务,并将其与 ALB 和目标组关联:

aws ecs create-service \
    --cluster my-fargate-cluster \
    --service-name my-service \
    --task-definition xxl-job-admin \
    --desired-count 2 \
    --launch-type "FARGATE" \
    --network-configuration "awsvpcConfiguration={subnets=[$SUBNET_IDS],securityGroups=[$SECURITY_GROUP_IDS],assignPublicIp=DISABLED}" \
    --load-balancers "targetGroupArn=$TARGET_GROUP_ARN,containerName=xxl-job-admin,containerPort=8080"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

将以下值替换为您自己的值:

  • my-fargate-cluster: 您的 ECS 集群名称
  • my-service: 您的服务名称
  • xxl-job-admin: 您的任务定义家族名称
  • $SUBNET_IDS: 您的子网 ID,用逗号分隔
  • $SECURITY_GROUP_IDS: 您的安全组 ID,用逗号分隔
  • $TARGET_GROUP_ARN: 您之前创建的目标组的 ARN

现在,您的 xxl-job-admin 应用就已经在 Fargate 上运行了,并通过 ALB 公开服务。您可以使用 ALB 的 DNS 名称来访问您的应用程序。

后续操作

  • 配置 xxl-job-admin 的数据库连接
  • 配置 xxl-job 执行器,并将其部署到 ECS 或其他环境中
  • 设置 AWS CloudWatch 监控和警报
  • 配置自动扩展策略以根据需求自动扩展或缩减服务

通过本文,您已经学习了如何在 AWS ECS Fargate 上部署 XXL-Job-Admin。