作者:mobiledu2502931437 | 来源:互联网 | 2023-09-17 21:28
在之前的《Spring Cloud构建微服务架构:分布式配置中心》一文中,我们介绍的Spring Cloud Server配置中心采用了Git的方式进行配置信息存储。这一设计巧妙的利用Git自身机制以及其他具有丰富功能的Git服务端产品,让Spring Cloud Server在配置存储和管理的上避开了很多与管理相关的复杂实现,使其具备了配置中心存储配置和读取配置的基本能力;而更上层的管理机制,由于不具备普遍适用性,所以Spring Cloud Server并没有自己去实现这部分内容,而是通过Git服务端产品来提供一部分实现,如果还需要更复杂的功能也能自己实现与定义。即便如此,对于Spring Cloud Server默认使用Git来存储配置的方案一直以来还是饱受争议。所以,本文将介绍一下Spring Cloud Config从Edgware版本开始新增的一种配置方式:采用数据库存储配置信息。
构建配置中心服务端 第一步:创建一个基础的Spring Boot项目,在pom.xml中引入几个主要依赖:
spring-cloud-config-server
:配置中心的基础依赖spring-boot-starter-jdbc
:由于需要访问数据库,所以需要加载jdbc的依赖mysql-connector-java
:MySQL数据库的连接包flyway-core
&#xff1a;该内容非强制&#xff0c;主要用来管理schema&#xff08;如果您不了解可以看一下这篇文章&#xff09;<parent > <groupId > org.springframework.bootgroupId > <artifactId > spring-boot-starter-parentartifactId > <version > 1.5.11.RELEASEversion > <relativePath /> parent ><dependencies > <dependency > <groupId > org.springframework.cloudgroupId > <artifactId > spring-cloud-config-serverartifactId > dependency > <dependency > <groupId > org.springframework.bootgroupId > <artifactId > spring-boot-starter-jdbcartifactId > dependency > <dependency > <groupId > org.flywaydbgroupId > <artifactId > flyway-coreartifactId > <version > 5.0.3version > dependency > <dependency > <groupId > mysqlgroupId > <artifactId > mysql-connector-javaartifactId > <version > 5.1.21version > dependency > dependencies ><dependencyManagement > <dependencies > <dependency > <groupId > org.springframework.cloudgroupId > <artifactId > spring-cloud-dependenciesartifactId > <version > Edgware.SR3version > <type > pomtype > <scope > importscope > dependency > dependencies > dependencyManagement >
第二步&#xff1a;准备schema创建文件。在resources
下创建schema
目录&#xff0c;并加入V1__Base_version.sql
文件&#xff0c;具体内容如下&#xff1a;
CREATE TABLE &#96;properties&#96; ( &#96;id&#96; int (11 ) NOT NULL , &#96;key&#96; varchar (50 ) NOT NULL , &#96;value&#96; varchar (500 ) NOT NULL , &#96;application&#96; varchar (50 ) NOT NULL , &#96;profile&#96; varchar (50 ) NOT NULL , &#96;label&#96; varchar (50 ) NOT NULL , PRIMARY KEY (&#96;id&#96; ) ) ENGINE &#61;InnoDB DEFAULT CHARSET &#61;utf8;
该脚本会在程序运行时由flyway自动执行
第三步&#xff1a;创建应用主类&#xff0c;具体如下&#xff1a;
&#64;EnableConfigServer &#64;SpringBootApplication public class ConfigServerBootstrap { public static void main (String[] args) { ApplicationContext context &#61; SpringApplication.run(ConfigServerBootstrap.class); JdbcTemplate jdbcTemplate &#61; context.getBean(JdbcTemplate.class); jdbcTemplate.execute("delete from properties" ); jdbcTemplate.execute("INSERT INTO properties VALUES(1, &#39;com.didispace.message&#39;, &#39;test-stage-master&#39;, &#39;config-client&#39;, &#39;stage&#39;, &#39;master&#39;)" ); jdbcTemplate.execute("INSERT INTO properties VALUES(2, &#39;com.didispace.message&#39;, &#39;test-online-master&#39;, &#39;config-client&#39;, &#39;online&#39;, &#39;master&#39;)" ); jdbcTemplate.execute("INSERT INTO properties VALUES(3, &#39;com.didispace.message&#39;, &#39;test-online-develop&#39;, &#39;config-client&#39;, &#39;online&#39;, &#39;develop&#39;)" ); jdbcTemplate.execute("INSERT INTO properties VALUES(4, &#39;com.didispace.message&#39;, &#39;hello-online-master&#39;, &#39;hello-service&#39;, &#39;online&#39;, &#39;master&#39;)" ); jdbcTemplate.execute("INSERT INTO properties VALUES(5, &#39;com.didispace.message&#39;, &#39;hello-online-develop&#39;, &#39;hello-service&#39;, &#39;online&#39;, &#39;develop&#39;)" ); } }
这里增加了一些测试用数据&#xff0c;以便于后续的配置读取验证。
第四步&#xff1a;配置application.properties
&#xff0c;具体内容如下&#xff1a;
spring.application.name&#61;config-server-db server.port&#61;10020 spring.profiles.active&#61;jdbc spring.cloud.config.server.jdbc.sql&#61;SELECT &#96;KEY&#96;, &#96;VALUE&#96; from PROPERTIES where APPLICATION&#61;? and PROFILE&#61;? and LABEL&#61;? spring.datasource.url&#61;jdbc:mysql://localhost:3306/config-server-db spring.datasource.username&#61;root spring.datasource.password&#61; spring.datasource.driver-class-name&#61;com.mysql.jdbc.Driver flyway.locations&#61;/schema
这里主要涉及几个配置&#xff1a;
spring.profiles.active&#61;jdbc
&#xff1a;必须设置&#xff0c;将配置中心的存储实现切换到jdbc的方式spring.cloud.config.server.jdbc.sql
&#xff1a;非必须&#xff0c;这里由于采用mysql数据源&#xff0c;key
、value
是保留关键词&#xff0c;原生的实现语句会报错&#xff0c;所以需要重写一下这句查询语句&#xff08;如果存储的表结构设计不同于上面准备的内容&#xff0c;也可以通过这个属性的配置来修改配置的获取逻辑&#xff09;spring.datasource.*
&#xff1a;存储配置信息的数据源配置&#xff0c;这里采用mysql&#xff0c;开发者根据自己实际情况修改flyway.locations
&#xff1a;flyway加载schema创建sql的位置服务端配置验证 完成了上一节内容之后&#xff0c;我们就已经构建一个通过数据酷来存储配置内容的配置中心了&#xff0c;下面我们可以通过配置中心暴露的端点来尝试读取配置。
第一步&#xff1a;先将上面构建的配置中心启动起来。
第二步&#xff1a;验证配置信息获取&#xff1a;
curl http://localhost:10020/config-client/stage/
&#xff0c;获取信息config-client
服务stage
环境的配置内容&#xff0c;根据上面的数据准备&#xff0c;我们会获得如下返回内容&#xff1a;{ "name" : "config-client" , "profiles" : [ "stage" ], "label" : null , "version" : null , "state" : null , "propertySources" : [ { "name" : "config-client-stage" , "source" : { "com.didispace.message" : "test-stage-master" } } ] }
curl http://localhost:10020/hello-service/stage/develop
&#xff0c;获取信息hello-service
服务&#xff0c;stage
环境&#xff0c;develop
标签的配置内容&#xff0c;根据上面的数据准备&#xff0c;我们会获得如下返回内容&#xff1a;{ "name" : "hello-service" , "profiles" : [ "online" ], "label" : "develop" , "version" : null , "state" : null , "propertySources" : [ { "name" : "hello-service-online" , "source" : { "com.didispace.message" : "hello-online-develop" } } ] }
关于如何访问Spring Cloud Config构建配置中心获取配置信息的详细内容 &#xff0c;可以查看前文&#xff1a;《Spring Cloud构建微服务架构&#xff1a;分布式配置中心》&#xff0c;本文不做详细介绍。
总结 本文主要具体介绍了在Spring Cloud Config在Edgware版本开始新增的JDBC存储的使用思路&#xff0c;具体使用实际上还有很多可以优化的空间&#xff0c;比如&#xff1a;索引的优化、查询语句的优化&#xff1b;如果还需要进一步定制管理&#xff0c;对于表结构的优化也是很有必要的。
最后&#xff0c;安利一个基于Spring Cloud Config的配置管理项目&#xff1a;https://github.com/dyc87112/spring-cloud-config-admin &#xff0c;正在紧锣密鼓的开发中&#xff0c;尽情期待&#xff01;
本文示例 读者可以根据喜好选择下面的两个仓库中查看config-server-db
和config-client
两个项目&#xff1a;
Github&#xff1a;https://github.com/dyc87112/SpringCloud-Learning/ Gitee&#xff1a;https://gitee.com/didispace/SpringCloud-Learning/ 如果您对这些感兴趣&#xff0c;欢迎star、follow、收藏、转发给予支持&#xff01;