调试流应用程序

应用程序应该可以作为标准 Java JAR 运行,可以使用 java -jar 调用。所有依赖项(例如数据库和消息中间件)都应该是可用的,并且应该手动测试连接问题。运行和调试应用程序独立于使用 SCDF 部署和在平台上运行。

项目构建错误

下图显示了构建错误的典型调试过程

Yes
No
Errors in IDE
Run using Maven CLI
Success?
Fix IDE errors
Fix code errors

在 IDE 中修复错误取决于您使用的 IDE。验证构建在 IDE 之外是否成功有助于排除特定于项目的问题。

应用程序启动异常

下图显示了应用程序启动异常的典型调试过程

Yes
Yes
No
Application Exceptions
Review stacktrace
General Coding Errors
Fix Code
Connection Exceptions
Valid configuration?
Test manually & apply any changes
Fix settings

当应用程序启动时,可能会由于一般的编码错误或连接问题而发生异常。查看应用程序日志文件以查找异常并进行相应的修复。确保所有外部服务都可访问,提供了正确的凭据,并且任何其他所需的信息都是正确的。

一般应用程序调试

下图显示了一般应用程序调试的典型调试过程

Review stacktrace
Enable JDWP for debugging
Enable Spring Integration debug logging

应用程序可以作为普通的 Java 进程进行调试,也可以通过将日志级别设置为 DEBUG 来使用详细的日志输出进行调试。

要使用调试器调试应用程序,请在启动应用程序时添加必要的 JVM 参数,如下所示(使用示例值)

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005

通过添加此参数,您的应用程序将在端口 5005 上等待调试器连接,以便您可以开始调试。这可以是您选择的任何未被使用的端口。

启用 DEBUG 级别的日志记录也是一种有用的辅助手段。一个值得关注的包是 Spring Integration (SI):org.springframework.integration。要启用此包的调试日志记录,请在启动应用程序时添加以下 JVM 参数

-Dlogging.level.org.springframework.integration=DEBUG

数据丢失

下图显示了数据丢失的典型调试过程

Yes
No
Yes
Yes
No
No
No
Data is lost
Middleware Accessible?
Valid configuration?
TestBinder in build test scope?
Are messages in middleware?
Move to test scope
Test manually / fix settings
Verify configuration
Verify Binder Configuration
Enable SI debug logging

源、处理器和接收器通过所选中间件上的 Binder 实例进行通信。确保中间件可用并且所有配置都正确。配置包括凭据、队列和主题名称、主机以及其他详细信息。默认情况下,如果项目的类路径中未包含绑定器依赖项,则使用 TestBinder

下图显示了有问题的源的典型调试过程

Yes
No
Yes
No
Not Producing Data
Verify External Service Accessibility
EnableBinding Annotated?
Handler Method Defined?
Enable SI logging for output channel

源从输入获取数据并将数据发送到输出通道以进行下游处理。确保存在正确的类级别注释 (@EnableBinding(Source.class)) 并且已实现处理程序方法。处理程序方法应使用 Source.OUTPUT 的输出通道。

处理器 - 输入

下图显示了发送到处理器的输入的典型调试过程

Yes
No
Yes
No
No Input Data
EnableProcessor Annotated?
StreamListener Annotated?
Enable SI logging for input channel

处理器获取数据并对其进行操作,然后返回该数据以供后续下游处理。 确保存在正确的类级别注释(@EnableBinding(Processor.class)),并且已实现处理程序方法。 处理程序方法应使用 Source.INPUT 的输入通道。

处理器 - 输出

下图显示了处理器输出的典型调试过程

Yes
No
Yes
No
No Output Data
EnableProcessor Annotated?
SendTo Annotated?
Enable SI logging for input channel

处理器获取数据并对其进行处理,然后返回该数据以供后续下游处理。 确保存在正确的类级别注释(@EnableBinding(Processor.class)),并且已实现处理程序方法。 处理程序方法应使用 Source.OUTPUT 的输出通道。

接收器

下图显示了接收器的典型调试过程

Yes
No
Yes
No
Yes
No
Not Receiving Data
EnableSink Annotated?
StreamListener Annotated?
External Service Accessible?
Enable SI logging for input channel

接收器从输入通道获取数据并对其进行处理(例如将该数据存储在外部存储库中)。 确保存在正确的类级别注释(@EnableBinding(Sink.class)),并且已实现处理程序方法。 处理程序方法应使用 Source.INPUT 的输出通道。

调试 Cloud Foundry 部署

下图显示了 Cloud Foundry 部署的典型调试过程

No
Yes
Yes
No
Verify Manifest
Verify environment variables
Services to bind created?
Errors in application log files?
Resolve exceptions
Enable SI logging for appropriate channels

如果应用程序在本地运行但在部署到 Cloud Foundry 时失败,请先检查部署清单(manifest.yml)是否正确。 这包括必须设置的所有环境变量、要绑定到的服务以及是否创建了这些服务。 检查应用程序启动日志中是否有任何异常需要解决。

调试 Kubernetes 部署

下图显示了 Kubernetes 部署的典型调试过程

No
Yes
No
Yes
No
Yes
Yes
Verify Deployment files
Verify environment variables
External services accessible?
Pod in RUNNING state?
kubectl describe POD_NAME
Errors in event table?
Resolve errors
kubectl logs POD_NAME
Application exceptions?
Resolve errors

如果应用程序在本地运行正常,但在部署到 Kubernetes 时失败,请首先检查部署文件的正确性。这包括必须设置的任何环境变量、服务连接到的属性,以及这些服务是否可用。检查应用程序 Pod 的事件表,以查看创建 Pod 时出现的问题,例如镜像拉取原因、健康检查失败等。检查应用程序启动日志以查找任何要解决的异常。

容器

下图显示了容器的典型调试过程

No
Yes
Yes
No
Yes
No
Create Container
Launch Container using 'docker run' with env variables and args
Successful?
Update container creation
Launch Container using 'docker run'
Create K8s pod spec yaml for container
Apply pod spec yaml in K8s instance
Successful?
Problem Resolved
Update Pod Spec Yaml
Success
Open Git Issue for Data Flow

如前所述,应用程序可能在您的本地平台上按预期运行,但在从 Spring Cloud Data Flow 启动时仍然失败。这可能是因为创建容器的工具(例如:DockerFile、Spring Boot 容器插件、Jib 等)创建容器的方式。上图显示了如何排查由于容器相关问题导致应用程序无法启动的原因。

Data Flow 使用通用应用程序属性Spring Boot 通用标签将通用指标标签应用于所有已部署的Stream应用程序。这些属性通常使用Spring 占位符来解析它们的值。请考虑以下示例:| management.metrics.tags.application: ${spring.cloud.dataflow.stream.name:unknown}-${spring.cloud.dataflow.stream.app.label:unknown}-${spring.cloud.dataflow.stream.app.type:unknown} |某些镜像容器可能无法正确解析此内容,并错误地将嵌入的属性替换为空字符串,这可能会导致流应用程序失败。如果您没有使用指标,则可以通过将spring.cloud.dataflow.applicationProperties.streamResource设置为不存在的文件来禁用这些字段,如下所示:spring.cloud.dataflow.applicationProperties.streamResource=classpath:fake.yml