使用Spring Cloud Config作为外部化配置

关于连续交付 ,最重要的实践之一是只构建一次二进制文件,并在不同的环境(开发,测试,验收等)中使用该二进制文件 。 这意味着最有可能需要外部化应用程序的配置 。 对于Spring Boot应用程序,将其属性值保留在application jar之外的application.properties中 。 这样,您可以将同一jar用于不同环境的部署(一种替代方法是,将所有可能环境的属性值打包到jar中,但在大多数情况下,我不认为这是一种好习惯)。
尤其是在构建和部署Spring Boot应用程序时,您应该查看一下Spring Cloud Config项目。 在这篇文章中,我将按照此处描述的步骤进行操作,您将仅需几个步骤就可以了解如何设置自己的配置服务。
在展示如何进行设置之前,先对体系结构进行概述:

  • Git存储库用于存储配置值。 为此,Git是绝佳的选择,因为它具有跟踪和存储更改的功能。
  • DevOps(或想要更改配置的任何系统)可以通过将其更改推送到Git存储库中来简单地更改配置值。
  • 配置服务与Git存储库保持同步,并根据要求发布配置值。
  • 这些服务充当配置客户端,可以从配置服务请求配置值。

要使其在本地计算机上运行,​​请执行以下步骤:

  • 设置Git仓库
  • 设置配置服务
  • 设置客户服务
  • 测试设置

最简单的方法是创建一个目录“ spring-config-example”,其中将包含此演示所需的所有代码。 这将被视为该帖子的根目录。

设置Git仓库
在这一步中,我创建一个属性文件,并将其放入(本地)Git存储库中。 然后,该属性文件将用作我们的演示客户端应用程序的属性值的源。
首先创建一个新目录“ configstore”,然后在该目录中创建一个名为“ a-bootiful-client.properties”的新文件。 将以下内容添加到文件中:

server.port=8000
message = Hello Worldmanagement.security.enabled=false

接下来使用命令创建一个git repo
' git init '并将文件添加并提交到本地仓库
' git commit -a -m 'initial commit' ' 这就是步骤。

设置配置服务
如前所述,该服务只是另一个Spring Boot项目。 要设置项目,我创建了一个新的子目录,并使用以下布局将“默认” Spring Boot项目放入其中:

├── pom.xml
└── src└── main├── java│   └── net│       └── pascalalma│           └── cloud│               └── ConfigServiceApplication.java└── resources└── application.properties

“ pom.xml”具有以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>net.pascalalma.cloud</groupId><artifactId>configuration-service</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Camden.SR5</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

对于Spring Boot项目而言,这是相当简单的pom。 唯一增加的依赖性是“ spring-cloud-config-server”的依赖性。
Application类如下所示:

package net.pascalalma.cloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;@EnableConfigServer
@SpringBootApplication
public class ConfigServiceApplication {public static void main(String[] args) {SpringApplication.run(ConfigServiceApplication.class, args);}
}

唯一不同的是注释“ EnableConfigServer”,该注释使此Spring Boot应用程序充当配置服务器。
最后是application.properties,其中包含以下内容:

server.port=8888
spring.cloud.config.server.git.uri=/Users/pascalalma/projects/sandbox/spring-config-example/configstore

除了定义端口外,我还将uri添加到Git仓库中,该仓库保存着要使用的属性。 如前所述,我在这里使用本地存储库,但这当然也可以是远程Git存储库。
这就是服务器的全部内容。 接下来让我们设置客户端应用程序。

设置客户服务
为了设置客户端项目,我创建了一个新的子目录,并使用以下布局将另一个“默认” Spring Boot项目放入其中:

├── pom.xml
└── src└── main├── java│   └── hello│       └── ConfigClientApplication.java└── resources└── bootstrap.properties

