从部署在 PCF 上的另一个应用程序调用一个 java 应用程序

Call one java app from another deployed on PCF

我已经在 PCF 上部署了 2 个独立的简单 spring 启动 java 应用程序。

customer-service-1
order-service-1

customer-service-1 公开了一个 Rest End Point /url/customerList 现在我想从

打电话给/url/customerList
  1. 订单服务 1
  2. 以及任何未部署在 PCF 上的应用程序

我该怎么做?

您没有提供很多信息,所以这要视情况而定,但您有几个选择。

  1. 映射到您的 order-service-1 的路线,例如 order-service-1.example.com。然后您可以向 https://order-service-1.example.com 提出请求。这些请求将有一些额外的网络跃点,因为流量将离开环境并通过负载均衡器和 Gorouter 返回。

    请注意 example.com 只是一个占位符,您需要 运行 cf domains 并查看您的 PCF 基础上有哪些域可用。

  2. 将内部路由映射到 order-service-1,如 order-service-1.apps.internal。然后cf add-network-policy customer-service-1 --destination-app order-service-1 --port 8080。这将允许端口 8080 上的流量从您的 customer-service-1 应用程序到内部容器到容器网络上的 order-service-1 应用程序(永远不会超出基础)。

    请注意,在这种情况下 apps.internal 应该是一个存在于所有基础上的域,除非您的运营商更改名称或禁用 C2C 网络,这种情况并不常见。

这两个选项都应该有效,如果两个应用程序都在同一个 PCF 基础上,那么您可能希望使用第二个选项。请求的延迟会稍微少一些,并且不会超出基础。也就是说,在我写这篇文章时,容器到容器网络上没有可用的 HTTPS[1]。您会注意到我们在上面的示例中使用了端口 8080,它仅用于 HTTP。因此,如果您需要端到端 HTTPS/encryption,则需要使用第一个选项。

除此之外,选择您喜欢的 HTTP 客户端库,例如 Apache HTTPClient、Spring WebClient,或者只使用内置于 JVM 中的库来发起 HTTP/HTTPS 请求。


[1] - 从技术上讲,Envoy 有一个 HTTPS 选项,每个容器中都有 运行s。然而,在撰写本文时,Envoy 将显示一个证书,其中的主题与您的内部路由的主机名不匹配。这意味着,如果您尝试使用此选项,您的 . While an option, it's not recommended to just ignore this hostname mismatch error, so to make this work you'd need to write a custom hostname matcher. I know you can do that with Apache HTTPClient,但您对其他库的选项可能会有所不同。