Featured image of post Spring Cloud Config微服务配置中心实现MySQL存储

Spring Cloud Config微服务配置中心实现MySQL存储

一、基于MySQL实现配置中心的存储

代码仓库:GitHub cloud-config-center

1.1 cloud-config-server-mysql

创建子模块cloud-config-server-mysql

Maven依赖:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

实体类:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
@Data
@Entity
@Table(name = "properties")
public class ConfigProperties {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "config_key")
    private String configKey;
    @Column(name = "config_value")
    private String configValue;
    @Column(name = "application")
    private String application;
    @Column(name = "config_profile")
    private String configProfile;
    @Column(name = "label")
    private String label;
}

配置文件:jpa自动建表

 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
server:
  port: 8089
spring:
  datasource:
    username: root
    password: root123456
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
        storage_engine: innodb
  cloud:
    refresh:
      enabled: true
    config:
      server:
        jdbc:
          sql: SELECT config_key, config_value from properties where application=? and config_profile=? and label=?
  profiles:
    active: jdbc

logging:
  level:
    org.springframework.data.jpa: DEBUG

启动类:

1
2
3
4
5
6
7
@SpringBootApplication
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

导入dev、test、prod三个环境的数据。

1
2
3
INSERT INTO test.properties (id, application, config_key, config_profile, config_value, label) VALUES (1, 'config-client', 'top.maisr.cloud.config', 'dev', 'mysql dev development', 'main');
INSERT INTO test.properties (id, application, config_key, config_profile, config_value, label) VALUES (2, 'config-client', 'top.maisr.cloud.config', 'test', 'mysql test development', 'main');
INSERT INTO test.properties (id, application, config_key, config_profile, config_value, label) VALUES (3, 'config-client', 'top.maisr.cloud.config', 'prod', 'mysql prod development', 'main');

1.2 cloud-config-client

创建子模块:cloud-config-client

Maven依赖:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

配置读取类:上面的sql中配置了config_key为:top.maisr.cloud.configconfig_value字段的值会映射到下面类的config属性。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
@Component
@ConfigurationProperties(prefix = "top.maisr.cloud")
public class ConfigProperties {
    private String config;

    public String getConfig() {
        return config;
    }

    public void setConfig(String config) {
        this.config = config;
    }
}

controller:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
@RestController
@RequestMapping("/client/config")
public class ConfigController {

    @Autowired
    private ConfigProperties configProperties;

    @GetMapping
    public Object getConfigFromDB() {
        return configProperties.getConfig();
    }
}

启动类:

1
2
3
4
5
6
7
@SpringBootApplication
public class ConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }
}

配置文件: application.yml

1
2
3
4
5
spring:
  application:
    name: cloud-config-client
server:
  port: 9096

bootstrap.yml,连接上面的cloud-config-server-mysql

上面cloud-config-server-mysql中配置了一个sql:SELECT config_key, config_value from properties where application=? and config_profile=? and label=?,会根据label、application和profile去查询配置

1
2
3
4
5
6
7
spring:
  cloud:
    config:
      label: main
      uri: http://localhost:8089
      name: config-client
      profile: dev