Spring Cloud 配置application.yml与bootstrap.yml快速入门

一、概述

_Spring Cloud Config_是 Spring 的客户端/服务器方法,用于跨多个应用程序和环境存储和提供分布式配置。

此配置存储理想地在 Git_版本控制下进行版本管理,并且可以在应用程序运行时进行修改。虽然它非常适合使用所有支持的配置文件格式以及 _Environment、 _PropertySource 或 @Value_等结构的 Spring 应用程序,但它可以在运行任何编程语言的任何环境中使用。

在本教程中,我们将重点介绍如何设置 _Git_支持的配置服务器,在简单的 _REST_应用程序服务器中使用它,以及设置包括加密属性值的安全环境。

2. 项目设置和依赖

首先,我们将创建两个新的 _Maven_项目。服务器项目依赖于 _spring-cloud-config-server_模块,以及 _spring-boot-starter-security_和 _spring-boot-starter-web_启动包:

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-config-serverartifactId>
dependency>
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-securityartifactId>
dependency>
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

但是,对于客户端项目,我们只需要 spring-cloud-starter-config_和 _spring-boot-starter-web 模块

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-configartifactId>
dependency>
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

3. 一个配置服务器实现

应用程序的主要部分是一个配置类,更具体地说是一个 @SpringBootApplication ,它通过自动配置_注释@EnableConfigServer 引入所有必需的设置 :_

现在我们需要配置我们的服务器正在监听的服务器 端口和一个 Git-url,它提供了我们版本控制的配置内容。后者可以与 httpssh_或本地文件系统上的简单 _文件等协议一起使用。

提示:如果我们计划使用多个指向同一个配置存储库的配置服务器实例,我们可以配置服务器以将我们的存储库克隆到本地临时文件夹中。但请注意具有双重身份验证的私有存储库;他们很难处理!在这种情况下,在我们的本地文件系统上克隆它们并使用副本会更容易。

还有一些用于配置 repository-url的 占位符变量和搜索模式;但是,这超出了我们文章的范围。如果您有兴趣了解更多信息,可以从官方文档开始。

我们还需要在 application.properties中为 _Basic-Authentication_设置用户名和密码,以避免在每次应用程序重新启动时自动生成密码:

server.port=8888
spring.cloud.config.server.git.uri=ssh://localhost/config-repo
spring.cloud.config.server.git.clone-on-start=true
spring.security.user.name=root
spring.security.user.password=s3cr3t

4. 作为配置存储的 Git 存储库

为了完成我们的服务器,我们必须在配置的 url 下初始化一个 _Git_存储库,创建一些新的属性文件,并用一些值填充它们。

配置文件的名称像普通的 Spring application.properties_一样组成,但不是使用单词”application”,而是使用客户端的配置名称,例如属性 “spring.application.name”_的值,后跟一个破折号和活动配置文件。例如:

$> git init
$> echo 'user.role=Developer' > config-client-development.properties
$> echo 'user.role=User'      > config-client-production.properties
$> git add .
$> git commit -m 'Initial config-client properties'

故障排除:如果我们遇到与 ssh_相关的身份验证问题,我们可以在 ssh 服务器上仔细检查 ~/.ssh/known_hosts_和 ~/.ssh/authorized_keys

5.查询配置

现在我们可以启动我们的服务器了。我们的服务器提供的 _Git_支持的配置 API 可以使用以下路径进行查询:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

{label}_占位符表示 Git 分支, {application}表示客户端的应用程序名称, {profile}_表示客户端当前活动的应用程序配置文件。

_因此,我们可以通过以下方式检索在分支master_的开发配置文件下运行的计划配置客户端的配置:

$> curl http://root:s3cr3t@localhost:8888/config-client/development/master

6. 客户端实现

接下来,让我们照顾客户。这将是一个非常简单的客户端应用程序,由一个带有一个 _GET_方法的 _REST_控制器组成。

