Spring Cloud Config Server简介

1.概述

在本教程中,我们将回顾Spring Cloud Config Server的基础知识。 我们将设置一个Config Server ,然后构建一个客户端应用程序 ,该客户端应用程序在启动时会消耗配置 ,然后刷新配置而不重新启动。 我们正在构建的应用程序与《 集中式配置入门指南 》中讨论的“ Hello World”应用程序相同,但是在本文中,我们将更深入地介绍Spring Cloud Config Server的概念。

本教程的完整源代码在Github上 。

2.什么是Spring Cloud Config Server?

正如文档简要指出的那样,“ Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持。” 服务器存储后端的默认实现使用git ,因此它轻松支持带标签的配置环境版本,并且许多用于管理内容的工具都可以使用它。

Spring Cloud Config 非常适合Spring应用程序,因为它的客户端和服务器概念都精确地映射到Spring EnvironmentPropertySource抽象。 但是,Spring Cloud Config可以与以任何语言运行的任何应用程序一起使用。

3.创建一个多模块项目

我们正在创建的应用程序将具有两个模块:一个模块用于配置服务,另一个模块用于配置客户端。 因此,我们需要创建一个父pom

3.1父母

在我们的IDE中,让我们创建一个新项目。 我正在使用Spring Tool Suite,但这只是个人喜好。

在我们的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>com.michaelcgood</groupId><artifactId>com.michaelcgood</artifactId><version>0.0.1</version><packaging>pom</packaging><name>michaelcgood-spring-cloud-config-server</name><description>Intro to Spring Cloud Config Server</description><modules><module>mcg-configuration-client</module><module>mcg-configuration-service</module></modules></project>

3.2配置服务

在我们的IDE中,让我们为配置服务创建一个新的Maven模块,并将其插入到pom中

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><modelVersion>4.0.0</modelVersion><groupId>com.michaelcgood</groupId><artifactId>mcg-configuration-service</artifactId><version>0.0.1</version><packaging>jar</packaging><name>mcg-configuration-service</name><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.9.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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Edgware.RELEASE</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>

3.3配置客户端

现在,我们只需要为我们的配置客户端创建一个模块。 因此,让我们制作另一个Maven模块并将其插入到pom中

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><modelVersion>4.0.0</modelVersion><groupId>com.michaelcgood</groupId><artifactId>mcg-configuration-client</artifactId><version>0.0.1</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.9.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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Edgware.RELEASE</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>

我们的项目结构现在看起来像这样:

4.配置服务器

现在,我们将创建一个Config Servic e,以充当客户端和git存储库之间的中介。

4.1启用配置服务器

我们使用Spring Cloud的@EnableConfigServer创建可以与之通信的配置服务器。 因此,这只是一个普通的Spring Boot应用程序,其中添加了一个注释以启用Config Server

@EnableConfigServer
@SpringBootApplication
public class ConfigServiceApplication {public static void main(String[] args) {SpringApplication.run(ConfigServiceApplication.class, args);}
}

4.2 application.properties

为确保Config Service和客户端的端口之间没有冲突,我们为Config Service指定了另一个端口:

server.port=8888spring.cloud.config.server.git.uri=${HOME}/Desktop/mcg-config

第二行spring.cloud.config.server.git.uri = $ {HOME} / Desktop / mcg-config指向git存储库,我们将在其下创建它。

4.3 Git

在* nix系统上,我们可以在命令行上执行所有操作。
我们在桌面上创建一个文件夹:

mkdir mcg-config

我们使用vim创建一个名为a-bootiful-client.properties的文件:

vim a-bootiful-client.properties

我们添加了消息“ Hello World”,但这可能是我们想要的。 写(:w)之后,我们退出(:q)vim。

现在让我们创建一个新的仓库:

git init

现在,我们添加包含消息的文件:

git add a-bootiful-client.properties

让我们提交:

git commit

5.配置客户端

现在,让我们创建一个新的Spring Boot应用程序,该应用程序使用Config Server加载其自己的配置,并刷新其配置以按需反映对Config Server的更改,而无需重新启动JVM。

Spring将看到配置属性文件,就像从application.propertiesapplication.yml或任何其他PropertySource加载的任何属性文件一样。

5.1反映变化

客户端可以使用标准的Spring方法访问Config Server中的任何值,例如@ConfigurationProperties@Value(“ $ {…}}”)

考虑到这一点,我们创建一个REST控制器,该控制器返回已解析的message属性的值:

@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我们强制Bean刷新其配置,这意味着它将从Config Server中获取更新的值,然后触发刷新事件。

5.2 bootstrap.properties

在引导阶段,必须先读取配置Config Client的属性,然后才能从Config Server中读取应用程序的其余配置。

我们指定客户端的spring.application.name以及配置服务器spring.cloud.config.uri的位置:

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

