介绍完服务的容错保护处理,接下来咱们来了解下关于分布式配置中心的相关知识和使用。众所周知,随着项目的愈来愈多,日益庞大,每一个子项目都会伴随着不一样的配置项,于此也就多了不少的配置文件。假若某些配置信息修改,可能就会伴随着一系列配置文件的更新和相应服务的重启操做了。这对于实施而言,也是噩梦通常的存在,增长了一系列运维成本,也会无形中提升出错的机率。因此在微服务愈来愈多时,就会引入今天要讲解的分布式配置中心,它就是来解决此类问题的。话很少说,开始吧~html
在写这篇文章以前,在公众号里有推送了一篇《为何须要分布式配置中心》的文章。里面也大体说明了,你们能够看一看。简单来讲,就是随着业务的发展、微服务架构的升级,服务的数量、程序的配置日益增多(各类微服务、各类服务器地址、各类参数),传统的配置文件方式和数据库的方式已没法知足开发人员对配置管理的要求,即java
安全性:配置跟随源代码保存在代码库中,容易形成配置泄漏;git
时效性:修改配置,须要重启服务才能生效;github
局限性:没法支持动态调整:例如日志开关、功能开关;web
其实说白了,就是当业务需求有变动时,能够经过修改配置文件或者参数的形式,可以自动更新配置。减小没必要要的重启服务的操做。正常状况下,通常的业务系统都有个参数配置表的,里面记录着不一样业务参数,以此来应对不一样的需求场景,也就是需求口中常说的:要能灵活配置。spring
而在微服务中,因为每一个微服务都是独立的数据库,传统的配置没法知足了。因此才出现了分布式配置中心服务,专门来解决此类问题的。数据库
在微服务架构中,微服务的统一配置管理通常有如下需求:json
综上所述,对于微服务架构而言,一个通用的配置管理机制必不可少,常见作法是使用配置服务器管理配置。目前市面上开源的配置中心有不少,如bootstrap
具体的能够看看以前说的文章《为何须要分布式配置中心》,这里就不过多阐述了。缓存
Spring Cloud Config
为分布式系统外部化配置提供了服务端和客户端的支持,它包括Config Server
和Config Client
两部分。目前支持git
、svn
、vault
、jdbc
和本地
几种存储方式。
最经常使用的存储方式就是git
了。
简单来讲,各客户端程序经过访问服务端获取相应的配置信息。接下来咱们看看下面这张图
从上图能够看出,Config Server
巧妙地经过git clone
将配置信息存于本地,起到了缓存的做用,即便当Git
服务端没法访问的时候,依然能够取Config Server
中的缓存内容进行使用。
这里以git为例,作个简单示例。 首先,在github中建立一个目录:spring-cloud-config-repo
,来存放配置文件信息。
my-config-client-dev.properties
config=this is dev!
my-config-client-dev.properties
config=this is test!
注意:由于存在多个项目都是用配置中心问题,而每一个项目的应用名称是不尽相同的,因此配置文件的命名方式即为: 应用名
+环境变量(profile)
的命名方式。所以,每一个应用理应设置应用名称,是个好习惯。具体的映射规则,在Server端
会进行说明的。
建立工程:spring-cloud-confg-server
0.引入pom依赖。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency>
1.启动类加入@EnableConfigServer注解,声明是ConfigServer
。
@SpringBootApplication @EnableConfigServer @Slf4j public class SpringCloudConfigServerApplication { public static void main(String[] args) throws Exception { SpringApplication.run(SpringCloudConfigServerApplication.class, args); log.info("spring-cloud-config-server启动!"); } }
2.配置文件,添加git仓库相关信息。
spring.application.name=spring-cloud-config-server server.port=5678 #配置文件git配置 spring.cloud.config.server.git.uri=https://github.com/xie19900123/spring-cloud-learning.git # 搜索路径,即配置文件的目录,可配置多个,逗号分隔。默认为根目录。 spring.cloud.config.server.git.searchPaths=spring-cloud-config-repo # git用户名和密码 针对私有仓库而言须要填写 spring.cloud.config.server.git.username= spring.cloud.config.server.git.password=
3.启动应用,访问http://127.0.0.1:5678/my-config-client-dev.properties ,返回了配置文件的信息,说明已经读取到远程仓库信息了。
咱们能够经过访问配置信息的URL与配置文件的映射关系,获取相应的配置信息。
/{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties
url会映射{application}-{profile}.properties对应的配置文件, 其中{label}对应Git上不一样的分支,默认为master。咱们能够尝试构造不一样的url来访问不一样的配置内容, 好比: 要访问master
分支,my-config-client
应用的dev环境
http://127.0.0.1:5678/my-config-client/dev/master
返回的信息:
{ "name": "my-config-client", "profiles": ["dev"], "label": "master", "version": "51d81a5aacce45b97af6db2482769fe02873c548", "state": null, "propertySources": [{ "name": "https://github.com/xie19900123/spring-cloud-learning.git/spring-cloud-config-repo/my-config-client-dev.properties", "source": { "config": "this is dev!" } }] }
此时,查看控制台,能够获悉本地也保存着一份配置信息。
2018-10-09 23:32:46.833 INFO 988 --- [nio-5678-exec-2] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/xiede/AppData/Local/Temp/config-repo-7233984840222622045/spring-cloud-config-repo/my-config-client-dev.properties 2018-10-09 23:32:46.834 INFO 988 --- [nio-5678-exec-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@66e76432: startup date [Tue Oct 09 23:32:46 CST 2018]; root of context hierarchy
查看本地仓库目录:
此时,修改远程的配置文件,再次访问能够看见返回的参数是最新修改后的参数值了,你们能够自行试试。
建立一个客户端:spring-cloud-confg-client
。固然也能够改造原来的应用了,只需加入相应pom文件和配置文件便可。 0.加入pom依赖。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
1.建立启动类,就是一个正常的web应用。
/** * Spring Cloud Config client 示例 * @author oKong * */ @SpringBootApplication @Slf4j public class SpringCloudConfigClientApplication { public static void main(String[] args) throws Exception { SpringApplication.run(SpringCloudConfigClientApplication.class, args); log.info("spring-cloud-config-client启动!"); } }
2.配置文件添加:bootstrap.properties
和常规的application.properties
。
bootstrap.properties
# 设置分支 spring.cloud.config.label=master # 环境变量 spring.cloud.config.profile=dev # 是否使用注册中心方式进行获取 后续会进行讲解 #spring.cloud.config.discovery.enabled=false # 服务端地址 # 在不使用注册中心模式下 直接填写实际地址 spring.cloud.config.uri=http://127.0.0.1:5678 # 注册中心应用id 下一章节会进行讲解 #spring.cloud.config.discovery.service-id=
application.properties
# 设置应用名称,须要和配置文件匹配 spring.application.name=my-config-client server.port=5666
这里须要注意:
spring-cloud-config
相关的属性必须配置在bootstrap.properties
中,config部份内容才能被正确加载。由于config的相关配置会先于application.properties
,而bootstrap.properties
的加载也是先于application.properties
。
3.编写一个控制层,利用@Value
进行参数测试。
/** * config client 简单示例 * @author oKong * */ @RestController public class DemoController { @Value("${config}") String config; @GetMapping("/") public String demo() { return "返回的config参数值为:" + config; } }
4.启动应用,访问:http://127.0.0.1:5666/ ,能够看见配置信息已经被正确返回了。
自此,一个简单的配置中心示例就结束了。 目前为止,咱们尚未手动去修改远程的配置文件参数值,能够试试,在修改后,客户端去返回相应的参数值,会发现仍是旧的,并无进行更新操做。由于配置文件是是在应用启动的时候进行加载的,并且远程仓库修改了配置文件,客户端并不知道已经修改了,不会发起请求的。关于配置参数自动更新相关知识点,会在下一章节进行讲解的。
本章节主要讲解了常规操做下,如何使用
SpringCloudConfig
进行统一参数配置管理。针对配置动态刷新,实时生效相关知识点,会在下一章节进行单独讲解的,本章节先让你们有个直观的认识,了解下SpringCloudConfig
实现的一些机制。本文仅仅是讲解了git
示例,有兴趣的同窗能够试试其余的,好比svn
或者本地资源库
等形式。都是相似配置,就不加以说明了。
目前互联网上大佬都有分享
SpringCloud
系列教程,内容可能会相似,望多多包涵了。原创不易,码字不易,还但愿你们多多支持。若文中有错误之处,还望提出,谢谢。
499452441
lqdevOps
我的博客:http://blog.lqdev.cn
源码示例:https://github.com/xie19900123/spring-cloud-learning
原文地址:http://blog.lqdev.cn/2018/10/10/SpringCloud/chapter-seven/