小编KDW*_*KDW的帖子

HashiCorp Vault 动态机密和 Spring Boot

我对 HashiCorp Vault 用于为 Spring Boot 动态提供数据库机密的用例感到困惑。假设您有两个微服务:一个包含应用程序逻辑,另一个运行数据库引擎。第一个显然需要对数据库进行身份验证,这就是动态秘密发挥作用的地方。Vault 可以向第一个微服务提供此类凭据,因此您不必在管理两个微服务的 docker-compose 文件中使用 ENV 变量等。 在此输入图像描述

该应用程序可以是依赖 Spring Cloud Vault 的 Spring Boot 微服务来处理与 HashiCorp Vault 的通信以进行凭证管理。微服务启动时会要求 Vault 提供临时数据库凭据(在本例中它们持续一小时)。在此一小时的时间间隔内,应用程序可以连接到数据库并执行任何需要执行的操作。一小时后,凭据将过期并且不允许进行任何通信。

Spring Boot Cloud Vault 文档提到

当达到最大租用时间时,Spring Cloud Vault 不支持获取新凭据并使用它们配置数据源。也就是说,如果 Vault 中数据库角色的 max_ttl 设置为 24h,则意味着应用程序启动 24 小时后将无法再通过数据库进行身份验证。

换句话说,一小时后,连接丢失,除了重新启动微服务之外,似乎没有其他方法可以获取新的数据库凭据。那么如果有以下问题:

  1. 如果每次 TTL 过期时您(看似)被迫重新启动整个应用程序,那么在此特定示例中使用 Vault 的附加价值是什么?
  2. 当您使用静态机密时,这是否同样适用?
  3. 不改变微服务代码能解决这个问题吗?(K8S、Istio 等?)

我的猜测是 Vault 与 Spring Boot 的预期用途与我的理解不同。

spring-boot microservices docker-compose hashicorp-vault

5
推荐指数
1
解决办法
956
查看次数

Axon 或 Kafka 支持 CQRS/ES

考虑一个简单的用例,我想将产品评级作为事件存储在事件存储中。

我可以使用两种不同的方法:

  1. 使用Axon:Rating聚合负责处理CreateRatingCommand并发送RatingCreatedEvent。发送事件会将评级存储在事件存储中。其他事件处理程序可以在连接到 Axon 服务器实例并执行评级所需的任何操作时重播事件流。在这种情况下,事件处理程序将用作流处理器。
  2. 使用Kafka: KafkaProducer 将用于在 Kafka 主题中存储评级 POJO(正确序列化后)。将主题的保留时间设置为无限期将导致任何事件都不会及时丢失。在这种情况下,Kafka Streams 将用于执行实际的评级处理逻辑。

对于这两种方法,我都出现了一些架构问题:

使用轴突时:

  1. 如果聚合内没有需要维护或更改的真实状态,那么使用 Axon(或类似解决方案)是否有任何附加值?聚合仅充当数据的“哑”占位符,但不提供任何状态更改逻辑。
  2. Axon 如何处理同一事件类型的多个事件处理程序?它们是否都会并行处理相同的事件(相同的聚合 ID),或者相同的事件仅由其中一个处理程序处理一次?
  3. 存储在 Axon 事件存储中的事件是否会保留到时间结束?

使用卡夫卡时:

  1. Kafka 将具有相同键的事件/消息存储在同一分区中。在用户产品评级用例中,如何为密钥选择最佳值?UserId、ProductId 或两者的单独主题,并在两个主题中发布每个事件。
  2. 为每个用户和每个产品使用单独的主题是否明智,从而导致集群上有大量主题?(大约<5k 个产品和>10k 个用户)。

我不知道 SO 是否是此类问题的首选论坛...我只是想知道您在这个特定用例中推荐什么作为最佳实践。期待您的反馈,并随时指出我在之前的问题中遗漏的其他想法。

编辑@12/11/2020:我刚刚找到了一个相关的讨论,其中包含与我的问题相关的有用信息。

architecture cqrs event-sourcing apache-kafka axon

4
推荐指数
1
解决办法
3508
查看次数

为什么“spring-boot:build-image”运行Spring Boot应用程序?

两个简单的问题:

  1. 为什么使用命令创建 Docker 镜像时会执行 Spring Boot 应用程序mvnw spring-boot:build-image
  2. 是否有命令行选项可以防止这种情况发生?

我正在为 Spring Boot 应用程序构建 Docker 映像。该应用程序依赖于其他第三方服务,这些服务在映像构建过程中不一定(也不应该)可用。因此,映像构建失败,因为 Spring Boot 应用程序在启动时检查这些第三方依赖项并尝试重新连接,直到它们可用。旁注:后者无法更改,因为它内置在正在使用的第三方服务的框架中。

我也不明白为什么应该实际启动应用程序来构建 Docker 映像。

感谢您的回复以及可能的其他背景信息。

maven buildpack docker spring-boot

0
推荐指数
1
解决办法
1343
查看次数