微服务巡礼 Spring Cloud 体系使用(六)Spring Cloud Config

以前的章节提过,项目一多起来,各种配置随便复制粘贴,明明是一样的配置却要不断在各个项目中复制粘贴,而且复制粘贴中容易造成问题,万一其中的配置有问题,一个一个项目去找去修改错误的配置,那可是非常麻烦、非常令人沮丧。所以会出现配置中心,只需要修改部分地方,各个应用根据情况更新,著名的框架有携程的Apoll配置中心,而Spring Cloud自然也有自己的配置中心,Spring Cloud Config。

一睹为快

很明显,Spring Cloud Config是基于Git储存的分布式配置中心,使用Git作为配置仓库,如何将应用和配置服务中心联系起来。

构建配置中心

创建Spring Boot工程,命名随便,在pom.xml添加依赖

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.10.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>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<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>Dalston.SR5</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

在Application主类,添加@EnableConfigServer,开启Spring Cloud Config的服务端功能

@EnableConfigServer
@SpringBootApplication
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

application.yml配置中填写如下信息

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri:
          search-paths:
          username:
          password:
server:
  port: 7001
  • uri:填git的完整地址,记得。
  • searchPath:仓库下的路径
  • username:仓库用户名
  • password:仓库用户密码

配置规则

在git仓库下创建config-repo文件夹作为配置仓库,创建如下文件

config.yml
config-dev.yml
config-prod.yml
config-test.yml

并在上面的配置文件中设置一个from属性,配置不同的值,按顺序编写

from:
  git-default-1.0
from:
  git-dev-1.0
from:
  git-prod-1.0
from:
  git-test-1.0

为了测试版本控制,在Git分支创建新的分支develop,将1.0的值改为2.0。做好这些工作后我们直接运行看看,而访问配置信息的URL与配置文件映射关系最推荐是用下面的方式

  • /{application}/{profile}/{lable}

比如我们访问 http://localhost:7001/config/dev/master 顺利解析出配置内容

application参数对应config-repo下文件应用名称,比如我们现在是config.yml,那么application为config,profile对应application的后缀,label则是对应Git的分支。同时在config-server我们看控制台输出内容,可以知道配置中心同时会从Git上存储一份,然后读取再返回给微服务进行加载,因为加载过在本地,所以即使Git一时半时处在不可用状态也不会受到影响。

客户端配置映射

确定配置中心能顺利运行后,下面尝试在微服务应用中获取上述配置信息,

创建一个Spring Boot应用,命名随便,在xml中引入

<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>

	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.SR5</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

更改application.properties配置为bootstrap.yml,因为Spring Boot对配置文件的加载顺序影响,通过boostrap的文件是优先比本地内容要高,从而实现外部化配置。

spring:
  application:
    name: config
  cloud:
    config:
      uri: http://localhost:7001/
      profile: dev
      label: master
server:
  port: 7002
  • name:对应配置文件规则中的{application}部分
  • profile、label、uri一看就懂,分别对应config-server配置意义。

之后创建一个Restful接口来返回配置中心的from属性,通过@Value绑定配置服务中配置的from属性,具体实现如下

@RestController
public class TestController {

    @Value("${from}")
    private String from;

    @RequestMapping("/from")
    public String from() {
        return this.from;
    }
}

启动应用,访问 http://localhost:7002/from ,可以看到配置对应环境的from内容,可以根据自己的需要在bootstrap中配置相关信息获得。

Show Comments