Spring Cloud Config分布式配置中心(学习总结)
一、简介
在微服务中,每个功能模块其实都可以拆分成一个单独的服务实例,如果项目够大,必然会有很多服务单元,每个服务单元都有一份配置文件需要维护,这显得不太好维护,而且不方便协作开发。为了使服务实例的配置文件统一管理化,Spring Cloud Config提供了一套解决方案,建立一个配置服务中心,每个服务单元从config server中获取具体的配置文件,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。为了保证系统的稳定,配置服务端config server可以进行集群部署,即使某一个实例,因为某种原因不能提供服务,也还有其他的实例保证服务的继续进行。下面就讲解一下Spring Cloud Config的基本用法。
二、准备工程
a. springcloud_config_server: 配置服务中心,端口1111
b. springcloud_config_client: 具体服务实例,端口2222(在项目中就是具体某个服务单元,都相当于是一个config client)
三、新建springcloud_config_server工程
注意引入spring-cloud-config-server依赖,具体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.springcloud.wsh</groupId><artifactId>springcloud_config_server</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>springcloud_config_server</name><description>配置中心</description><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><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Camden.SR6</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><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>${spring-cloud.version}</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>
四、启动类加上@EnableConfigServer注解
@EnableConfigServer注解主要是开启Spring Cloud Config分布式配置的功能
/*** 配置中心* 证明配置服务中心是否可以从远程程序获取配置信息:* 地址: localhost:1111/aaaa/dev实际是没有对应的文件。如果真有文件,返回的json在会有propertySources属性,它的值就是文件的内容。例如http://localhost:8888/config-client/dev 对应git仓库中的config-client-dev.propeties文件** @author weishihuai* @date 2018/09/17 22:18*/
@SpringBootApplication
//@EnableConfigServer注解用于开启Spring Cloud Config配置功能
@EnableConfigServer
public class SpringcloudConfigServerApplication {public static void main(String[] args) {SpringApplication.run(SpringcloudConfigServerApplication.class, args);}
}
五、git仓库等属性配置
首先创建一个放置配置文件的git仓库,这里是github,具体见下图:
在git仓库中新建一个repository(可以自定义名称)文件夹,文件夹下面可以新建config-client-dev.properties、config-client-test.properties、config-client-prod.properties表示不同环境的配置文件。
config-client-dev.properties的内容为:假设表示开发环境的配置文件
com.springcloud.wsh.message=Spring Cloud Config分布式配置中心(开发环境)
config-client-test.properties的内容为:假设表示测试环境的配置文件
com.springcloud.wsh.message=Spring Cloud Config分布式配置中心(测试环境)
config-client-prod.properties的内容为:假设表示生产环境的配置文件
com.springcloud.wsh.message=Spring Cloud Config分布式配置中心(正式生产环境)
接下来配置application.properties:
#应用名称
spring.application.name=config-server
#端口号
server.port=1111
#配置中心git仓库地址,注意后面的/
spring.cloud.config.server.git.uri=对应你的git仓库地址
#配置中心git仓库路径
spring.cloud.config.server.git.search-paths=repository
#访问git仓库的用户名(如果Git仓库为公开仓库,可以不填写用户名和密码,如果是私有仓库需要填写)
spring.cloud.config.server.git.username=对应你的github用户名
#访问git仓库的密码
spring.cloud.config.server.git.password=对应你的github密码
#配置git仓库的分支
spring.cloud.config.label=master
注意:
spring.cloud.config.server.git.uri:指定配置中心git仓库的地址
spring.cloud.config.server.git.search-paths: 指定配置中心仓库的路径,即创建的文件夹路径
spring.cloud.config.label:指定git仓库的分支
#访问git仓库的用户名(如果Git仓库为公开仓库,可以不填写用户名和密码,如果是私有仓库需要填写)
spring.cloud.config.server.git.username: 指定访问git仓库的用户名
spring.cloud.config.server.git.password:指定访问git仓库的密码
六、启动springcloud_config_server
启动完成之后,我们需要验证一下配置服务中心是否可以从远程程序获取配置信息:
我们在浏览器访问:http://localhost:1111/config-client/dev 或者 http://localhost:1111/master/config-client-dev.properties 或者
http://localhost:1111/config-client-dev.properties:可以看到接口返回信息为:
http://localhost:1111/config-client/dev返回如下图:
上图所见,因为git仓库确实存在config-client-dev.properties配置文件,所以接口成功返回配置文件的内容,如果我们访问http://localhost:1111/aaaa/dev,这时候就相当于查询git仓库中是否存在aaaa-dev.properties这个配置文件,如果不存在,返回的propertySources为空,但是也可以验证我们可以从远程git仓库获取配置文件的内容,简单理解就是我们在服务单元中跟git仓库是连通的。
http://localhost:1111/master/config-client-dev.properties返回:
http://localhost:1111/config-client-dev.properties返回:
可以看到,接口成功返回数据,说明我们可以从远程git仓库获取到配置文件的信息。(忽略中文乱码问题,后面会讲解决方法,这里只是验证是否可以从远程git仓库获取到配置文件的信息)
扩展:
URL与配置文件的映射关系如下:(主要有五种)
/{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties#label:表示git仓库的分支
#application:表示具体服务单元的名称,即后面config-client的application-name
#profile: 指定环境类型
dev-开发环境
prod-生产环境
test-测试环境
经过以上步骤,我们的config-server就算搭建成功了。下面我们搭建config-client
七、新建springcloud_config_client工程
引入spring-cloud-starter-config依赖,具体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.springcloud.wsh</groupId><artifactId>springcloud_config_client</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>springcloud_config_client</name><description>模拟配置中心客户端</description><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><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Camden.SR6</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</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>${spring-cloud.version}</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>
八、confing-client配置文件bootstrap.properties
注意:新建bootstrap.properties,不是application.properties
#应用名称(对应的git仓库配置文件名称也应该是:config-client-dev、config-client-prod、config-client-test)
spring.application.name=config-client
#端口
server.port=2222
#配置git远程仓库的分支
spring.cloud.config.label=master
#配置服务中心地址(即config-server的地址)
spring.cloud.config.uri=http://localhost:1111/
#配置环境
#dev为开发环境配置文件
#test为测试环境
#pro为正式环境
spring.cloud.config.profile=dev
注意:
spring.cloud.config.label:指定git仓库的分支
spring.cloud.config.uri: 指定配置服务中心地址(即config-server的地址)
spring.cloud.config.profile=dev:指定所属环境
spring.application.name=config-client:应用名称(对应的git仓库配置文件名称也应该是:config-client-dev、config-client-prod、config-client-test)
九、新建GetPropertyFromConfigServerController
主要是暴露一个接口用于测试从远程git仓库获取配置文件的内容
/*** 测试客户端从配置服务中心获取配置文件中的内容** @author weishihuai* @date 2018/9/17 22:05*/
@RestController
public class GetPropertyFromConfigServerController {private static Logger logger = LoggerFactory.getLogger(GetPropertyFromConfigServerController.class);@Value("${com.springcloud.wsh.message}")String message;@RequestMapping("/getPropertyFromConfigServer")public String getPropertyFromConfigServer() {String msg = "hello, i am " + message + ", i'm come from config server";logger.info(msg);return msg;}}
十、启动config-server以及config-client
浏览器访问http://localhost:2222/getPropertyFromConfigServer,
可以看到,我们成功从git远程仓库中获取了config-client-dev配置文件中的内容。可以看到中文出现乱码了,出现乱码的原因:
spring默认加载配置文件load方法中使用的是IOS-8859-1编码格式,解决方法:改造springcloud-config-server服务配置中心
a. 需要重写一个自定义的PropertySourceLoader,指定编码格式为utf-8:
/*** @Title: CustomPropertySourceLoader* @ProjectName springcloud_confing_center* @Description: 自定义PropertySourceLoader解决中文乱码问题* @Author WeiShiHuai* @Date 2018/9/18 13:43*/
public class CustomPropertySourceLoader implements PropertySourceLoader {private static Logger logger = LoggerFactory.getLogger(CustomPropertySourceLoader.class);private static final String CHARACTER_ENCODING = "utf-8";/*** 指定文件扩展名称(.properties、.xml)** @return*/@Overridepublic String[] getFileExtensions() {return new String[]{"properties", "xml"};}@Overridepublic PropertySource<?> load(String name, Resource resource, String profile) throws IOException {if (null == profile) {Properties properties = getProperties(resource);if (!properties.isEmpty()) {return new PropertiesPropertySource(name, properties);}}return null;}private Properties getProperties(Resource resource) {Properties properties = new Properties();InputStream inputStream = null;try {inputStream = resource.getInputStream();//指定load方法的编码为utf-8,默认是ISO8859-1properties.load(new InputStreamReader(inputStream, CHARACTER_ENCODING));inputStream.close();} catch (IOException e) {logger.error("加载配置文件失败", e);} finally {if (null != inputStream) {try {inputStream.close();} catch (IOException e) {logger.error("关闭流失败", e);}}}return properties;}}
b.在resources文件夹下面创建META-INF文件夹,新建一个spring.factories文件,文件内容为:
#指定自定义PropertySourceLoader,注意是全路径
org.springframework.boot.env.PropertySourceLoader=com.springcloud.wsh.sourceloader.CustomPropertySourceLoader
重启config-server,config-client,浏览器访问http://localhost:2222/getPropertyFromConfigServer
可以看到,中文正常显示了,乱码问题解决。
以上我们只是测试读取dev开发环境的配置文件内容,下面我们再测试一个读取test环境的配置文件:
修改config-client的bootstrap.properties中的spring.cloud.config.profile=test指定为测试环境,
重启项目,浏览器访问http://localhost:2222/getPropertyFromConfigServer,
可以看到,现在读取的就是测试环境下的配置文件信息。至此,我们实现了一个比较简单的config-server以及config-client,实现了从远程git仓库获取各个环境对应的配置文件信息。
十一、总结
在实际项目中,config server配置中心通常需要集群部署,这样某个配置中心挂掉也不会影响到其他服务单元的正常使用。本章搭建的config server并不是高可用的,下一章将会讲解config- server的高可用。本文是笔者在学习Spring Cloud Config的一些总结,仅供参考,共同学习,共同进步。
Spring Cloud Config分布式配置中心(学习总结)相关推荐
- Spring cloud config 分布式配置中心(一) 服务端
作用: 为分布式系统中的基础设施和微服务应用提供外部集中化的配置支持,分客户端和服务端 服务端: 即分布式配置中心,是一个独立的微服务应用,连接配置仓库,为客户端提供一些访问接口,如加密 / 解密信息 ...
- 第十二章 Spring Cloud Config 统一配置中心详解
目录 一.配置问题分析及解决方案 1.问题分析 2.解决方案 二.Spring Cloud Config 介绍 1.Spring Cloud Config特性 2.Spring Cloud Confi ...
- Spring Cloud Config的配置中心获取不到最新配置信息的问题
本篇源于Spring Cloud Config的一个问题,但这个问题并非所有人都会遇到.如果您遇到了,那必须得看看这篇,如果没有遇到您也应该看看,防患于未然! 问题描述 之前有朋友提出Spring C ...
- spring cloud -- 5.分布式配置中心(Spring Cloud Config)
此文章是看了方志朋老师的教材自己写的框架demo: 学习spring cloud推荐大家看下方志朋老师的史上最简单的 SpringCloud 教程 | 终章,地址如下: https://blog.cs ...
- spring clud config分布式配置中心的简单使用
一.spring cloud config简介 微服务架构为什么要用配置中心? 配置的管理问题,没有配置中心的话,多个服务需要多次修改并依次启动,另外我们也希望修改配置后可以实时生效 配置内容的安全性 ...
- Spring Cloud入门-Config分布式配置中心(Hoxton版本)
文章目录 Spring Cloud入门系列汇总 摘要 Spring Cloud Config 简介 在Git仓库中准备配置信息 配置仓库目录结构 master分支下的配置信息 dev分支下的配置信息 ...
- springcloud config 分布式配置中心
一.介绍 1.场景: 微服务系统中,系统多.实例多,如果每个系统都有自己一套配置加载.维护的机制,会导致在生产过程中因为配置问题引发的不必要的沟通成本.故障风险.需要采用分布式配置中心统一管理.统一实 ...
- SpringCloud微服务架构,Config 分布式配置中心,Bus 消息总线, Stream 消息驱动,Sleuth+Zipkin 链路追踪
Config分布式配置中心 Config 概述 概述 • Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护. • 好处: • 集中管理配置文件 • 不同环境不同配 ...
- spring cloud config将配置存储在数据库中
点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! Spring Cloud Config Server最常见是将配置文件放在本地或者远程Git仓库, ...
- spring cloud config将配置存储在数据库中 1
转载请标明出处: https://blog.csdn.net/forezp/... 本文出自方志朋的博客 Spring Cloud Config Server最常见是将配置文件放在本地或者远程Git仓 ...
最新文章
- 6月Top 20榜单出炉啦! 万万没想到区块链大佬竟在忙这个...
- Mysql学习总结(25)——MySQL外连接查询
- numpy基础(part4)--统计量
- Spring-jdbc:JdbcTemplate使用简介
- html奇淫技巧 2 教你如何进行图文环绕布局 原创
- tf.assign() 更新ref通过给它重新赋值
- java 图片分段上传_java实现分段读取文件并通过HTTP上传的方法
- python multiprocessing 得到多进程返回的结果
- 陕西西咸新区暨沣渭新区泾渭新区网上截图!
- 搭建10分钟,解决90%问题,帕累托分析模型为何这么强?
- 利用组策略进行软件分发
- jstack分析CPU高的问题
- Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)
- C++里大写TRUE和小写true(BOOL与bool)
- 大连理工大学电路计算机,大连理工大学电路计算机辅助分析实验报告精要.pdf...
- python浏览器复制粘贴到word里(带格式的)
- 图神经网络详解(四)
- Odoo 继承对象增加属性,不显示protal o_affix_enabled 内容
- 解决URP资源的材质成洋红色问题
- Mathcad_excel数据处理
热门文章
- 图神经网络初探:build a simple graph nets
- kaggle 预测房价竞赛总结 动手学深度学习v2 pytorch
- SageMaker 基于 Blazing Text的中文新闻标题分类
- Mac下安装配置Tomcat 9, Homebrew安装Tomcat
- 易筋SpringBoot 2.1 | 第十二篇:SpringBoot综合应用DataSoure
- php闭包 js闭包,JavaScript闭包与PHP闭包的区别是什么?
- 230.二叉搜索树中第K小的元素
- 把数字翻译成字符串的方法数
- win10 tensorflow 和numpy兼容性问题 No module named ‘numpy.core._multiarray_umath‘
- linux容器安装cmake