如您所见,该项目与另一个项目一样简单。 它包含一个pom,一个Java文件和一个属性文件。 让我们通过每个。
“ pom.xml”包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>net.pascalalma.cloud</groupId><artifactId>configuration-client</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Camden.SR5</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

接下来是Java文件。 它实际上包含两个类:启动Spring Boot的应用程序和处理传入HTTP请求的Controller。 该文件如下所示:

package net.pascalalma.cloud.client;import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
public class ConfigClientApplication {public static void main(String[] args) {SpringApplication.run(ConfigClientApplication.class, args);}
}@RefreshScope
@RestController
class MessageRestController {@Value("${message:Hello default}")private String message;@RequestMapping("/message")String getMessage() {return this.message;}
}

添加RefreshScope是为了能够稍后在测试中修改属性时重新加载它们。
最后一个文件是“ bootstrap.properties”。 当启动该应用程序以在启动该应用程序之前加载远程“ application.properties”时,该文件将由Spring Boot CLient应用程序使用。 该文件包含以下内容:

spring.application.name=a-bootiful-client
spring.cloud.config.uri=http://localhost:8888

我认为也不是很复杂。 它包含客户端应用程序的名称。 此名称用于从配置服务中选择正确的属性文件。 第二行包含云配置服务器的位置。 您可以在此处了解更多信息。

测试设置
现在有了所有代码,我可以检查它是否有效。 我打开三个终端会话。
我第一个导航到“ configuration-server”目录,并执行“ mvn spring-boot:run ”以启动配置服务器。 第二个我导航到“ configuration-client”目录并执行“ mvn spring-boot:run ”以启动配置客户端。 我用来打电话给客户端以测试配置服务器的第三个。 当我执行命令' curl localhost:8000/message '时,我希望得到返回的消息,该消息是我在第一步中放入configstore的:

$ curl localhost:8000/message
Hello World!

现在,当我对配置存储进行更改时,它不会自动反映在客户端中。 我编辑文件“ a-bootiful-client.properties”,并将消息更新为:
message = Hello World from Spring Boot!\n\n 。 当然,使用' git commit -a -m 'updated message' '将文件提交到存储库中
当我在客户端应用程序上执行相同的curl命令时,不会有任何更改。 如果我直接在配置服务器上卷曲消息,则可以看到更改:

$ curl localhost:8888/a-bootiful-client/default
{"name":"a-bootiful-client"
,"profiles":"default"]
,"label":"master"
,"version":"98c6f8d8dd9a9b2cb36496ca4ac54ffb35806dbc"
,"state":null
,"propertySources":[{"name":"/Users/pascalalma/projects/sandbox/spring-config-example/configstore/a-bootiful-client.properties","source":{"server.port":"8000","management.security.enabled":"false","message":"Hello World from Spring Boot!\n\n"}}]
}

要将更改后的值从配置服务器获取到客户端,我需要使用以下命令刷新客户端:
'curl -X POST http://localhost:8000/refresh ' 。 如果现在我卷曲客户端,则会看到预期的更新消息:

$ curl localhost:8000/message
Hello World from Spring Boot!

您可能已经注意到,此演示的'application.properties'中的'management.security.enabled'属性设置为false。 这是为了使其易于测试(默认情况下,自Spring Boot 1.5起,Actuator端点默认是安全的)

这篇文章中显示的功能实际上只是冰山一角。 与其他工具(如Spring Cloud Consul和Spring Cloud Bus)结合使用 ,还可以实现更多功能,还可以与标准的Spring功能(如security和Profiles)结合使用 。 这篇文章应该足够让您开始自己检查一下。

翻译自: https://www.javacodegeeks.com/2017/04/use-spring-cloud-config-externalized-configuration.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51nod1040 最大公约数之和,欧拉函数或积性函数

1040 最大公约数之和 给出一个n&#xff0c;求1-n这n个数&#xff0c;同n的最大公约数的和。比如&#xff1a;n 6时&#xff0c;1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6&#xff0c;加在一起 15 看起来很简单对吧&#xff0c;但是n<1e9&#xff0c;所以暴力是不行的…