要获取我们的服务器,必须将配置放在 _application.properties_文件中。Spring Boot 2.4 引入了一种使用 _spring.config.import_属性加载配置数据的新方法,现在这是绑定到 Config Server 的默认方式:

除了应用程序名称之外,我们还将活动配置文件和连接详细信息放在我们的 _application.properties_中:

spring.application.name=config-client
spring.profiles.active=development
spring.config.import=optional:configserver:http://root:s3cr3t@localhost:8888

这将连接到位于 http://localhost:8888 的配置服务器,并且在启动连接时还将使用 HTTP 基本安全性。我们也可以分别使用 spring.cloud.config.usernamespring.cloud.config.password属性分别设置用户名和密码。

在某些情况下,如果服务无法连接到配置服务器,我们可能希望它的启动失败。如果这是所需的行为,我们可以删除可选的:前缀以使客户端停止并出现异常。

为了测试配置是否从我们的服务器正确接收,并且 _角色值_被注入到我们的控制器方法中,我们只需在启动客户端后 curl 它:

$> curl http://localhost:8080/whoami/Mr_Pink

如果响应如下,我们的 _Spring Cloud Config Server_和它的客户端现在工作正常:

Hello! You're Mr_Pink and you'll become a(n) Developer...

7. 加解密

要求:要使用加密强密钥以及 Spring 加密和解密功能,我们需要在我们的 JVM_中安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files” 。_例如,这些可以从Oracle 下载。要安装,请按照下载中包含的说明进行操作。一些 Linux 发行版还通过其包管理器提供可安装的包。

由于配置服务器支持属性值的加密和解密,我们可以使用公共存储库作为敏感数据的存储,如用户名和密码。加密值以字符串 {cipher}_为前缀, 如果服务器配置为使用对称密钥或密钥对,则可以通过对路径 “/加密”的 REST 调用生成。_