注意:
我们通过设置management.security.enabled = false禁用了安全性,从而使我们的测试和修补变得容易。

6.演示

首先,我们需要将目录更改为我们的配置服务并启动它:

mcg-configuration-service mike$  mvn spring-boot:run

然后为我们的客户做同样的事情:

mcg-configuration-client mike$  mvn spring-boot:run

当添加a-bootiful-client.properties时,我们可以在终端中看到配置服务:

INFO 5921 --- [nio-8888-exec-1] o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/var/folders/dk/48l9cm2x3vnfl5ymh6dtxpwc0000gn/T/config-repo-7195892194658362240/a-bootiful-client.properties

让我们打开浏览器并访问http:// localhost:8080 / message 。 我们看到“ Hello World”。

现在,让我们再次在a-bootiful-client.properties中更改消息,这次输入“嗨! :-)”。

保存并提交后,我们访问http:// localhost:8888 / a-bootiful-client / default确认更改。

现在,我们调用Spring Boot Actuator引用端点来刷新客户端:

curl -X POST http://localhost:8080/refresh

我们访问http:// localhost:8080 / message并看到我们的消息“嗨! :-)“ 被陈列。

有关Spring Boot Actuator的更多信息,请参阅教程Building Spring Boot RESTful Service + Spring Boot Actuator 。

7.结论

我们刚刚在Spring中完成了服务的集中配置。 我们通过站起来一个Spring Cloud Config Server并创建一个客户端来在启动时使用配置,然后刷新配置而不重新启动来实现此目的。

我们没有接触过的Spring Cloud Config Server可以完成许多其他事情,例如:

  • 让Config Server向Spring Cloud Netflix,Eureka Service Discovery或Spring Cloud Consul的Discovery Service注册
  • 提供YAML或属性格式的配置
  • 服务纯文本配置文件
  • 将配置服务器嵌入到应用程序中

完整的源代码可以在Github上找到。

翻译自: https://www.javacodegeeks.com/2017/12/intro-spring-cloud-config-server.html

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

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

相关文章

朴素贝叶斯算法实现分类以及Matlab实现

开始 其实在学习机器学习的一些算法&#xff0c;最近也一直在看这方面的东西&#xff0c;并且尝试着使用Matlab进行一些算法的实现。这几天一直在看得就是贝叶斯算法实现一个分类问题。大概经过了一下这个过程&#xff1a; 看书→算法公式推演→网上查询资料→进一步理解→搜…

编写自定义的AssertJ断言

AssertJ是广泛使用的Hamcrest匹配器的替代匹配库。 实际上&#xff0c;对于我自己的项目&#xff0c;我已经更改为仅使用AssertJ-我只是发现流畅的界面和可扩展性非常吸引人。 您可以编写自定义断言&#xff0c;如下所示&#xff1a; 想象一下一种具有强度和饮料类型的咖啡 &…

LintCode-A + B 问题

文章转载 http://blog.csdn.net/wangyuquanliuli/article/details/47755461 给出两个整数a和b, 求他们的和, 但不能使用 等数学运算符。 您在真实的面试中是否遇到过这个题&#xff1f; Yes样例 如果 a1 并且 b2&#xff0c;返回3 注意 你不需要从输入流读入数据&#xff0c;…

位操作基础篇之位操作全面总结

转载自 http://blog.csdn.net/morewindows/article/details/7354571 Title: 位操作基础篇之位操作全面总结 KeyWord: C/C 位操作 位操作技巧 判断奇偶 交换两数 变换符号 求绝对值 位操作压缩空间 筛素数 位操作趣味应用 位操作笔试面试 位操作篇共分为基础篇和提高…

机器学习中的算法-支持向量机(SVM)基础

机器学习中的算法-支持向量机(SVM)基础 版权声明&#xff1a; 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用&#xff0c;但请注明出处&#xff0c;如果有问题&#xff0c;请联系wheeleastgmail.com。也可以加我的微博: leftnotea…

使用JDK 8轻松进行细粒度排序

Java的8的推出流和有用的静态 / 默认的方法比较接口可以很容易地根据个人的领域两个对象比较“值&#xff0c;而不需要实现一个比较&#xff08;T&#xff0c;T&#xff09;在其对象的类方法被比较。 我将使用一个简单的Song类来帮助演示这一点&#xff0c;接下来显示其Song.j…

主成分分析以及应用:企业综合实力排序

这段时间一直在学习数据挖掘的一些算法&#xff0c;今天通过不断查阅资料&#xff0c;学习整理了一下主成分分析这个数据降维算法。并且结合一个实例进行matlab编程实现。 主成分基本原理 在数据挖掘中&#xff0c;经常会遇到一个问题就是一个问题出现了n多个变量&#xff0c;…

自定义MongoDB的Spring Social Connect框架

