Spring Cloud Data Flow简单任务-7

简单任务

使用 Spring Cloud 任务进行批处理

在本指南中,我们开发了一个使用 Spring Cloud Task 的 Spring Boot 应用程序并将其部署到 Cloud Foundry、Kubernetes 和您的本地计算机。在另一个指南中,我们使用 Data Flow部署任务应用程序。

以下部分描述了如何从头开始构建此应用程序。如果您愿意,您可以下载一个包含应用程序源代码(称为billsetup)的 zip 文件,将其解压缩,然后继续进行部署步骤。

您可以从浏览器下载项目,也可以从命令行运行以下命令:

wget https://github.com/spring-cloud/spring-cloud-dataflow-samples/blob/master/dataflow-website/batch-developer-guides/batch/batchsamples/dist/batchsamples.zip?raw=true -O batchsamples.zip
开发

我们从Spring Initializr开始,创建一个 Spring Cloud Task 应用程序。

假设手机数据提供商需要为客户创建账单。使用数据存储在存储在文件系统上的 JSON 文件中。计费解决方案必须从这些文件中提取数据,从该使用数据生成计费数据,并将其存储在BILLING_STATEMENTS表中。

对于此示例,我们将解决方案分为两个阶段:

  1. billsetuptask: 该billsetuptask应用程序是一个使用 Spring Cloud Task 创建BILL_STATEMENTS表的 Spring Boot 应用程序。
  2. billrun:该billrun应用程序是一个 Spring Boot 应用程序,它使用 Spring Cloud Task 和 Spring Batch 从 JSON 文件中读取每一行的使用数据和价格,并将结果数据放入BILL_STATEMENTS表中。

对于本节,我们创建一个 Spring Cloud Task and Boot 应用程序,该应用程序创建BILL_STATEMENTSBillRun 应用程序使用的表。下图显示了该BILL_STATEMENTS表:

BILL_STATMENTS

初始化

您可以[直接下载 Spring Initialzr 生成的项目,](https://start.spring.io/starter.zip?type=maven-project&language=java&baseDir=billsetuptask&groupId=io.spring&artifactId=billsetuptask&name=Bill Setup Task&description=Bill Setup Task Sample App&packageName=io.spring.billsetuptask&packaging=jar&dependencies=cloud-task&dependencies=h2&dependencies=mysql&dependencies=jdbc)也可以访问Spring Initializr 站点并按照以下说明进行操作:

  1. 访问Spring Initialzr 站点
  2. 选择最新版本的 Spring Boot。
  3. io.spring使用 Group 名称和 Artifact 名称创建一个新的 Maven 项目billsetuptask
  4. 依赖项文本框中,键入task并选择 Cloud Task 依赖项。
  5. 依赖项文本框中,键入jdbc并选择 JDBC 依赖项。
  6. 依赖项文本框中,键入h2并选择 H2 依赖项。我们使用 H2 进行单元测试。
  7. Dependencies文本框中,键入mysql并选择 MySQL 依赖项(或您喜欢的数据库)。我们使用 MySQL 作为运行时数据库。
  8. 单击生成项目按钮。

现在您应该unzipbillsetuptask.zip文件导入到您喜欢的 IDE 中。

设置 MySql

如果您没有可用的 MySQL 实例,您可以按照以下说明运行此示例的 MySQL docker 映像:

  1. 通过运行以下命令拉取 MySQL docker 映像:

    复制

    docker pull mysql:5.7.25
    
  2. 通过运行以下命令启动 MySQL:

    复制

    docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=password \
    -e MYSQL_DATABASE=task -d mysql:5.7.25
    
构建应用程序

现在我们可以创建此应用程序所需的代码。为此:

  1. 创建io.spring.billsetuptask.configuration包。
  2. io.spring.billsetuptask.configuration包中,创建一个TaskConfiguration类似于以下清单的类:

复制

@Configuration
@EnableTask
public class TaskConfiguration {

    @Autowired
    private DataSource dataSource;

    @Bean
    public CommandLineRunner commandLineRunner() {
        return args -> {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS " +
                    "BILL_STATEMENTS ( id int, " +
                    "first_name varchar(50), last_name varchar(50), " +
                    "minutes int,data_usage int, bill_amount double)");
        };
    }
}

@EnableTask注解设置了一个TaskRepository,其中存储了有关任务执行的信息(例如任务的开始和结束时间以及退出代码)。

测试

