Cloud Foundry 任务 - 从服务实例调用 REST API

Posted

技术标签:

【中文标题】Cloud Foundry 任务 - 从服务实例调用 REST API【英文标题】:Cloud Foundry Task - Call REST API from the service instance 【发布时间】:2021-12-16 13:59:46 【问题描述】:

有没有办法从 Cloud Foundry 任务(命令)调用在 Cloud Foundry 中运行的服务实例的 REST API。

例如,我有一个名为 my-rest-app 的 Spring Boot 应用程序实例在 PCF 中运行。它有一个端点/sayHello。使用cf run-task my-test-app curl /sayHello?

【问题讨论】:

【参考方案1】:

您可以这样做,但您需要告诉任务如何找到给定的服务。

您的任务在与应用程序不同的容器中运行,因此您不能使用http://localhost:$PORT,因为它们是分开的。这意味着您需要获取该任务的应用程序的 URL。您可以通过几种不同的方式做到这一点。

访问其他应用时

要访问不同的应用程序(即 app1 的任务 -> 应用程序 2),您需要传入目标应用程序的 URL。这可以通过环境变量或绑定服务来完成。

任务和服务共享相同的环境变量和绑定服务,因此只需在您的应用上设置环境变量或将服务绑定到您的应用,您就可以通过任务访问它。

例如:

cf set-env my-cool-app URL 'http://www.example.com/'
cf restart my-cool-app
cf run-task my-cool-app 'curl "$URL"'

确保正确引用最后一条命令,以便不会在本地评估 $URL

cf cups my-service -p url  # populate the url when prompted
cf bind-service my-cool-app my-service
cf restart my-cool-app
cf run-task my-cool-app 'curl $(echo "$VCAP_SERVICES" | jq -r ".[\"user-provided\"][0].credentials.url")'

这有点复杂,但会将请求的 URL 从绑定服务信息所在的 VCAP_SERVICES 环境变量中提取出来。

访问同一个应用时

如果您尝试访问同一个应用(即 app1 的任务 -> app1),您可以从 VCAP_APPLICATION 拉取 URL,这样您就不需要 env 变量或绑定服务。

例如:

cf run-task my-cool-app 'curl https://$(echo "$VCAP_APPLICATION" | jq -r ".uris[0]")'

这将提取映射到应用程序的第一个 URI。如果您有多个路由绑定到您的应用程序,您可能需要调整它以选择不同的 URI。如果您的路由有与之关联的路径,这应该包括一个路由路径。

如果您需要访问/actuator/health 或应用程序下的特定子路径,您只需将其附加到此处获取的 URI 的末尾即可。

【讨论】:

我得到了我需要的东西。看起来没有调用服务的捷径。我们需要完整的网址!谢谢,@Daiel Mikusa

以上是关于Cloud Foundry 任务 - 从服务实例调用 REST API的主要内容,如果未能解决你的问题,请参考以下文章

谷歌云平台上的 Cloud Foundry

Cloud Foundry Session Affinity(Sticky Session)的实现

Cloud Foundry PHP 网站实例因自定义 mime 配置而崩溃

Pivotal Cloud Foundry - Spring Cloud 服务

Cloud FoundryCloud Foundry学习——Service

SUSE收购HPE OpenStack Iaas和Cloud Foundry PaaS