hide show vue 动画_Vue2.x学习四:过渡动画

Vue 在插入、更新或者移除 DOM 时&#xff0c;提供多种不同方式的应用过渡效果。请注意它的应用场景并不是说我们写了一个动画之后让它一直在动&#xff0c;而是在一个模块显示或隐藏的时候去做一种特效&#xff0c;使得它的过程有过渡性&#xff0c;而不是很突兀的直接消失或显…

Pytorch cifar10离线加载二进制文件

说明直接离线加载cifar10到Pytorch 直接加载6个文件到pytorchdata_batch_1data_batch_2data_batch_3data_batch_4data_batch_5test_batchimport os import cv2 import pickle import numpy as np import matplotlib.pyplot as pltimport torchvision from torch.autograd impor…

spring cloud gateway 深入了解 - Predicate

文章来源 spring cloud gateway 通过谓词&#xff08;Predicate&#xff09;来匹配来自用户的请求 为了方便&#xff0c;使用postman测试不同的谓词的效果 路径谓词&#xff08;Predicate&#xff09;—— 最简单的谓词 配置如下spring:cloud:gateway:routes:# 匹配指定路径的路…

python漏洞检测脚本_URL重定向漏洞,python打造URL重定向漏洞检测脚本

前言&#xff1a;今天学习了重定向漏洞&#xff0c;这个漏洞比较好理解漏洞名&#xff1a;URL重定向漏洞威胁&#xff1a;低漏洞的来源&#xff1a;开发者对head头做好对应的过滤和限制例子&#xff1a;有漏洞的网站&#xff1a;http://a.com/x.php?urlhttp://a.com/login.php…

Pytorch cifar100离线加载二进制文件

说明&#xff1a;直接加载cifar100二进制文件到Pytorch 直接加载文件到pytorchmetatesttrain import os import cv2 import pickle import time import numpy as np import matplotlib.pyplot as pltimport torchvision from torch.autograd import Variable import torch.uti…

为单个Web应用程序配置多个上下文根– JBoss

有时&#xff0c;我们通过在jboss-web.xm l中定义一个来对应用程序进行更改&#xff0c;以支持利用JBoss功能的多个上下文根&#xff0c;如下所示&#xff1a; webapp / WEB-INF / jboss-web.xml&#xff1a; <?xml version"1.0" encoding"UTF-8"?&…

手动升级ubuntu 18.04内核从4.15.0-45-generic到4.15.0-52-generic

1 从下面官网下载相应的包&#xff0c;共3个。 https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15-rc9/ linux-headers-4.15.0-041500rc9-generic_4.15.0-041500rc9.201801212130_amd64.deb linux-headers-4.15.0-041500rc9_4.15.0-041500rc9.201801212130_all.deb linux-…

cmd52命令发送 mmc_乾坤合一~Linux SD/MMC/SDIO驱动分析(上)

一、SD/MMC/SDIO概念区分SD(SecureDigital)与 MMC(MultimediaCard)SD 是一种 flash memory card 的标准&#xff0c;也就是一般常见的 SD 记忆卡&#xff0c;而 MMC 则是较早的一种记忆卡标准&#xff0c;目前已经被 SD 标准所取代。在维基百科上有相当详细的 SD/MMC 规格说明&…

Pytorch MNIST直接离线加载二进制文件到pytorch

说明&#xff1a;MNIST直接离线加载二进制文件到pytorch 直接以下4个文件读入数据到pytorch中t10k-images-idx3-ubyte.gzt10k-labels-idx1-ubyte.gztrain-images-idx3-ubyte.gztrain-labels-idx1-ubyte.gz import os import numpy as np import gzipimport torch.utils.data a…

爱与愁的心痛

