Spring Cloud Config
Spring Cloud Config是Spring Cloud团队创建的一个项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分。
其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口;
而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。
Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射,所以它除了适用于Spring构建的应用程序之外,也可以在任何其他语言运行的应用程序中使用。
由于Spring Cloud Config实现的配置中心默认采用Git来存储配置信息,所以使用Spring Cloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,并且可以通过Git客户端工具来方便的管理和访问配置内容。
当然它也提供了对其他存储方式的支持,比如:SVN仓库、本地化文件系统。
由于SpringCloud在Edgware
之后的版本新增的一种配置方式:采用数据库存储配置信息。
我们的demo版本使用的是Edgware.SR5
版本,利用Git进行配置中心的管理一直都饱受争议,所以我在这边只进行了数据库存储方式的介绍。
构建一个配置中心的服务端
在pom文件中引入以下几个主要依赖:
- spring-cloud-config-server:配置中心的主要依赖
- spring-cloud-starter-eureka-server:将服务注册至eureka注册中心
- spring-boot-starter-jdbc:因为使用的是数据库存储,所以必须引入jdbc的依赖
- mysql-connector-java:MySQL数据库的连接包
- flyway-core:主要用来管理schema,具体介绍可以看flyway讲解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| <parent> <groupId>com.wkedong.springcloud</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
<dependencies> <!-- spring-cloud-config-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!-- spring-cloud-starter-eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.21</version> </dependency> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>5.0.3</version> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
|
准备schema创建文件。在resources下创建schema目录,并加入V1.0__Base_version.sql
文件,具体内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| DROP TABLE IF EXISTS properties; CREATE TABLE `properties` ( `id` int(11) AUTO_INCREMENT COMMENT '主键' PRIMARY KEY, `key` varchar(50) NOT NULL COMMENT 'key值_属性名', `value` varchar(500) NOT NULL COMMENT 'value值_属性值', `application` varchar(50) NOT NULL COMMENT '应用名', `profile` varchar(50) NOT NULL COMMENT '激活的剖面', `label` varchar(50) NOT NULL COMMENT '资源的label' ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
|
V1.1__Update_version.sql
:
1 2 3 4 5 6 7 8
| INSERT INTO properties VALUES(1, 'name', 'test-dev-master', 'service-producer', 'dev', 'master'); INSERT INTO properties VALUES(2, 'name', 'test-pro-master', 'service-producer', 'pro', 'master'); INSERT INTO properties VALUES (3, 'name', 'test-dev-develop', 'service-producer', 'dev', 'develop'); INSERT INTO properties VALUES (4, 'name', 'test-pro-develop', 'service-producer', 'pro', 'develop'); INSERT INTO properties VALUES(5, 'name', 'test-dev-master', 'service-consumer', 'dev', 'master'); INSERT INTO properties VALUES(6, 'name', 'test-pro-master', 'service-consumer', 'pro', 'master'); INSERT INTO properties VALUES (7, 'name', 'test-dev-develop', 'service-consumer', 'dev', 'develop'); INSERT INTO properties VALUES (8, 'name', 'test-pro-develop', 'service-consumer', 'pro', 'develop');
|
该sql文件会由flyway自动运行
对工程做一些配置文件的操作application.yml
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| eureka: client: healthcheck: enabled: true #健康检查开启 service-url: defaultZone: http://localhost:6060/eureka/ server: port: 6010 spring: application: name: config # cloud: # config: # server: # git: # uri: https://github.com/wkedong/Spring-Cloud-Config.git profiles: active: jdbc cloud: config: server: jdbc: sql: SELECT `KEY`, `VALUE` from PROPERTIES where APPLICATION=? and PROFILE=? and LABEL=? datasource: url: jdbc:mysql://127.0.0.1:3306/spring_cloud_config?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver flyway: locations: /schema baseline-on-migrate: true
|
创建应用主类,具体内容如下:
1 2 3 4 5 6 7 8 9 10 11 12
| /** * @author wkedong */ @EnableDiscoveryClient @EnableConfigServer @SpringBootApplication public class ConfigApplication {
public static void main(String[] args) { new SpringApplicationBuilder(ConfigApplication.class).web(true).run(args); } }
|
服务端配置验证
完成以上的工程搭建之后,我们就可以验证配置中心的设置。
首先启动配置中心应用,然后访问 http://localhost:6010/service-producer/dev/develop,来获取service-producer服务的dev环境下develop分支的配置文件,结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <Environment> <name>service-producer</name> <profiles> <profiles>dev</profiles> </profiles> <label>develop</label> <version/> <state/> <propertySources> <propertySources> <name>service-producer-dev</name> <source> <name>test-dev-develop</name> </source> </propertySources> </propertySources> </Environment>
|
至此,SpringCloud的配置中心的数据库存储方式就搭建完成了,后续demo会介绍如何在各个微服务中去获取配置中心的配置进行操作。
注意事项:后续所有需要加载配置中心配置的工程所对应的工程配置文件都必须在bootstrap.yml中配置配置中心信息,否则会加载失败。如果在application.yml中配置,在启动工程时候会发现,配置中心的地址端口号为8888而不是你配置的。
本项目内容为Spring Cloud程序的样例:
样例列表:(SpringCloud版本基于Edgware.SR5)