现在我们可以创建我们的测试了。为此,请BillsetuptaskApplicationTests.java使用以下代码更新 的内容:

package io.spring.billsetuptask;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
class BillSetupTaskApplicationTests {

	@Autowired
	private DataSource dataSource;

	@Test
	public void testRepository() {
		JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSource);
		int result = jdbcTemplate.queryForObject(
				"SELECT COUNT(*) FROM BILL_STATEMENTS", Integer.class);
		assertThat(result).isEqualTo(0);
	}

}

在您的 IDE 中运行此测试。spring.datasource由于未设置Spring Boot 的属性,因此测试针对嵌入式 H2 数据库运行。在下一步中,您可以部署应用程序并以 MySQL 数据库为目标。

本地部署

在本节中,我们将任务应用程序部署到本地机器、Cloud Foundry 和 Kubernetes。

现在我们可以构建项目了。为此:

  1. 在命令行中,将目录更改为项目的位置,并通过运行以下 Maven 命令构建项目: ./mvnw clean package

  2. BILL_STATEMENTS使用在 MySQL 数据库中创建表所需的配置运行应用程序。要配置billsetuptask应用程序的运行方式,您可以使用以下参数:

    1. spring.datasource.url:将 URL 设置为您的数据库实例。在以下示例中,我们通过task端口 3306 连接到本地计算机上的 MySQL 数据库。
    2. spring.datasource.username:用于 MySQL 数据库的用户名。在下面的示例中,它是root.
    3. spring.datasource.password:用于 MySQL 数据库的密码。在以下示例中。它是password
    4. spring.datasource.driverClassName: 用于连接 MySQL 数据库的驱动程序。在下面的示例中,它是com.mysql.cj.jdbc.Driver.

    以下命令billsetuptask使用我们的数据库连接值运行应用程序:

    java -jar target/billsetuptask-0.0.1-SNAPSHOT.jar \
    '--spring.datasource.url=jdbc:mysql://localhost:3306/task?useSSL=false' \
    --spring.datasource.username=root \
    --spring.datasource.password=password \
    --spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
    

    或者,您可以将这些属性放入application.propertiesBillSetupTaskApplication从您的 IDE 中运行。

查看数据库中的任务执行结果

Spring Cloud Task 将所有任务执行记录到一个名为TASK_EXECUTION. 下面是 Spring Cloud Task 记录的一些信息:

  • START_TIME: 任务执行开始的时间
  • END_TIME:任务执行完成的时间
  • TASK_NAME: 与任务执行相关的名称
  • EXIT_CODE:任务执行返回的退出码
  • EXIT_MESSAGE:为执行返回的退出消息
  • ERROR_MESSAGE:为执行返回的错误消息(如果有)
  • EXTERNAL_EXECUTION_ID: 与任务执行相关联的 ID

默认情况下,TASK_NAMEapplication.

您可以使用以下命令来查询TASK_EXECUTION表:

复制

$ docker exec -it mysql bash -l
# mysql -u root -ppassword
mysql> select * from task.TASK_EXECUTION;

结果应类似于以下输出:

复制

| TASK_EXECUTION_ID | START_TIME          | END_TIME            | TASK_NAME       | EXIT_CODE | EXIT_MESSAGE | ERROR_MESSAGE | LAST_UPDATED        | EXTERNAL_EXECUTION_ID | PARENT_EXECUTION_ID |
|-------------------|---------------------|---------------------|-----------------|-----------|--------------|---------------|---------------------|-----------------------|---------------------|
|                 1 | 2019-04-23 18:10:57 | 2019-04-23 18:10:57 | application     |         0 | NULL         | NULL          | 2019-04-23 18:10:57 | NULL                  |                NULL |
设置任务执行的应用程序名称

在上表中,该TASK_NAME列的默认值为application。Spring Cloud Task 允许我们使用spring.cloud.task.name. 为此,我们将该属性添加到下一次运行中,如下所示:

复制

java -jar target/billsetuptask-0.0.1-SNAPSHOT.jar \
--spring.datasource.url=jdbc:mysql://localhost:3306/task?useSSL=false \
--spring.datasource.username=root \
--spring.datasource.password=password \
--spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver \
--spring.cloud.task.name=BillSetupTest1

现在,当您查询表时,您可以看到查询中运行的最后一个任务现在的名称为BillSetupTest1.

清理

要停止和删除在 docker 实例中运行的 MySQL 容器,请运行以下命令:

复制

docker stop mysql
docker rm mysql
Kubernetes

