Spring Cloud Config(Greenwich版本)基于数据库搭建统一配置中心

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Spring Cloud Config(Greenwich版本)基于数据库搭建统一配置中心

Spring Cloud Config(统一配置中心)


github开源项目地址:https://github.com/hack-feng/spring-cloud

这里是本项目的配置中心,开始基于git进行配置,后改为基于Mysql数据库配置,并增加前端UI配置界面。

基于git配置教程:https://blog.csdn.net/qq_34988304/article/details/95784724


前端UI界面:https://github.com/zhua-an/adminUI.git


这里介绍本项目的配置和基于Mysql搭建配置中心


config-master项目搭建


pom文件引入:

<!-- Spring Cloud ==> 引入config配置中心 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>


数据库表结构:

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for system_config_properties
-- ----------------------------
DROP TABLE IF EXISTS `system_config_properties`;
CREATE TABLE `system_config_properties` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `key1` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '配置中key的值',
  `value1` varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT '配置中value的值',
  `application` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '应用名',
  `profile` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '环境',
  `label` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '读取的分支',
  `sort` int(11) DEFAULT '0' COMMENT '排序',
  `create_date` datetime DEFAULT NULL COMMENT '创建时间',
  `modify_date` datetime DEFAULT NULL COMMENT '修改时间',
  `create_id` int(11) DEFAULT NULL COMMENT '创建人',
  `modify_id` int(11) DEFAULT NULL COMMENT '修改人',
  `remark` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=185 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='系统配置-config动态配置';

ConfigMasterApplication.java文件:

@SpringBootApplication
@EnableConfigServer     //配置中心的服务端
public class ConfigMasterApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigMasterApplication.class, args);
    }
}

application.yml文件:

server:
  port: 2000
spring:
  profiles:
    active: jdbc
  application:
    name: config-master
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: admin
    password: 123456
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/maple?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&serverTimezone=GMT%2B8
    username: root
    password: 123456
  cloud:
    config:
      label: master
      server:
        jdbc:
          sql: SELECT key1, value1 from system_config_properties where APPLICATION=? and PROFILE=? and LABEL=?
        default-label: master
      profile: dev

spring.profiles.active为spring读取的配置文件名,从数据库中读取,必须为jdbc

spring.datasource配置了数据库相关的信息

spring.cloud.config.label读取的配置的分支,这个需要在数据库中数据对应

spring.cloud.config.server.jdbc.sql为查询数据库的sql语句,该语句的字段必须与数据库的表字段一致


Config Click搭建


创建gateway-master click项目,在resources目录下创建bootstrap.yml文件


  • bootstrap.yml是Spring Cloud的配置文件,在Spring Cloud项目启动时,会优先加载该配置文件
  • application.yml是Spring Boot的配置文件,其加载优先级在bootstrap.yml 之后


bootstrap.yml文件配置:

spring:
  application:
    name: gateway-master
  cloud:
    config:
      uri: http://127.0.0.1:2000
      profile: dev
      label: master

在数据库中插入数据:

INSERT INTO `maple`.`system_config_properties` (`id`, `key1`, `value1`, `application`, `profile`, `label`, `sort`, `create_date`, `modify_date`, `create_id`, `modify_id`, `remark`) VALUES ('1', 'server.port', '5001', 'gateway-master', 'dev', 'master', '1', '2019-08-12 14:56:22', NULL, NULL, NULL, '端口号');
INSERT INTO `maple`.`system_config_properties` (`id`, `key1`, `value1`, `application`, `profile`, `label`, `sort`, `create_date`, `modify_date`, `create_id`, `modify_id`, `remark`) VALUES ('2', 'maple.test', '测试数据', 'gateway-master', 'dev', 'master', '1', '2019-08-15 16:46:22', '2019-08-15 17:43:25', NULL, NULL, 'ceshi');

创建TestController:

@RestController("test")
public class TestController {
    // 启动时从配置文件中读取key1为maple.test的value1值
    @Value("${maple.test}")
    private String test;
    @GetMapping
    public String test(){
        return test;
    }
}

启动项目时,还需要配置一些文件:

启动时打印:

c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://127.0.0.1:2000
......
o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 5001


说明调用config server成功,若调用的端口号为:8888,则bootstrap.yml配置有误。8888端口号为config server默认的端口号。

