【问题标题】:How to spawn a docker instance for each spring boot api call and map a unique id to each docker instance?如何为每个 spring boot api 调用生成一个 docker 实例并将一个唯一的 id 映射到每个 docker 实例?
【发布时间】:2021-11-24 13:55:00
【问题描述】:

我的 Spring Boot 服务中有一堆 api 调用。比方说,

http://localhost:8080/me/customize
http://localhost:8080/me/addItem
http://localhost:8080/me/revokeItem

当用户点击 http://localhost:8080/me/customize api 时,我必须触发一个 docker 实例(并在生成的 docker 实例中执行一些代码)并提供一个唯一的id 给用户。用户将使用该唯一 id 来访问其他 api。

这个过程应该发生在所有用户身上。假设有 100 个用户点击了自定义 api,我需要有 100 个 docker 实例,每个 docker 实例都有一个唯一标识符,用户应该使用该唯一 ID 从那里与 docker 实例通信。

我是否需要编写 java 代码来处理 docker 生成并将唯一 id 映射到每个 docker 实例?

我是一名测试人员,这是我第一次处理开发问题。你们中的任何人都可以指出我正确的方向或某种教程吗?我已经用谷歌搜索了,但仍然没有找到任何答案。

【问题讨论】:

  • 嗨@Kishore Mohanavelu,您在问题中附加了标签“kubernetes”。你在用吗?
  • 这里的用户是指一个人的权利,而不是另一个应用程序?
  • 我会使用Spring AMQP 或类似的东西将请求发送到消息队列中;单独地,具有长时间运行的工作容器,这些容器使用来自队列的消息并执行它们。您可以在不涉及 Docker 的情况下构建和测试它。更关键的是,你不能访问 Docker 套接字,除非你不能 root 整个主机,而且你需要弄清楚如果你的主应用程序退出并留下容器,如何清理。

标签: java spring-boot docker kubernetes


【解决方案1】:

我是否需要编写 java 代码来处理 docker 生成和映射 每个 docker 实例的唯一 ID?

理想情况下,您可以,但如果您以任何其他方式使用 Kubernetes 作业,则管理起来会很困难。使用部署很容易,但我不建议这样做。如果可以的话,宁可实现 Pub/sub 或队列消息传递。

我必须触发一个 docker 实例(并在 生成的 docker 实例)并为用户提供一个唯一的 id。

我不确定每次生成新实例背后的确切要求或原因是什么。

当用户调用 API 时,您可以创建 Pub/Sub 或队列系统,它将负载添加到队列中,进一步的工作 POD 将使用该负载并一一处理。

您可以将结果或 ID 存储到 RedisMySQL 中,并在需要时供其他服务或应用程序进一步使用。

您还可以使用 RabbitMQ 之类的排队系统或 https://github.com/OptimalBits/bull 之类的库。

您可以创建多个工作人员副本,它们将订阅单个队列或通道并处理有效负载并将 ID 保存到 Redis 等数据库。

如果对每个进程运行副本有特定要求,则编写代码逐个生成 POD 可能会创建不同的部署或作业。

【讨论】:

  • 感谢您的回复。关于这个问题,我必须触发一个 docker 实例(并在生成的 docker 实例中执行一些代码)并向用户提供一个唯一的 id,这意味着每个 docker 实例将被视为一个独立的环境,其中该唯一的代码id 只执行。
  • 你好像不太清楚,你说的 docker instance 是什么意思?你在 kubernets 上,那么它应该是 POD。
【解决方案2】:

我必须触发一个 docker 实例(并在生成的 docker 实例中执行一些代码)并向用户提供一个唯一的 ID

这是docker run --rm codegeneratorimage:v1.0 /bin/sh -c "your code to generate the unique id"

我不太明白你在测试什么,你想测试在http://localhost:8080/me/customize 后面运行的应用程序吗?为什么不测试端点?

无论如何,要触发 docker run 你有很多选择:

  1. 如果您在云环境中,他们有类似 AWS lambda 的东西,您可以设置类似 http://localhost:8080/me/customize 并触发 docker run
  2. 编写一个 golang 网络服务,您可以轻松运行 docker run 命令 Exec a shell command in Go + https://golang.org/doc/tutorial/web-service-gin(推荐)。如果您更熟悉.. 或其他 PL,您也可以为此编写一个 python 网络服务

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    相关资源
    最近更新 更多