分布式高可用配置中心

在使用spring cloud 构建分布式系统的过程中,为了完成多个服务的配置统一管理,使用了spring cloud config作为配置中心,管理所有微服务的系统配置。在分布式系统中,配置中心是一个独立的服务部件,作用是专门为其他服务提供系统启动所需的配置信息,保证系统正确启动。高可用配置中心的基本思路是将我们的配置服务交给注册中心, 依赖注册中心的多节点服务保证注册的高可用.

注册中心

注册中心地址

1
http://admin:pwd123@node1.test.com:8001/eureka/,http://admin:pwd123@node1.test.com:8002/eureka/,http://admin:pwd123@node3.test.com:8003/eureka/

GIT仓库

地址说明

文件结构

1
2
3
config-property
├── application-develop.properties
└── application-product.properties

注册配置中心

示例展示如何搭建高可用的配置中心

工程结构

1
2
3
4
5
6
7
8
9
10
11
12
config-provider
├── pom.xml
├── src
│   └── main
│   ├── java
│   │   └── com
│   │   └── cloud
│   │   └── config
│   │   └── provider
│   │   └── Application.java
│   └── resources
│   └── application.properties

Maven配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

主类示例

  • @EnableConfigServer启用配置中心功能
  • @EnableDiscoveryClient将示例注册到注册中心
1
2
3
4
5
6
7
8
9
10
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
public class Application {

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

}

配置说明

1
2
3
4
5
6
7
8
9
10
spring.application.name=config-center

server.port=7501

spring.cloud.config.server.git.uri=https://gitee.com/test/spring-eureka
spring.cloud.config.server.git.search-paths=config-property
spring.cloud.config.server.git.username=test
spring.cloud.config.server.git.password=testpwd

eureka.client.service-url.defaultZone=http://admin:pwd123@node1.test.com:8001/eureka/,http://admin:pwd123@node1.test.com:8002/eureka/,http://admin:pwd123@node3.test.com:8003/eureka/

参数说明

  • spring.cloud.config.server.git.uri: 远程git仓库的位置
  • spring.cloud.config.server.git.search-paths: git仓库下配置文件存放的相对路径
  • spring.cloud.config.server.git.username: git地址的访问账号
  • spring.cloud.config.server.git.password: git地址的访问密码
  • eureka.client.service-url.defaultZone: 注册中心地址

启动实例

1
2
[root@localhost target ]$ java -jar config-provider-1.0-SNAPSHOT.jar --server.port=7501 &
[root@localhost target ]$ java -jar config-provider-1.0-SNAPSHOT.jar --server.port=7502 &

注册效果

查看配置

开发环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost target ]$ curl http://192.168.0.106:7502/application/develop/master | python -m json.tool
{
"label": "master",
"name": "application",
"profiles": [
"develop"
],
"propertySources": [
{
"name": "https://gitee.com/test/spring-eureka/config-property/application-develop.properties",
"source": {
"environment": "develop",
"spring.datasource.driver-class-name": "com.mysql.jdbc.Driver",
"spring.datasource.password": "root",
"spring.datasource.url": "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&zeroDateTimeBehavior=round&transformedBitIsBoolean=true&autoReconnect=true",
"spring.datasource.username": "root"
}
}
],
"state": null,
"version": "0b67d61360ad1bfc5b202476f9871a413ca6f029"
}
线上环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost target ]$ curl http://192.168.0.106:7502/application/product/master | python -m json.tool
{
"label": "master",
"name": "application",
"profiles": [
"product"
],
"propertySources": [
{
"name": "https://gitee.com/test/spring-eureka/config-property/application-product.properties",
"source": {
"environment": "product",
"spring.datasource.driver-class-name": "com.mysql.jdbc.Driver",
"spring.datasource.password": "root",
"spring.datasource.url": "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&zeroDateTimeBehavior=round&transformedBitIsBoolean=true&autoReconnect=true",
"spring.datasource.username": "root"
}
}
],
"state": null,
"version": "0b67d61360ad1bfc5b202476f9871a413ca6f029"
}

读取配置文件

示例展示如何实现对已经搭建好的配置中心的信息读取

工程结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
config-consumer
├── pom.xml
├── src
│   └── main
│   ├── java
│   │   └── com
│   │   └── cloud
│   │   └── config
│   │   └── consumer
│   │   ├── Application.java
│   │   └── www
│   │   └── ConfigReadController.java
│   └── resources
│   └── application.properties

Maven依赖

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
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

主类示例

  • @EnableDiscoveryClient将示例注册到注册中心
1
2
3
4
5
6
7
8
9
@EnableDiscoveryClient
@SpringBootApplication
public class Application {

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

}

注册效果

启动示例,查看注册效果