草庐IT

java - 为生产环境配置 Spring Cloud Config Server 和 Spring Cloud Vault

coder 2024-04-02 原文

我正在尝试设置一个由 Spring Cloud Vault secret 管理支持的 Spring Cloud Config Server。我对 Spring 比较陌生,但我已经尝试按照此处的说明和示例进行操作:-

http://cloud.spring.io/spring-cloud-vault-config/

如果您遵循默认设置,例如 vault 端点的 http、localhost 和 8200 以及 tls_disable = 1 以关闭 SSL,则一切正常。然而,这些不是任何真实环境的实用设置,而且几乎没有任何例子可以帮助解决这个问题。谁能帮忙举个例子?

我已成功设置启用 TLS 的保管库。我已经成功设置了一个使用自签名证书连接的配置服务器。我什至可以将一个 secret 值注入(inject)配置服务器并通过 @Value@PostConstruct 公开它。

所有这一切都在起作用。但是,当我尝试利用 Spring Conig 端点访问保险库时,我得到以下信息:-

{
  "timestamp": 1486413850574,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "org.springframework.web.client.ResourceAccessException",
  "message": "I/O error on GET request for \"http://127.0.0.1:8200/v1/secret/myapp\": Connection refused: connect; nested exception is java.net.ConnectException: Connection refused: connect",
  "path": "/myapp/default"
}

即使我在 bootstrap.yml 中设置了覆盖,配置服务器仍使用默认值。:-

server:
    port: 8888

spring:
    profiles:
        active: vault

spring.cloud.vault:
    host: myhost.mydomain.com
    port: 8200
    scheme: https
    authentication: TOKEN
    token: 0f1887c3-d8a8-befd-a5a2-01e4e066c50
    ssl:
        trust-store: configTrustStore.jks
        trust-store-password: changeit

如您所见,它应该指向 myhost.mydomain.com 而不是 127.0.0.1 并且它应该使用 https,而不是 http 作为协议(protocol)方案。

我不确定为什么它对配置服务器端点使用这些默认值,但在 spring cloud vault 启动期间使用正确的设置。我正在使用 Spring Dalsten.M1 和 Spring Cloud Vault 1.0.0.M1 的所有最新稳定版本。我意识到这些是里程碑版本。我也尝试过 Camden 和 Brixton 组合,但没有成功。如果需要,我可以提供代码。

非常感谢任何帮助。

最佳答案

正如我在对 spensergibb 的回复中提到的,我自己已经成功地解决了这个问题。根据他的评论,我将阐明我的意图,因为这将有助于对问题达成共识。我正在尝试做两件事:-

  1. 建立一个使用 Vault 作为后端(与默认 GIT 后端相对)的配置服务器,并将 Vault API 公开给客户端应用程序(通过 TLS),以便它们可以检索自己的 secret 。我不希望我所有的客户端应用程序都直接连接到 Vault。我希望他们通过让配置服务器连接到 Vault 从配置服务器获取配置。直到昨晚,我才能够实现这个目标,除非我将所有内容都设置为默认设置,禁用 TLS 并使用环回地址,Vault 软件的端口 8200 等。显然,默认设置对于我们部署的任何环境都不实用。我会提到 spencergibb 发布的链接确实帮助我理解了为什么这不起作用,但原因的微妙之处在于我之前错过它的原因。请继续阅读我的解释。

  2. 我希望配置服务器直接从 Vault 配置自身。即通过 Spring Cloud Vault Config 连接到 Vault。如文档中所述,这对我立即起作用。然而,这个目标有点微不足道,因为我目前没有真正的用例。但我想知道这是否可以完成,因为我没有看到不这样做的真正原因,而且这似乎是集成 Vault 的良好开端。

这两种功能之间的区别帮助我理解了问题源于 Spring Cloud Config Server 和 Spring Cloud Vault 似乎使用两种不同的 bean 来注入(inject) Vault 配置属性这一事实。 Spring Cloud Config Server 使用带有 @ConfigurationProperties("spring.cloud.config.server.vault") 注释的 VaultEnvironmentRepository,而 Spring Cloud Vault 使用带有 @ConfigurationProperties("spring.cloud.vault") 注释的 VaultProperties。

这导致我向 Bootstrap yml 添加了两个不同的配置。

server:
    port: 8888

spring:
    profiles:
        active: local, vault

    application:
        name: quoting-domain-configuration-server

    cloud:
        vault:
            host: VDDP03P-49A26EF.lm.lmig.com
            port: 8200
            scheme: https
            authentication: TOKEN
            token: 0f1997c3-d8a8-befd-a5a2-01e4e066c50a
            ssl:
                trust-store: configTrustStore.jks
                trust-store-password: changeit

        config:
            server:
                vault:
                    host: VDDP03P-49A26EF.lm.lmig.com
                    port: 8200
                    scheme: https
                    authentication: TOKEN
                    token: 0f1997c3-d8a8-befd-a5a2-01e4e066c50a

注意相同的配置细节。只是不同的 yml 路径。这是我错过的微妙之处,因为我首先让目标 1 开始工作,并假设相同的配置适用于两个目标。 (注意: token 和密码是人为设计的)。

除了 SSL 握手错误外,这几乎可以正常工作。如您所见,在 spring.cloud.config.server.vault 路径上没有设置 SSL 属性。 VaultProperties bean 不支持它们。我不确定如何处理这个问题(也许是我找不到的另一个非 vault 特定的 bean)。我的解决方案是像这样简单地强制自己进行证书配置:-

@SpringBootApplication
@EnableConfigServer
public class Application
{
    public static void main(String[] args)
    {
        System.setProperty("javax.net.ssl.trustStore",
            Application.class.getResource("/configTrustStore.jks").getFile());
        System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
        SpringApplication.run(Application.class, args);
    }
}

这个 SSL 解决方案非常丑陋。我确信必须有更好的方法来完成这一部分。所以我愿意接受其他建议。但是,一旦我完成了上述所有步骤,现在一切正常。

关于java - 为生产环境配置 Spring Cloud Config Server 和 Spring Cloud Vault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42077583/

有关java - 为生产环境配置 Spring Cloud Config Server 和 Spring Cloud Vault的更多相关文章

  1. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  4. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  5. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  6. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  9. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  10. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

随机推荐