热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringCloudConfig采用数据库存储配置内容【Edgware+】

在之前的《SpringCloud构建微服务架构:分布式配置中心》一文中,我们介绍的SpringCloudServer配置中心采用了Git的方式进行配置信

在之前的《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:该内容非强制,主要用来管理schema(如果您不了解可以看一下这篇文章)

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

// 测试用数据&#xff0c;仅用于本文测试使用
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;keyvalue是保留关键词&#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-dbconfig-client两个项目&#xff1a;


  • Github&#xff1a;https://github.com/dyc87112/SpringCloud-Learning/
  • Gitee&#xff1a;https://gitee.com/didispace/SpringCloud-Learning/

如果您对这些感兴趣&#xff0c;欢迎star、follow、收藏、转发给予支持&#xff01;




money.jpg
推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
author-avatar
mobiledu2502931437
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有