爱与愁的心痛 题目链接 题意 这道题的题意是&#xff0c;给定一个整数数组&#xff0c;数组中的每个元素代表一个不爽的事情的刺痛值。现在需要找出连续m个刺痛值的和的最小值。 思路 读取输入和初始化遍历数组并计算窗口和输出最小和 坑点 数组越界重复计算窗口和 算法一&am…

begintrans返回值_SQL事务回滚 ADO BeginTrans, CommitTran 以及 RollbackTrans 方法

定义和用法这三个方法与 Connection 对象使用&#xff0c;来保存或取消对数据源所做的更改。注释&#xff1a;并非所有提供者都支持事务。注释&#xff1a;BeginTrans、CommitTrans 和 RollbackTrans 方法在客户端 Connection 对象上无效。那客户端不能支持事务? 这是什么意思…

Pytorch Fashion_MNIST直接离线加载二进制文件到pytorch

说明&#xff1a;Fashion_MNIST直接离线加载二进制文件到pytorch 将4个gz直接加载到pytoch用来训练t10k-images-idx3-ubyte.gzt10k-labels-idx1-ubyte.gztrain-images-idx3-ubyte.gztrain-labels-idx1-ubyte.gz import os import numpy as np import gzip import matplotlib.p…

jQuery选择器种类整理

选择器概念 jQuery选择器是通过标签、属性或者内容对HTML内容进行选择&#xff0c;选择器运行对HTML元素组或者单个元素进行操作。 jQuery选择器使用$符号&#xff0c;等同于jquery&#xff0c;例如&#xff1a; $(“li”) jquery(“li”) 同样等同于javascript中的&#xff1…

jee过滤器应用场景_将涡轮增压器添加到JEE Apps

jee过滤器应用场景我扮演的关键角色之一是在本地社区中传播Akka。 作为讨论的一部分&#xff0c;人们通常会想到的问题/疑问是Akka如何针对编写良好的Java / JEE应用程序提供更好的可伸缩性和并发性。 由于底层硬件/ JVM保持不变&#xff0c;因此参与者模型如何比传统的JEE应用…

mysql 列 随机数_mysql mmp 某字段插入随机数!(说不定那天就忘记了,存下来再说)...

UPDATE 表名 SET 字段名ceiling(rand()*500000500000) WHERE (条件);原文链接&#xff1a;http://blog.csdn.net/bobay/article/details/24797525MMP 上面的只能更新一条UPDATE 表名 SET 字段名cast(rand(checksum(newid()))*(24)1 as int) WHERE (条件);上面的就是每条都更新的…

适用于Java开发人员的Elasticsearch:Elasticsearch生态系统

本文是我们学院课程的一部分&#xff0c;该课程的标题为Java开发人员的Elasticsearch教程 。 在本课程中&#xff0c;我们提供了一系列教程&#xff0c;以便您可以开发自己的基于Elasticsearch的应用程序。 我们涵盖了从安装和操作到Java API集成和报告的广泛主题。 通过我们简…

matplotlib markers的类型

https://matplotlib.org/api/markers_api.html matplotlib markers 所有可能的markers定义如下: marker symbol description "." point "," pixel "o" circle "v" triangle_down "^" triangle_up &…

android实时声音信号波形_Android输出正弦波音频信号(左右声道对称)-阿里云开发者社区...

转载请说明出处&#xff01;作者&#xff1a;kqw攻城狮出处&#xff1a;个人站 | CSDN需求&#xff1a;左右声道分别输出不同的音频数据&#xff0c;波形要是一个正弦波&#xff0c;左右声道还要对称&#xff01;对硬件不是很了解&#xff0c;说是要通过音波避障。效果图之前已…

matplotlib color可选

matplotlib color matplotlib中color可用的颜色&#xff1a; cnames { aliceblue: #F0F8FF, antiquewhite: #FAEBD7, aqua: #00FFFF, aquamarine: #7FFFD4, azure: #F0FFFF, beige: #F5F5…