启动的端口号是数据库中配置的server.port。


启动成功后,访问:http://127.0.0.1:5001/test


访问:http://127.0.0.1:2000/gateway-master/dev 可以查看项目的配置


页面显示返回:测试数据。到这里config配置中心搭建完成。


配置文件修改后,不停机加载配置信息


在上一节的gateway-master项目中进行优化。

在bootstrap.xml配置文件中添加:

# 开启监控接口
management:
  endpoints:
    web:
      exposure:
        include: "*"
        #include: refresh,health,info #打开部分


在TestController文件中添加注解 @RefreshScop

启动项目后,修改maple.test的值为:“修改后的测试数据”,使用postman POST调用:http://127.0.0.1:5001/actuator/refresh 接口触发刷新


spring boot2.0版本之前,刷新调用: http://127.0.0.1:5001/refresh

spring boot2.0版本之后,刷新调用: http://127.0.0.1:5001/actuator/refresh


重新访问:http://127.0.0.1:5001/test 返回:“修改后的测试数据”


使用 Spring Cloud Bus消息总线,动态更新配置信息


Spring cloud bus被国内很多都翻译为消息总线,也挺形象的。大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有Kafka和RabbitMQ。利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一。


本项目中使用RabbitMQ。安装并启动RabbitMQ,创建admin/123456用户。


基于上文的项目我们继续优化,将项目注册到Eureka注册中心


分别在server和click项目中添加pom依赖:

<!-- Spring Cloud ==> 引入bus的消息总线-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

修改 config-master的application.yml 配置文件:

# 开启监控接口
management:
  endpoints:
    web:
      exposure:
        include: "*"
        # include: refresh,health,info #打开部分

分别在server和click项目中添加rabbitMQ配置:

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: admin
    password: 123456


然后依次启动eureka,config-master,gateway-click项目


POST调用:http://127.0.0.1:2000/actuator/refresh-bus刷新配置文件,该刷新将会刷新所有调用config-master统一配置中心的项目。


/actuator/bus-refresh接口可以指定服务,即使用”destination”参数,比如 “/actuator/bus-refresh?destination=customers:**” 即刷新服务名为customers的所有服务。


使用范围:该/actuator/bus-refresh端点清除@RefreshScope缓存和重新绑定 @ConfigurationProperties


customers:9000 解释:应用程序的每个实例都有一个服务ID,其值可以设置为 spring.cloud.bus.id,其值应该是以冒号分隔的标识符列表,从最不具体到最具体。默认值是从环境构造为spring.application.name和 server.port(或spring.application.index,如果设置)的组合。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
算法 安全 Java
微服务(四)-config配置中心的配置加解密
微服务(四)-config配置中心的配置加解密
|
4月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
4月前
|
Java 开发工具 对象存储
简化配置管理:Spring Cloud Config与Netflix OSS中的动态配置解决方案
简化配置管理:Spring Cloud Config与Netflix OSS中的动态配置解决方案
61 2
|
3月前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
211 0
|
5月前
|
移动开发 JavaScript 前端开发
UniApp H5 跨域代理配置并使用(配置manifest.json、vue.config.js)
这篇文章介绍了在UniApp H5项目中处理跨域问题的两种方法:通过修改manifest.json文件配置h5设置,或在项目根目录创建vue.config.js文件进行代理配置,并提供了具体的配置代码示例。
UniApp H5 跨域代理配置并使用(配置manifest.json、vue.config.js)
|
4月前
|
JavaScript
Vue3基础(19)___vite.config.js中配置路径别名
本文介绍了如何在Vue 3的Vite配置文件`vite.config.js`中设置路径别名,以及如何在页面中使用这些别名导入模块。
154 0
Vue3基础(19)___vite.config.js中配置路径别名
|
3月前
|
前端开发 JavaScript
vite vue3 config配置
【10月更文挑战第5天】
118 0
|
3月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
67 0
|
5月前
|
Java 微服务 Spring
Spring Cloud全解析:配置中心之解决configserver单点问题
但是如果该configserver挂掉了,那就无法获取最新的配置了,微服务就出现了configserver的单点问题,那么如何避免configserver单点呢?
|
5月前
|
JSON 前端开发 JavaScript
vue.config.js配置详解
【8月更文挑战第16天】vue.config.js配置详解
181 1
vue.config.js配置详解