SpringCloud(part7)分布式控制中心:SpringCloud Config
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服务器。
手动刷新和自动刷新都不需要重新启动服务器。