在上一篇文章中 &#xff0c;我谈到了我面临的第一个挑战是更改数据模型并添加连接框架。 在这里&#xff0c;我想提供有关我如何做的更多详细信息。 Spring Social项目已经提供了基于jdbc的连接存储库实现&#xff0c;以将用户连接数据持久保存到关系数据库中。 但是&#xff…

算法题:输入aaaabbbcccccc输出a4b3c6。

今日在地铁上浏览今日头条的时候看到这么个小题目&#xff0c;说是输出一长串字符串&#xff0c;输出字母串类别并且统计其出现次数&#xff0c;然后按照顺序将其输出来。例如输入aaaabbbcccccc&#xff0c;输出a4b3c6。 最近也一直在学习&#xff0c;所以就想着就Matlab来试了…

Java World中的GraphQL简介

许多人认为GraphQL仅适用于前端和JavaScript&#xff0c;它在Java等后端技术中没有定位&#xff0c;但事实确实如此。 还经常将GraphQL与REST进行比较&#xff0c;但是这种比较是否合理&#xff1f; 首先&#xff0c;让我开始回答其中最重要的问题。 什么是GraphQL&#xff1…

算法题:在一个字符串中找到只出现一次的字符。如输入abaccdeeff,则输出bd。

今天的算法学习还是和字符串有关&#xff0c;这个题目据说是以前的某公司面试的笔试题目。题目意思就是说&#xff0c;在一个字符串中找到只出现了一次的那些字符&#xff0c;并且输出来。 作为非IT的我&#xff0c;平时使用Matlab比较多。不是科班出身&#xff0c;对于这个题…

Kafka的Spring Cloud Stream

总览 该示例项目演示了如何使用事件驱动的体系结构 &#xff0c; Spring Boot &#xff0c;Spring Cloud Stream&#xff0c; Apache Kafka和Lombok构建实时流应用程序。 在本教程结束时&#xff0c;您将运行一个简单的基于Spring Boot的Greetings微服务 从REST API获取消息 …

使用JShell的Java 9 Streams API

这篇文章着眼于使用JShell的Java 9 Streams API。 Streams API的更改以Java 8中Streams的成功为基础&#xff0c;并引入了许多实用程序方法– takeWhile&#xff0c;dropWhile和iterate。 这篇文章延续了My Top Java 9功能&#xff0c;并使用Jshell探索了这些方法。 流API Str…

常见的股票技术因子学习以及计算

最近在看《量化投资数据挖掘技术与实践&#xff08;MATLAB版&#xff09;》。学习了其中的常见的股票衍生变量&#xff0c;并且利用WIND金融数据终端的matlab借口windmatlab导出一些数据进行了一个简单的学习。特此记录。 下面是我对于书中提到的几个因子的学习总结&#xff1…

算法题:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串“12345”,则输出整数“12345”

今天这道算法题比较简单&#xff0c;主要考察的思考问题的全面性。这个需要考虑的几种情况。 如果输入的整数字符串是个负数&#xff0c;怎么处理&#xff1f; 如果输入的第一个字符是0&#xff0c;则怎么处理&#xff1f; 如果输入的是非0~9之间的字符怎么处理&#xff1f;…

排序算法一:冒泡排序,插入排序以及选择排序原理与MATLAB实现

最近在学习排序算法的一些知识。还是比较有趣的。所以好好研究了一下各个算法。并且使用matlab进行了个基本的实现&#xff0c;目前仅仅是实现吧&#xff0c;优化什么的可能目前的水平达不到吧&#xff0c;毕竟是用matlab实现&#xff0c;还是比较简单。以后还是希望使用C/C&am…

Java – HashMap详细说明

HashMap基于哈希算法工作&#xff0c;根据Java文档HashMap具有以下四个构造函数&#xff0c; 建设者 描述 HashMap ​() 构造一个空的 具有默认初始容量&#xff08;16&#xff09;和默认加载因子&#xff08;0.75&#xff09;的HashMap 。 HashMap ​(int initialCapaci…

Python实现石头-剪刀-布小游戏

近日在学习Python的一些基础知识&#xff0c;觉得还是很有趣的一个一门语言&#xff01;就目前的学习的一些知识&#xff0c;编写了一些一个简单的石头剪刀布的游戏。主要是熟悉一些Python的一些控制语句。 import random while 1:sint(random.randint(1,3))print(s)print()if…

Python:递归输出斐波那契数列

今天学习Python的时候做一道练习题&#xff0c;题目是这样的&#xff1a; 题目 导入 问题 有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总对数为多…

Spring Webflux –编写过滤器

Spring Webflux是Spring 5的一部分提供的新的响应式Web框架。 在传统的基于Spring MVC的应用程序&#xff08; Servlet Filter &#xff0c; HandlerInterceptor &#xff09;中编写过滤器的方式与在基于Spring Webflux的应用程序中编写过滤器的方式非常不同&#xff0c;本文将…