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表中。
对于此示例,我们将解决方案分为两个阶段:
billsetuptask: 该billsetuptask应用程序是一个使用 Spring Cloud Task 创建BILL_STATEMENTS表的 Spring Boot 应用程序。billrun:该billrun应用程序是一个 Spring Boot 应用程序,它使用 Spring Cloud Task 和 Spring Batch 从 JSON 文件中读取每一行的使用数据和价格,并将结果数据放入BILL_STATEMENTS表中。
对于本节,我们创建一个 Spring Cloud Task and Boot 应用程序,该应用程序创建BILL_STATEMENTSBillRun 应用程序使用的表。下图显示了该BILL_STATEMENTS表:

初始化
您可以[直接下载 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 站点并按照以下说明进行操作:
- 访问Spring Initialzr 站点。
- 选择最新版本的 Spring Boot。
io.spring使用 Group 名称和 Artifact 名称创建一个新的 Maven 项目billsetuptask。- 在依赖项文本框中,键入
task并选择 Cloud Task 依赖项。 - 在依赖项文本框中,键入
jdbc并选择 JDBC 依赖项。 - 在依赖项文本框中,键入
h2并选择 H2 依赖项。我们使用 H2 进行单元测试。 - 在Dependencies文本框中,键入
mysql并选择 MySQL 依赖项(或您喜欢的数据库)。我们使用 MySQL 作为运行时数据库。 - 单击生成项目按钮。
现在您应该unzip将billsetuptask.zip文件导入到您喜欢的 IDE 中。
设置 MySql
如果您没有可用的 MySQL 实例,您可以按照以下说明运行此示例的 MySQL docker 映像:
-
通过运行以下命令拉取 MySQL docker 映像:
复制
docker pull mysql:5.7.25 -
通过运行以下命令启动 MySQL:
复制
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_DATABASE=task -d mysql:5.7.25
构建应用程序
现在我们可以创建此应用程序所需的代码。为此:
- 创建
io.spring.billsetuptask.configuration包。 - 在
io.spring.billsetuptask.configuration包中,创建一个TaskConfiguration类似于以下清单的类:
复制
@Configuration
@EnableTask
public class TaskConfiguration {@Autowiredprivate DataSource dataSource;@Beanpublic 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 {@Autowiredprivate DataSource dataSource;@Testpublic 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。
现在我们可以构建项目了。为此:
-
在命令行中,将目录更改为项目的位置,并通过运行以下 Maven 命令构建项目:
./mvnw clean package -
BILL_STATEMENTS使用在 MySQL 数据库中创建表所需的配置运行应用程序。要配置billsetuptask应用程序的运行方式,您可以使用以下参数:spring.datasource.url:将 URL 设置为您的数据库实例。在以下示例中,我们通过task端口 3306 连接到本地计算机上的 MySQL 数据库。spring.datasource.username:用于 MySQL 数据库的用户名。在下面的示例中,它是root.spring.datasource.password:用于 MySQL 数据库的密码。在以下示例中。它是password。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.properties并BillSetupTaskApplication从您的 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_NAME是application.
您可以使用以下命令来查询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 statushost: 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.toolsgroupId><artifactId>jib-maven-pluginartifactId><version>0.10.1version><configuration><from><image>springcloud/openjdkimage>from><to><image>${docker.org}/${project.artifactId}:${docker.version}image>to><container><useCurrentTimestamp>trueuseCurrentTimestamp>container>configuration>
plugin>
然后将引用的属性添加到properties. 对于此示例,我们使用以下属性:
复制
<docker.org>springcloudtaskdocker.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: Nevercontainers:- name: taskimage: springcloudtask/billsetuptask:0.0.1-SNAPSHOTenv:- name: SPRING_DATASOURCE_PASSWORDvalueFrom:secretKeyRef:name: mysqlkey: mysql-root-password- name: SPRING_DATASOURCE_URLvalue: jdbc:mysql://mysql:3306/task- name: SPRING_DATASOURCE_USERNAMEvalue: root- name: SPRING_DATASOURCE_DRIVER_CLASS_NAMEvalue: com.mysql.cj.jdbc.DriverinitContainers:- name: init-mysql-databaseimage: mysql:5.6env:- name: MYSQL_PWDvalueFrom:secretKeyRef:name: mysqlkey: mysql-root-passwordcommand:['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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