本节介绍如何在 Kubernetes 上部署和运行一个简单的spring-cloud-task应用程序。

我们将billsetuptask示例应用程序部署到 Kubernetes。

设置 Kubernetes 集群

我们需要一个正在运行的Kubernetes 集群。对于此示例,我们部署到minikube.

验证 Minikube 是否正在运行

要验证 Minikube 是否正在运行,请运行以下命令(显示其输出):

复制

$ minikube status

host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100
安装数据库

您需要使用 Spring Cloud Data Flow 中的默认配置安装 MySQL 服务器。为此,请运行以下命令:

复制

kubectl apply -f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/v2.9.1/src/kubernetes/mysql/mysql-deployment.yaml \
-f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/v2.9.1/src/kubernetes/mysql/mysql-pvc.yaml \
-f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/v2.9.1/src/kubernetes/mysql/mysql-secrets.yaml \
-f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/v2.9.1/src/kubernetes/mysql/mysql-svc.yaml
构建 Docker 镜像

我们需要为billsetuptask应用程序构建 docker 镜像。为此,我们使用jib Maven 插件。如果您下载了源代码分发版,则 jib 插件已配置。如果您从头开始构建应用程序,请在pluginsin下添加以下内容pom.xml

复制

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>0.10.1</version>
    <configuration>
        <from>
            <image>springcloud/openjdk</image>
        </from>
        <to>
            <image>${docker.org}/${project.artifactId}:${docker.version}</image>
        </to>
        <container>
            <useCurrentTimestamp>true</useCurrentTimestamp>
        </container>
    </configuration>
</plugin>

然后将引用的属性添加到properties. 对于此示例,我们使用以下属性:

复制

<docker.org>springcloudtask</docker.org>
<docker.version>${project.version}</docker.version>

现在您可以将映像添加到minikubeDocker 注册表。为此,请运行以下命令:

复制

eval $(minikube docker-env)
./mvnw clean package jib:dockerBuild

您可以运行以下命令来验证其存在(通过springcloudtask/billsetuptask在结果图像列表中查找):

复制

docker images

Spring Cloud Data Flow 已经测试了由Spring Boot 的 gradle/maven 插件jib maven 插件docker build命令创建的容器。

部署应用程序

部署任务应用程序的最简单方法是作为独立Pod。将任务部署为作业CronJob被认为是生产环境的最佳实践,但超出了本指南的范围。

首先,将以下内容保存到task-app.yaml

apiVersion: v1
kind: Pod
metadata:
  name: billsetuptask
spec:
  restartPolicy: Never
  containers:
    - name: task
      image: springcloudtask/billsetuptask:0.0.1-SNAPSHOT
      env:
        - name: SPRING_DATASOURCE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql
              key: mysql-root-password
        - name: SPRING_DATASOURCE_URL
          value: jdbc:mysql://mysql:3306/task
        - name: SPRING_DATASOURCE_USERNAME
          value: root
        - name: SPRING_DATASOURCE_DRIVER_CLASS_NAME
          value: com.mysql.cj.jdbc.Driver
  initContainers:
    - name: init-mysql-database
      image: mysql:5.6
      env:
        - name: MYSQL_PWD
          valueFrom:
            secretKeyRef:
              name: mysql
              key: mysql-root-password
      command:
        [
          'sh',
          '-c',
          'mysql -h mysql -u root -e "CREATE DATABASE IF NOT EXISTS task;"',
        ]

现在您可以通过运行以下命令来启动应用程序:

复制

kubectl apply -f task-app.yaml

任务完成后,您应该会看到类似于以下内容的输出:

复制

$ kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
mysql-5cbb6c49f7-ntg2l   1/1     Running     0          4h
billsetuptask            0/1     Completed   0          81s

对结果满意后,可以删除 pod。为此,请运行以下命令:

复制

kubectl delete -f task-app.yaml

现在您可以检查数据库以查看运行应用程序的结果。为此,请登录到mysql容器并查询TASK_EXECUTION表。通过运行获取 MySQL pod 的名称kubectl get pods,如前所示。然后需要登录,如下:

复制

$ kubectl exec -it mysql-5cbb6c49f7-ntg2l -- /bin/bash
# mysql -u root -p$MYSQL_ROOT_PASSWORD
mysql> select * from task.TASK_EXECUTION;

要卸载mysql,请运行以下命令:

复制

kubectl delete all -l app=mysql
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕布辕门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值