在前面有提到,微服务系统是一种典型的分布式系统,我们会将每个功能都尽可能地拆分一个可独立部署、运行的服务,服务部署完成后,每一次请求的完成,都可能涉及到多个服务的协调作业,面对越来越多的微服务,我们需要有一个东西可以方便地管理配置文件、最好可以在一个地方管理所有微服务的配置,这个就是我们接下来要说的分布式配置组件了。在接下来的内容中,简称这个分布式配置组件为配置中心。
4.1 初识分布式配置
在开始介绍Spring Cloud的配置中心实现之前,我们可以先回忆下以前我们的系统配置是怎么做的。
最开始学习的时候,很多东西都是没有配置的,基本上都是硬编码,简单、快速,系统很快构建起来了,可是随着系统的功能越来越复杂,代码量越来越大,很多地方进行硬编码已经不能满足我们的需求,我们需要在不同的环境、不同的场景下通过修改配置项来达到不一样的效果,配置项放在代码里面难找,而且修改起来会很麻烦。
于是,我们将可能频繁变动的项目提出来放在了xml、properties文件中,方便修改,这个时候修改配置的时候已经不需要再去碰业务代码,只要找到对应的配置文件,修改、打包、重新部署就可以了。这样子看起来已经不错了,但是随着分布式架构逐渐流行,一个一个的集群被搭建起来,这个时候再给每个集群实例搭配一个配置文件,维护的工作量就变得很大了。
这种情况运维人员一般都有一个config list,记录了每个实例的配置文件放在哪里、叫什么名字、现在的配置项是什么等等。这个清单如果维护出错,对整个系统来说都会是一个灾难。基于这种情况,分布式系统需要一个中心化的配置中心来替代这个config list,并且可以方便地从不同维度来进行配置,最好支持配置项的随时,并且最好能够实时生效。
4.2 Spring Cloud Config
Spring Cloud作为一个完善的微服务框架,提供了Spring Cloud Config作为推荐的分布式配置组件。
Spring Cloud Config提供了服务端和客户端,可以很好地支持分布式系统的配置需求。使用服务端可以快速构建一个独立于业务服务之外的配置中心,配置存储默认使用git,因此它拥有git所拥有的一切优点。同时,它还原生支持使用Spring的Environment和PropertySource来获取配置项。接下来,我们将使用Spring Cloud Config构建一个配置中心。
4.2.1 Config Server
新建Spring Boot工程,引入Spring Cloud Config的服务端maven依赖,为了方便测试,我们同时引入了web和actuator的相关依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</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-actuator</artifactId>
</dependenc