关于Config-Server的那些事&踩过的坑!

一、概述

在一个相对成熟,高可用的Spring cloud项目中,都会配置一个配置中心去管理各个服务的配置文件,而往往配置文件不会放到本地配置中心,一般都会放到Git,GitHub,SVN上,

本文以GitHub远程仓库为例,这里首先介绍一下Config-Server服务如何配置搭建,以及其他微服务的配置,以及如何从配置中心读取文件和服务如何实现动态加载配置

首先:

我们要单独创建一个Config-Server的服务

它依赖的包:

 <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- bus总线 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!-- 动态刷新的支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 为了方便,将服务注册到注册中,引入依赖包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>

为了项目后期的灵活,我这里关于config-server的配置文件是如下结构:···-dev开发环境;···-prod正式环境;···-uat发布环境,这里以开发环境为例:

1. application.properties文件配置如下:

 spring.application.name=Config-Service
spring.profiles.active=dev
spring.application.name  :服务名

spring.profiles.active   :服务运行的环境

2. application-dev.properties文件配置如下:

 #config-server
server.port=10003 #eureka
eureka.client.service-url.defaultZone=http://localhost:10001/eureka/,http://localhost:10011/eureka/,http://localhost:10111/eureka/
eureka.instance.prefer-ip-address=false
eureka.instance.lease-renewal-interval-in-seconds=10
eureka.instance.lease-expiration-duration-in-seconds=20 #config-server
#配置文件所在的分支
spring.cloud.config.label=master
#远程配置文件所在的Github仓库的地址,用户名,密码
spring.cloud.config.server.git.uri=https://github.com/zhz12311/QiWuIOT.git
spring.cloud.config.server.git.username=XXXX
spring.cloud.config.server.git.password=xxxxxxx
spring.cloud.config.server.git.clone-on-start=true
#配置文件所在的目录
spring.cloud.config.server.git.search-paths=Consumers,Providers,Zuul
# 对于使用git,svn做为后端配置,从远程库获取配置文件,需要存储到本地文件
spring.cloud.config.server.git.basedir=/application-dev
# 配置中心通过git从远程git库,有时本地的拷贝被污染,这时配置中心无法从远程库更新本地配置,设置force-pull=true,则强制从远程库中更新本地库
spring.cloud.config.server.git.force-pull=true
# 自定义配置文件路径
spring.cloud.config.server.native.search-locations=
# native:启动从本地读取配置文件,必须指定active的值,才可以使用本地文件配置模式,如果使用本地系统配置,则此值必须是native
spring.profiles.active=
#RabbitMQ
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#动态刷新配置 ---需要忽略权限拦截
#关闭刷新安全认证
management.endpoints.web.exposure.include=*
# 开启消息跟踪
spring.cloud.bus.trace.enabled=true

PS:这里需要重点说一下一个配置(也是踩的一个坑):在完成配置,项目也成功启动,进行测试的时候,可以拉取到远程的配置仓库中的指定配置的时候,在没有任何报错的情况下,却不能实现动态刷新,RabbitMQ上也接收不到消息,经过将近两天的时间终于被我找到原因,成功解决:

33 #动态刷新配置 ---需要忽略权限拦截
34 #关闭刷新安全认证
35 management.endpoints.web.exposure.include=*

在1.5.x版本中通过management.security.enabled=false来暴露所有端点,Spring Boot 2.x中的management.security.enabled=false无效问题

