1.分布式 配置中心的设计思想
(1)为什么要使用分布式的配置中心:
背景:在微服务如果使用传统的方式管理配置文件,配置文件管理器非常复杂
如果生产环境配置文件,可能需要发生改变的时候,重新打war,重新读取配置文件信息在jvm内存中。
(2)什么是分布式配置中心
在微服务当中使用同一个服务器管理所有配置文件信息,能够实现后台可管理,当服务器正在运行时,如果配置文件 需要发生改变,可以实现不需要重启服务器实时更改配置文件信息。
2.常见部分式配置中心框架对比
阿波罗:携程写分布式配置中心,有图形界面可管理配置文件信息,配置文件存放在数据库中。
SpringCloud Config: 没有后台可管理分布式配置中心,配置文件信息存放在版本控制器中。
Zookeeper实现分布式配置中心:持久节点+事件通知
3.搭建git环境储存配置文件(码云)
3.1分布式配置中心原理 :
需要组件:
(1)web管理系统 :存放一些分布式后台可以使用图形界面配置文件(SpringCloud Config没有)
(2)存放分布式配置文件服务器(持久化存储服务器): 使用版本控制器来存放文件信息 使用git环境。
(3)ConfigServer缓存配置文件服务器(临时缓存存放)
(4)configClient读取ConfigServer配置文件信息
图解:

通常公司的开发环境 :
dev :开发环境 sit:测试环境 pre:预发布环境 prd: 预生产环境
4.搭建ConfigServer配置文件中心
(1)从远程仓库读取
- 首先我们创建一个maven项目,对pom文件进行修改
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qbd</groupId>
<artifactId>springcloud_config</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>config_server</module>
<module>eureka_server</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<!--管理cloud版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
- 添加Eureka server 子模块,修改pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.qbd</groupId>
<artifactId>springcloud_config</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>eureka_server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka_server</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置yml:
server:
port: 8888
spring:
application:
name: eureka_server
eureka:
client:
fetch-registry: false
register-with-eureka: false
启动类添加 @EnableEurekaServer
- 添加Config Server 子模块,修改pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.qbd</groupId>
<artifactId>springcloud_config</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>config_server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config_server</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置yml文件:
server:
port: 8001
spring:
application:
name: config_server
cloud:
config:
server:
git:
uri: https://gitee.com/gondgondstudy/SpringCloudConfig.git
search-paths:
- SpringCloudConfig #目录地址
default-label: master #分支
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka
启动类
@SpringBootApplication @EnableEurekaClient//Eureka服务提供者 @EnableConfigServer//config 服务
- 在远程仓库创建文件
在远程仓库创建文件的规范:
(1)服务名称- 环境.propertiest
或者服务名称-环境.yml
按照此规范直接在远程仓库中创建两个配置文件

重新启动config server服务,在浏览器地址栏中输入 http://localhost:8001/config_client-dev.yml和http://localhost:8001/config_client-sit.yml 可以发现这两个文件的信息。
完成以上工作后,我们已经搭建好了 Config Server服务
5.ConfigClient读取ConfigServer配置文件信息
新建SpringBoot项目config_client项目
添加依赖,修改pom文件,使maven聚合
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--Eureka 服务客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
建立bootstrap.yml文件
spring:
application:
name: config_client
cloud:
config:
profile: dev #版本环境名称
discovery:
service-id: config_server #对应的服务名称 可以将url写死,但是不建议
enabled: true
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka
server:
port: 8002
然后一个控制器接口:
@RestController
public class TestController {
//启动之后服务之后,将会从远程仓库找对应的配置文件
//然后将对应的key的value信息注入类中属性。
@Value("${server.port}")
private String serverPort;
@RequestMapping("/getServerPort")
public String getServerPort(){
return serverPort;
}
}
启动 Eureka server 服务和 config server 服务之后,再次启动config client 服务。
通过 http://localhost:8050/getServerPort 访问可以的到字符串8050
注意:
虽然我们在config client中设置了端口为8002 但是我们从远程仓库中读取到的端口号为8050,因此我们访问接口的端口号 应该是8050,而不是 8002
如果我们通过不同的端口号来启动 config server 的端口时,我们可以发现该config 满足高可用的负载均衡
以上我们已经基本搭建好了config的环境
6.SpringCloudConfig实时刷新配置文件
然后我们发现一个问题:当我们切换环境时,或者修改配置文件时,我们都需要重新启动服务。默认是不能实时获取修改后的信息。
修改配置文件之后 :
当我们通过config server 端口http://localhost:8001/config_client-dev.ym直接访问,可以看到实时信息。但是当我们通过config Client控制器接口访问,获取的内容不是实时的。
(1)手动刷新:(需要人工调用接口,读取最新配置文件)
在config client 添加依赖
<!--actuator监控中心 用于手动通过控制器刷新配置文件信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在bootstrap.yml文件中添加
#用于控制器手动刷新 开启所有端点
management:
endpoints:
web:
exposure:
include: "*"
然后重启config Client 服务 ,通过控制器http://localhost:8050/actuator 刷新之后 ,再次访问config Client服务中的接口时,可以发现配置文件中的信息已经被手动刷新
(2)自动刷新:消息总线进行实时通知------SpringBus
更改上一模块 config Client :
在pom文件中加入RabbitMQ实现的SpringCloud Bus的起步依赖 -- spring-cloud-startr-bus-amqp,还需要安装 RabbitMQ服务器。
手动刷新和自动刷新都不需要重新启动服务器。
本文围绕分布式配置中心展开,阐述其设计思想,对比常见框架如阿波罗、SpringCloud Config等。详细介绍搭建SpringCloudConfig环境,包括搭建git环境、ConfigServer配置文件中心,ConfigClient读取配置信息,还讲解了实时刷新配置文件的手动和自动方法,并对其设计原理进行分析。
1048

被折叠的 条评论
为什么被折叠?