还可以使用解密端点。两个端点都接受包含应用程序名称及其当前配置文件的占位符的路径: _’/*/{name}/{profile}’。_这对于控制每​​个客户端的加密特别有用。但是,在它们有用之前,我们必须配置一个加密密钥,我们将在下一节中进行。

提示:如果我们使用 curl 调用 en-/decryption API,最好使用 –data-urlencode_选项(而不是 –data/-d_),或者将 ‘Content-Type’ 标头显式设置为 ‘text/plain ‘.这可确保正确处理加密值中的”+”等特殊字符。

如果一个值在通过客户端获取时无法自动解密,则其 _密钥_将使用名称本身重命名,并以单词”invalid”为前缀。这应该防止使用加密值作为密码。

提示:在设置包含 YAML 文件的存储库时,我们必须用单引号将我们的加密值和前缀值括起来。但是,属性并非如此。

默认情况下,Spring Security 为发送到我们应用程序的所有请求启用CSRF 保护。

因此,为了能够使用 /encrypt_和 /decrypt_端点,让我们为它们禁用 CSRF:

默认情况下,配置服务器能够以对称或非对称方式加密属性值。

要使用对称加密,我们只需将 application.properties中的属性 ‘encrypt.key’_设置为我们选择的秘密 或者,我们可以传入环境变量 _ENCRYPT_KEY

对于非对称加密,我们可以将 ‘encrypt.key’_设置为 _PEM_编码的字符串值或配置要使用的 _密钥库

由于我们的演示服务器需要一个高度安全的环境,我们将选择后一个选项,并首先使用 Java 密钥工具生成一个新的密钥库,包括一个 _RSA_密钥对:

$> keytool -genkeypair -alias config-server-key \
       -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \
       -dname 'CN=Config Server,OU=Spring Cloud,O=Baeldung' \
       -keypass my-k34-s3cr3t -keystore config-server.jks \
       -storepass my-s70r3-s3cr3t

然后我们将创建的密钥库添加到我们服务器的应用程序 _.properties_并重新运行它:

encrypt.keyStore.location=classpath:/config-server.jks
encrypt.keyStore.password=my-s70r3-s3cr3t
encrypt.keyStore.alias=config-server-key
encrypt.keyStore.secret=my-k34-s3cr3t

接下来,我们将查询加密端点,并将响应作为值添加到我们存储库中的配置中:

$> export PASSWORD=$(curl -X POST --data-urlencode d3v3L \
       http://root:s3cr3t@localhost:8888/encrypt)
$> echo "user.password={cipher}$PASSWORD" >> config-client-development.properties
$> git commit -am 'Added encrypted password'
$> curl -X POST http://root:s3cr3t@localhost:8888/refresh

为了测试我们的设置是否正常工作,我们将修改 _ConfigClient_类并重新启动我们的客户端:

最后,针对我们的客户端的查询将显示我们的配置值是否被正确解密:

$> curl http://localhost:8080/whoami/Mr_Pink
Hello! You're Mr_Pink and you'll become a(n) Developer, \
  but only if your password is 'd3v3L'!

如果我们想使用多个密钥进行加密和解密,例如每个服务应用程序的专用密钥,我们可以在 {cipher}_前缀和 _BASE64_编码的属性值之间添加另一个 {name:value}形式的前缀。_

配置服务器几乎可以直接理解 {secret:my-crypto-secret}_或 {key:my-key-alias}之类的前缀。_后一个选项需要在我们的 _application.properties_中配置一个密钥库。搜索此密钥库以查找匹配的密钥别名。例如:

user.password={cipher}{secret:my-499-s3cr3t}AgAMirj1DkQC0WjRv...

user.password={cipher}{key:config-client-key}AgAMirj1DkQC0WjRv...

对于没有密钥库的场景,我们必须实现一个 TextEncryptorLocator_类型的 @Bean,它处理查找并为每个密钥返回一个 _TextEncryptor -Object。

如果我们想禁用服务器端加密并在本地处理属性值的解密,我们可以将以下内容放入服务器的 application.properties

spring.cloud.config.server.encrypt.enabled=false

此外,我们可以删除所有其他 ‘encrypt.*’ 属性以禁用 _REST_端点。

8. 结论

现在我们可以创建一个配置服务器,将一组配置文件从 _Git_存储库提供给客户端应用程序。我们还可以用这样的服务器做一些其他的事情。

例如:

  • YAML_或 _属性_格式而不是 _JSON 提供配置,_也解析了占位符。在非 Spring 环境中使用它时,这可能很有用,其中配置不直接映射到 _PropertySource
  • 依次提供纯文本配置文件,可选择使用已解析的占位符。例如,这对于提供依赖于环境的日志记录配置很有用。
  • 将配置服务器嵌入到应用程序中,它从 Git_存储库进行自我配置,而不是作为服务客户端的独立应用程序运行。因此,我们必须设置一些属性和/或我们必须删除 @EnableConfigServer_注释,这取决于用例。
  • 在 Spring Netflix Eureka 服务发现中使配置服务器可用,并在配置客户端中启用自动服务器发现。如果服务器没有固定位置或在其位置移动,这将变得很重要。

Original: https://www.cnblogs.com/BlogNetSpace/p/16252618.html
Author: JackYang
Title: Spring Cloud 配置application.yml与bootstrap.yml快速入门

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540675/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 微信小程序刚注册快速达到1000uv

    一、什么是微信小程序uv ​ UV:是累计独立访问,1个微信号就是一个uv,多次访问不算 ​ 大家想提升微信小程序uv都是为了开通流量主 二、流量主开通标准 ​ 达到1000uv就…

    Java 2023年6月7日
    0182
  • 9-Java泛型

    一、泛型的理解 1.泛型的概念 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返 回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个…

    Java 2023年6月7日
    077
  • 【Javafx】以树状列表的形式显示类(TreeTableView控件的使用)

    在使用Javafx插件开发作业项目时,我需要将房屋以树状表格的形式显示出来。实现的效果: 1、简单介绍 在这里简单介绍一下我的程序中涉及到的类的属性。 在我的程序中,需要显示的类为…

    Java 2023年6月8日
    079
  • 哈工大软件构造实验Lab2中assert的使用

    防扒链接: 何以牵尘的博客_CSDN博客-哈工大课内学习,哈工大精品课程笔记领域博主何以牵尘擅长哈工大课内学习,哈工大精品课程笔记,等方面的知识; https://blog.csd…

    Java 2023年6月9日
    082
  • 12、线程优先级

    12、线程优先级 priority java;gutter:true; package com.testthread1;</p> <p>/*<em&g…

    Java 2023年6月8日
    050
  • 【校招VIP】[前端][二本][5分]简历的板式比较标准

    关注【校招VIP】 公众号,回复【简历】 ,添加校招顾问微信,即可获取简历指导! 本份简历是一位21届二本前端同学的简历,简历评分6分。 一、学员简历 二、指导意见 简历的版式没有…

    Java 2023年6月5日
    089
  • PDF加密、分割和生成封面图操作

    由于某些不可抗力原因,公司不允许使用itext系列的jar包,因此系统中使用的相关jar得替换成开源的。经比较和尝试考虑使用org.apache.pdfbox来替换,同时修改系统中…

    Java 2023年6月5日
    065
  • A discussion of Dead Connection Detection, Resource Limits, V$SESSION, V$PROCESS and OS processes

    In this Document APPLIES TO: Oracle Database – Enterprise Edition – Version 8….

    Java 2023年5月30日
    071
  • Golang中的空字符,似花不是花

    最近在Linux下开发Go程序,发现一个奇怪的问题,在读取Linux系统信息时读到了空字符,导致了程序异常。在 ASSIC中十六进制0为字符NUT,表示为 空字符NULL。但这个字…

    Java 2023年6月16日
    074
  • 双缓冲绘图

    双缓冲绘图 大家小时候都玩过飞机大战吧,当我们在玩这种飞行射击类游戏时,背景图总是不断地向下移动的,从而给我们营造出一种飞机正在向前飞行的游戏体验。那么,图片的快速变化是如何实现的…

    Java 2023年6月5日
    070
  • 某CTF比赛writeup

    看到群里别人参加比赛发上来的附件,自己尝试解了一下。 1、提示RSA,提供flag.enc和pub.key附件 一看就是解RSA,公钥分解得到n和e n=8693448229604…

    Java 2023年6月5日
    083
  • 记Mybatis动态sql

    写在前面:在此记录下项目中能够经常遇到的MyBatis动态SQL,因为经常容易忘,所以索性就给记录下来,免得每次都要百度搜索好久,需要使用的朋友自取,但是别忘了点赞哦💕 在此仅作部…

    Java 2023年6月14日
    075
  • Nginx使用Expires增加浏览器缓存加速(转)

    转载自:Nginx使用Expires增加浏览器缓存加速 Nginx可以更改HTTP头部,这个是Web服务器必须的,当然Nginx更可以支持在HTTP头部中添加Expires等相关信…

    Java 2023年5月30日
    069
  • c#读取ini文件

    ini 文件(保存为test.ini): [first]one=one’s Value[second]two=two’s Value[third]key1=…

    Java 2023年5月29日
    0100
  • JavaSE前期准备1

    历史(建议了解即可) 一、1990年,美国Sun公司的”Stealth计划”(后改名为”Green计划”)目标设置在家用电器等小型系…

    Java 2023年6月5日
    081
  • 浅谈java代理模式

    讲解java代理模式 讲解java代理模式 何谓代理模式 静态代理 动态代理 JDK动态代理 CGLIB动态代理 何谓代理模式 &#x4EE3;&#x7406;&a…

    Java 2023年6月7日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球