1.为什么使用分布式配置中心
2.什么是分布式配置中心
3.常用的分布式配置中心框架有哪些
4.分布式配置中心一般需要哪些组件
5.config原理:
6.搭建 config 分布式配置中心
6.1.搭建git环境
6.2.搭建ConfigServer服务器
6.3.搭建ConfigClient服务器
7.动态刷新配置文件信息
7.1.重启服务器方式
7.2.动态刷新方式
手动刷新
8.阿波罗分布式配置中心
传统的配置文件管理方式,当配置文件发生改变时,需要到项目中找到对应的配置文件然后进行修改,重新打包,启动项目,重新读取配置信息到 jvm 内存中。而在微服务中,如果使用传统的方式管理配置文件,因为配置文件会比较多,所以配置文件的管理会非常复杂。这时候我们就出现了分布式配置中心。
在微服务中,使用统一的服务器管理所有的配置文件信息,能够实现后台可管理,当服务器正在运行时,如果配置文件发生改变,可以在后台直接修改配置文件,然后不需要重新启动服务器就可以实时更新配置文件信息。
1)阿波罗,携程开发的分布式配置中心框架,有图形管理界面可以管理配置文件,配置文件的信息存储在数据库里。
2)zookeeper,也可以使用zookeeper实现分布式配置中心,持久节点+事件通知。
3)springcloud 自带的框架 config,没有后台界面可以管理配置文件信息,配置文件都存储在版本控制器中(git/svn)
强调:一般公司不会使用springcloud config分布式配置中心,大部分使用的都是阿波罗框架,因为springcloud config 没有像阿波罗一样有图形管理界面可以管理配置文件,管理起来比较麻烦,所以不建议使用springcloud config分布式配置中心,此篇文件是让我们理解分布式配置中心的原理,开发中还是推荐使用阿波罗作为分布式配置中心。
1)web管理系统:后台可以使用图形管理界面管理配置文件,阿波罗有图形管理界面,springcloud config没有管理界面。
2)存储分布式配置文件的服务器(持久存储服务器):springcloud config 存储在版本控制器中,阿波罗存储在数据库中。
3)ConfigServer 缓存配置文件服务器(临时存储服务器)
4)ConfigClient 读取ConfigServer 中的配置文件信息
开发人员将配置文件提交到版本控制工具中,git/svn 持久存放配置文件信息,configServer缓存服务器可以从git/svn环境中读取配置文件信息,临时存放到缓存服务器中,ConfigClient 客户端可以从ConfigServer缓存服务器上读取配置文件信息,也保存到客户端本地。
问题:为什么要在客户端和持久存储服务器中间加一层ConfigServer缓存服务器呢?
答:配置文件本来就不是经常修改的,如果每次需要读取配置文件,都要去持久存放服务器中读取,那样效率就太低了,而如果从缓存服务器上读取就会方便很多。当然,如果持久存储服务器上的配置文件信息发生改变,可以通过手动刷新,或者实时更新的方式,及时的刷新到缓存服务器上,以及客户端本地缓存上。
首先,我们需要一个git环境,我是使用 码云 创建了一个git环境
https://gitee.com/xuruanshun/gkconfig.git
公司的项目环境划分:
dev 开发环境、sit 测试环境、pre 预生产环境、prd 准生产环境
Git环境中,配置文件存放的位置,以项目(服务)进行划分,比如:
member_config:会员服务配置文件
order_config: 订单服务配置文件
配置文件的命名规则:服务名称-环境.后缀,比如:
order-dev.yml
order-sit.yml
我在 gkconfig 仓库里创建了一个文件夹 order_config,里面有两个配置文件:
注意:内容要符合yml文件的格式。
1)创建一个项目 springcloud-configserver,作为configserver服务器,读取 git 中的配置文件
2)引入依赖
4.0.0 com.itmayiedu springcloud-configserver 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.0.1.RELEASE org.springframework.cloud spring-cloud-dependencies Finchley.M7 pom import org.springframework.cloud spring-cloud-config-server org.springframework.cloud spring-cloud-starter-netflix-eureka-client spring-milestones Spring Milestones https://repo.spring.io/libs-milestone false
3)application.yml
###服务注册到eureka地址 eureka: client: service-url: defaultZone: http://localhost:8100/eureka spring: application: ####注册中心应用名称 name: config-server cloud: config: server: git: ###git环境地址 uri: https://gitee.com/xuruanshun/gkconfig.git ####搜索目录 search-paths: - order_config ####读取分支 label: master ####端口号 server: port: 8888
注:
1.我们可以将configserver注册到注册中心,configclient读取configserver的配置信息时,直接通过服务名称到注册中心获取configserver的实际信息,远程调用配置信息。
2.git仓库名称是 gkconfig,仓库里有文件夹 order_config,里面有两个配置文件,分支是master。
4)启动类
package com.itamyiedu; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableConfigServer @EnableEurekaClient @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
@EnableConfigServer:开启分布式配置中心服务器端
5)启动eureka,启动configserver项目,浏览器访问配置文件,看configserver是否读取到git上的配置文件。
1)创建一个项目 springcloud-configclient,作为configclient客户端,读取 configserver 中的配置文件
2)引入依赖
4.0.0 com.itmayiedu springcloud-config-client 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.0.1.RELEASE org.springframework.cloud spring-cloud-dependencies Finchley.M7 pom import org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-config-client org.springframework.cloud spring-cloud-starter-netflix-eureka-client spring-milestones Spring Milestones https://repo.spring.io/libs-milestone false
3)bootstrap.yml文件
spring: application: #### 注册中心应用名称 name: order cloud: config: #### 读取版本环境 profile: dev #### 读取config-server注册服务名称 discovery: service-id: config-server #### 开启读取权限 enabled: true ##### eureka服务注册地址 eureka: client: service-url: defaultZone: http://localhost:8100/eureka server: port: 8882
解释:
4)Controller
package com.itmayiedu; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class IndexController { @Value("${itmayieinfo}") private String itmayieinfo; @RequestMapping("/getItmayieinfo") public String getItmayieinfo() { return itmayieinfo; } }
5)启动类
package com.itmayiedu; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableEurekaClient @SpringBootApplication public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); } }
6)启动eureka,启动configserver,启动configclient,浏览器访问(配置的是生产环境)
7)修改成测试环境,浏览器再次访问
注意:如果没有搜索到对应的配置文件,或者没有搜索到配置文件中的信息,项目启动会报错。
默认情况下,config是不能及时的获取实时变更的配置文件信息的。
我们修改 git 中的order-sit.yml文件
浏览器访问configserver服务器,发现已经同步更新了。
浏览器访问configclient服务器,发现没有更新
所以,在默认情况下,修改git中的配置文件,configserver是同步更新的,但是configclient不是同步更新的。
此时,我们可以通过重新启动configclient服务器,获取最新的配置文件信息:
每次修改配置文件,都要重新启动服务器,太不方便了,我们可以使用 springcloud config 手动刷新或者自动刷新的方式,获取实时的配置文件信息。无论是手动刷新,还是自动刷新,都不用重启服务器。
手动刷新:需要手动的调用接口,读取最新的配置文件信息,采用的是监控中心的方式。
自动刷新:使用消息总线的方式进行实时通知,这种方式本篇文章不作介绍,后文在消息总线时候说。
1)添加监控中心的依赖
org.springframework.boot spring-boot-starter-actuator
2)bootstrap.yml 新增
##### 开启所有监控断点 management: endpoints: web: exposure: include: "*"
3)在需要刷新的Bean上添加@RefreshScope注解。
package com.itmayiedu; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope public class IndexController { @Value("${itmayieinfo}") private String itmayieinfo; @RequestMapping("/getItmayieinfo") public String getItmayieinfo() { return itmayieinfo; } }
4)重新启动服务器,修改配置文件
5)浏览器访问configclient,发现此时数据依然没变。
6)我们需要手动调用接口,刷新configclient中的配置文件
手动刷新接口:使用Post请求手动刷新:/actuator/refresh
7)再次访问,同步成功
问题:
使用@RefreshScope注解时候遇到一个问题,当不使用此注解时候,浏览器可以访问到数据,当使用到此注解时,浏览器访问一直为null,找了半天原因,原来是因为我的方法写成private权限的了,改成public就可以了。
注意:
在实际开发中,不建议使用自动刷新的公司拟,对性能不是很好。建议每次改完配置文件之后,手动调用接口,刷新配置文件。
在实际开发中是不建议使用springcloud config,而建议使用阿波罗,详情参看文档:
SpringCloud 集成Apollo分布式配置中心 https://blog.csdn.net/hu_zhiting/article/details/89707448
后文:代码已上传到码云 https://gitee.com/xuruanshun/springcloud.git