解决这个问题一般有两种方式:(参考:https://blog.csdn.net/qq_27385301/article/details/82899303)

方式1:

  # 启用端点 env
  management.endpoint.env.enabled=true

  # 暴露端点 env 配置多个,隔开
  management.endpoints.web.exposure.include=env
方式2:

  方式1中的暴露方式需要一个一个去开启需要暴露的端点,方式2直接开启和暴露所有端点

  management.endpoints.web.exposure.include=*
我这里都是采用方式二,问题也就解决了!还有一定要记住在启动Config-server之前一定要先启动RabbitMQ,我就不解释为什么了

好了,回来继续,GitHub远程仓库中的目录如下:

进行拉去配置测试:

操作如下:(以application-pro-previlige-dev.properties为例)

启动Config-Server,然后在浏览器中访问:http://localhost:10003/application-pro-previlige-dev.properties   会看到如下页面,说明config-server配置成功,可以拉去配置

PS:http请求地址和资源文件映射如下:
* /{application}/{profile}[/{label}]
* /{application}-{profile}.yml
* /{label}/{application}-{profile}.yml
* /{application}-{profile}.properties
* /{label}/{application}-{profile}.properties

接下来要对Providers中的微服务项目进行修改:

1、pom.xml

 1 <!--拉取配置-->
2 <dependency>
3 <groupId>org.springframework.cloud</groupId>
4 <artifactId>spring-cloud-starter-config</artifactId>
5 </dependency>
6 <!--消息总线-->
7 <dependency>
8 <groupId>org.springframework.cloud</groupId>
9 <artifactId>spring-cloud-starter-bus-amqp</artifactId>
10 </dependency>
11 <dependency>
12 <groupId>org.springframework.amqp</groupId>
13 <artifactId>spring-rabbit</artifactId>
14 </dependency>
15 <dependency>
16 <groupId>org.springframework.boot</groupId>
17 <artifactId>spring-boot-starter-actuator</artifactId>
18 </dependency>
19
20 <!-- 重试功能依赖 -->
21 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
22 <dependency>
23 <groupId>org.springframework.boot</groupId>
24 <artifactId>spring-boot-starter-aop</artifactId>
25 </dependency>
26 <!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
27 <dependency>
28 <groupId>org.springframework.retry</groupId>
29 <artifactId>spring-retry</artifactId>
30 </dependency>

2、将原来的application.properties文件改成bootstrap.properties,具体配置如下:

 server.port=60018
spring.application.name=Pro-PreviligeSvr # 远程仓库的分支
spring.cloud.config.label=master
#github上的文件名
spring.cloud.config.name=application-pro-previlige
# dev 开发环境配置文件 | test 测试环境 | pro 正式环境
# 和git里的文件名对应
spring.cloud.config.profile=dev
#spring.cloud.config.profile=test
# 指明配置服务中心的网址
spring.cloud.config.uri= http://localhost:10003/
# true: 如果访问配置中心失败,则停止启动服务
spring.cloud.config.fail-fast=true
# 配置重试,默认是重试6次,最初是延迟1s再次重试,如果再失败,则延迟1.1*1s、1.1*1.1*1s、… 。可以使用这个配置
# 第一次失败,延迟多久重试
spring.cloud.config.retry.initial-interval=2000
# 最多重试次数
spring.cloud.config.retry.max-attempts=6
# 最大重试间隔
spring.cloud.config.retry.max-interval=4000
# 每次重试时间是之前的倍数
spring.cloud.config.retry.multiplier=1.2
# 开启消息跟踪
spring.cloud.bus.trace.enabled=true
#动态刷新配置 ---需要忽略权限拦截
#开启监控端点
management.endpoints.web.exposure.include=*

然后启动该服务查看控制台

在浏览器访问之前的注册中心的任意一个发现服务注册成功,说明拉取远程配置仓库中的配置成功!

但是这里只能说是解决的80%的问题,最大的作用还没有展示出来,下面介绍一下如何通过bus总线和RabbitMQ来完成动态加载最新的配置:

在GitHub仓库找到需要修改的配置文件

首先我们同样是启动Providers中的Pro-Role这个微服务,通过注册中心,查看是否成功注册:

然后我们可以根据服务中提供的接口,在浏览器中进行访问:当成功有返回说明,Config-Server 的使用到目前为止处于理想状态

然后,我们在GitHub仓库中找到该服务的指定配置,进行一些修改操作:

成功修改完配置,Commit changes之后需要进行一步操作,不然没有效果,使用PostMan工具发送一个Post请求:http://localhost:10003/actuator/bus-refresh  如下图,当返回是空白,说明修改成功!

然后我们再回到浏览器中访问原来的路径,发现已经报了JDBC数据库连接错误如下:

然后我们再进行一次重复的操作用,先把数据库密码改回root,提交后,发送POST请求,再次刷新上面的页面,我们会看到:

说明我们的Config-Server这个配置完成,支持动态刷新,更新配置,拉取GitHub仓库中的配置文件,同事当我们发送POST请求后,查看RabbitMQ 的客户端,会发现如下变动,同样也说明成功调用了Bus总线,发送和处理了消息

总结Spring Cloud Bus做配置更新的步骤:

1.提交代码,发送POST请求给actuator/bus-refresh

2.server端接收到请求,并发送给Spring Cloud Bus

3.Spring Cloud Bus接收到消息并通知给其他客户端

4.其他客户端接收到通知,请求server端获取最新的配置

5.全部客户端都获取到最新的配置。

												

SpringCloud系列------Config-Server的更多相关文章

  1. SpringCloud系列——Config 配置中心

    前言 Spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持.有了配置服务器,您就有了一个中心位置来管理跨所有环境的应用程序的外部属性.本文记录实现一个配置中心.客 ...

  2. springCloud系列 Config配置中心

    1.config服务的部署 2.yum文件的格式 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 3.热部署 4.配 ...

  3. SpringCloud系列——Bus 消息总线

    前言 SpringCloud Bus使用轻量级消息代理将分布式系统的节点连接起来.然后可以使用此代理广播状态更改(例如配置更改)或其他管理指令.本文结合RabbitMQ+GitHub的Webhook实 ...

  4. springcloud情操陶冶-springcloud config server(三)

    承接前文springcloud情操陶冶-springcloud config server(二),本文就不讲述server了,就简单阐述下client的应用 前话 config server在引入的时 ...

  5. springcloud情操陶冶-springcloud config server(二)

    承接前文springcloud情操陶冶-springcloud config server(一),本文将在前文的基础上讲解config server的涉外接口 前话 通过前文笔者得知,cloud co ...

  6. springcloud情操陶冶-springcloud config server(一)

    承接前文springcloud情操陶冶-springcloud context(二),本文将在前文基础上浅析下ConfigServer的工作原理 前话 根据前文得知,bootstrapContext引 ...

  7. SpringCloud Config Bus webhook 只能刷新config server 不能刷新config client

    在 https://github.com/spring-cloud/spring-cloud-bus/issues/124 中有提到 版本 SpringCloud:Greenwich.RC1 原因 由 ...

  8. springcloud系列12 config的使用

    config组件分为server端和client端 config的原理: 就是当我们将配置文件放置在git上面,那么configserver就会去拉取相关配置文件至本地: 可以看到我本地是拉去了配置文 ...

  9. SpringCloud系列之配置中心(Config)使用说明

    大家好,最近公司新项目采用SpingCloud全家桶进行开发,原先对SpringCloud仅仅只是停留在了解的初级层面,此次借助新项目的契机可以深入实践下SpringCloud,甚是Happy.大学毕 ...

  10. 微服务SpringCloud—Config Server对称加密

    配置内容的加解密在Git仓库中明文存储配置属性的.很多场景下,对于某些敏感的配置内容(例如数据库账号.密码等),应当加密存储. Config对称加解密1.安装JCE默认情况下我们的JRE自带了JCE, ...

随机推荐

  1. H5外包团队 H5开发微信APP的优势有哪些

    H5外包团队 H5开发微信APP的优势有哪些

  2. php日志

    // 全局通用日志工具 function setlog($param = [],$result = [],$name='',$filename = 'm.log',$path = '/tmp/bear ...

  3. loadrunner场景之集合点设置技巧

    在loadrunner的虚拟用户中,术语concurrent(并发)和simultaneous(同时)存在一些区别,concurrent 是指虚拟场景中参于运行的虚拟用户. 而simultaneous ...

  4. DAY 24继承与组合

    一.继承 继承就是子类与父类形成的一种关系,可以让子类能直接从父类中获取属性与方法 优点:减少了类与类之间的代码冗余 语法: class 父类: # 父类是多个有共同点的普通类抽离共有属性与方法形成的 ...

  5. react state成员

    组件中包括state,props与render成员函数. react中,主要通过定义state,根据不同state渲染对应用户界面. 过程调用了成员函数setState(data,callback). ...

  6. 雷林鹏分享:jQuery EasyUI 数据网格 - 创建复杂工具栏

    jQuery EasyUI 数据网格 - 创建复杂工具栏 数据网格(datagrid)的工具栏(toolbar)可以包含按钮及其他组件. 您可以通个一个已存在的 DIV 标签来简单地定义工具栏布局,该 ...

  7. jmockit 模拟同一个函数多次调用每次返回不同结果

    new Expectations(){{ calendarService.getGeneralCalendar((Date)any); returns(null, new AbrahamResult& ...

  8. 记录一下小程序canvas

    小程序canvas学习 效果图: .wxml <canvas style="width: 100vw; height: 100vh;" canvas-id="fir ...

  9. JSP 标准标签库JSTL

    JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. 除了这些,它还提供 ...

  10. OO的奇妙冒险1

    OO的奇妙冒险 ~OOP入门与字符串处理~ 目录 总体分析 作业内容分析 作业内容总结 互测的收获 公测互测bug分析与总结 不太正经的个人自嗨 总体分析 公测 中测(基础与进阶): 其实在我看来,从 ...