SpringCloud Config简介
SpringCloud Config是SpringCloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分。其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密 / 解密信息等访问接口;而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。SpringCloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射,所以它除了适用于Spring构建的应用程序之外,也可以在任何其他语言运行的应用程序中使用。由于SpringCloud Config实现的配置中心默认采用Git来存储配置信息,所以使用SpringCloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,并且可以通过Git客户端工具来方便的管理和访问配置内容,当然它也提供了对其他存储方式的支持,比如:GIT仓库、SVN 仓库、本地化文件系统,其架构如下图:
Config Server端主要和Git/SVN服务器打交道,获取放在Git/SVN里的配置信息;通俗点说,SpringCloud Config就是用来统一配置管理维护微服务工程中所有配置文件,包括方便切换环境配置,以及修改配置无需动代码,省心省力等
如果用上SpringCloud Bus,能实现无需重启,自动感知配置变化以及应用新配置:
Config Server的基本使用
根据前面SpringCloud Config架构图,首先要搞个configServer来联通远程GIT仓库,读取远程配置;这里的GIT仓库,一般选用GitHub,或者码云 ,这里用GitHub进行演示:
先登录GitHub建个仓库microservice-config,然后Git下载到本地;再上传一个配置文件到git仓库:
注:
application.yml文件要使用utf-8编码,否则会出现乱码、解析等各种问题
新建git仓库时要将类型选为public,如果选private,会造成config server无法访问到
然后新建一个microservice-config-server-4001模块,在pom里加入依赖:
<!--添加配置中心server依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
完整pom如下:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.ue</groupId>
<artifactId>microservice</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>microservice-config-server-4001</artifactId>
<dependencies>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--添加配置中心server依赖-->
<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>
</project>
在启动类加上@EnableConfigServer注解:
然后找到仓库的Http地址进行copy:
microservice-config-server-4001项目的application.yml配置下(主要是要配置一个git请求地址):
server:
port: 4001
spring:
application:
name: microservice-config
cloud:
config:
server:
git:
uri: https://github.com/java-LJ/microservice-config.git
然后在本地hosts文件加个本地域名映射:
127.0.0.1 configserver.test.com
然后只启动这个项目,访问http://configserver.test.com:4001/application-xxx.yml可以读取到配置文件,结果如下:
至于请求路径,是有匹配规则的:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
以springcloud-config-dev.yml为例,它的application是springcloud-config,profile是dev,label是分支的意思,如果只有一个主分支,那可以不写,因为默认会访问master分支,client会根据填写的参数来选择读取对应的配置
Config Client的基本使用
根据前面的springcloud config原理图,还需要建立client端调用server端,最终才能实现client端获取远程git配置信息;为了后面演示方便,再提交两个配置文件到远程git库:
然后新建一个microservice-config-client-5001模块,在pom里加下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
因为项目启动的时候,就要调用server config端获取配置信息,所以这里需要一个bootstrap.yml配置文件(该文件的优先级比application.yml要高):
spring:
application:
name: application-dev
cloud:
config:
name: crm
uri: http://configserver.test.com:4001
profile: test
label: master
fail-fast: true
application.yml如下:
server:
port: 5001
context-path: /
然后再搞一个ConfigClientController类测试显示端口:
package com.ue.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigClientController {
@Value("${port}")
private String port;
@GetMapping("/getPort")
public String getPort() {
return "测试访问的yml文件的端口是:【" + port + "】";
}
}
最后在本地hosts加配置:
127.0.0.1 client-config.test.com
然后启动config server4001项目跟config client5001项目,用浏览器访问http://client-config.test.com:5001/getPort即可获取远程端口配置信息,如下: