zoukankan      html  css  js  c++  java
  • SpringCloud系列------Config-Server

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

    一、概述

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

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

    首先:

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

    它依赖的包:

     1 <dependencies>
     2         <dependency>
     3             <groupId>org.springframework.cloud</groupId>
     4             <artifactId>spring-cloud-config-server</artifactId>
     5         </dependency>
     6         <!-- bus总线 -->
     7         <dependency>
     8             <groupId>org.springframework.cloud</groupId>
     9             <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    10         </dependency>
    11         <!-- 动态刷新的支持 -->
    12         <dependency>
    13             <groupId>org.springframework.boot</groupId>
    14             <artifactId>spring-boot-starter-actuator</artifactId>
    15         </dependency>
    16         <!-- 为了方便,将服务注册到注册中,引入依赖包  -->
    17         <dependency>
    18             <groupId>org.springframework.cloud</groupId>
    19             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    20         </dependency>
    21     </dependencies>

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

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

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

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

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

     1 #config-server
     2 server.port=10003
     3 
     4 #eureka
     5 eureka.client.service-url.defaultZone=http://localhost:10001/eureka/,http://localhost:10011/eureka/,http://localhost:10111/eureka/
     6 eureka.instance.prefer-ip-address=false
     7 eureka.instance.lease-renewal-interval-in-seconds=10
     8 eureka.instance.lease-expiration-duration-in-seconds=20
     9 
    10 #config-server
    11 #配置文件所在的分支
    12 spring.cloud.config.label=master
    13 #远程配置文件所在的Github仓库的地址,用户名,密码
    14 spring.cloud.config.server.git.uri=https://github.com/zhz12311/QiWuIOT.git
    15 spring.cloud.config.server.git.username=XXXX
    16 spring.cloud.config.server.git.password=xxxxxxx
    17 spring.cloud.config.server.git.clone-on-start=true
    18 #配置文件所在的目录
    19 spring.cloud.config.server.git.search-paths=Consumers,Providers,Zuul
    20 # 对于使用git,svn做为后端配置,从远程库获取配置文件,需要存储到本地文件
    21 spring.cloud.config.server.git.basedir=/application-dev
    22 # 配置中心通过git从远程git库,有时本地的拷贝被污染,这时配置中心无法从远程库更新本地配置,设置force-pull=true,则强制从远程库中更新本地库
    23 spring.cloud.config.server.git.force-pull=true
    24 # 自定义配置文件路径
    25 spring.cloud.config.server.native.search-locations=
    26 # native:启动从本地读取配置文件,必须指定active的值,才可以使用本地文件配置模式,如果使用本地系统配置,则此值必须是native
    27 spring.profiles.active=
    28 #RabbitMQ
    29 spring.rabbitmq.host=localhost
    30 spring.rabbitmq.port=5672
    31 spring.rabbitmq.username=guest
    32 spring.rabbitmq.password=guest
    33 #动态刷新配置 ---需要忽略权限拦截
    34 #关闭刷新安全认证
    35 management.endpoints.web.exposure.include=*
    36 # 开启消息跟踪
    37 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,具体配置如下:

     1 server.port=60018
     2 spring.application.name=Pro-PreviligeSvr
     3 
     4 # 远程仓库的分支
     5 spring.cloud.config.label=master
     6 #github上的文件名
     7 spring.cloud.config.name=application-pro-previlige
     8 # dev 开发环境配置文件 |  test 测试环境  |  pro 正式环境
     9 # 和git里的文件名对应
    10 spring.cloud.config.profile=dev
    11 #spring.cloud.config.profile=test
    12 # 指明配置服务中心的网址
    13 spring.cloud.config.uri= http://localhost:10003/
    14 # true: 如果访问配置中心失败,则停止启动服务
    15 spring.cloud.config.fail-fast=true
    16 # 配置重试,默认是重试6次,最初是延迟1s再次重试,如果再失败,则延迟1.1*1s、1.1*1.1*1s、… 。可以使用这个配置
    17 # 第一次失败,延迟多久重试
    18 spring.cloud.config.retry.initial-interval=2000
    19 # 最多重试次数
    20 spring.cloud.config.retry.max-attempts=6
    21 # 最大重试间隔
    22 spring.cloud.config.retry.max-interval=4000
    23 # 每次重试时间是之前的倍数
    24 spring.cloud.config.retry.multiplier=1.2
    25 # 开启消息跟踪
    26 spring.cloud.bus.trace.enabled=true
    27 #动态刷新配置 ---需要忽略权限拦截
    28 #开启监控端点
    29 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.全部客户端都获取到最新的配置。

    
    
  • 相关阅读:
    RMS on why Emacs lisp doesn't have namespace
    老子《道德经》第十章
    switch fall-through一题
    Linux 安装Anroid Studio 0.8
    软考-初级-程序员 【完成】
    《中国医学药典》2010版 一、二、三部 【分享】
    一步步学习微软InfoPath2010和SP2010--第三章节--表单设计基础:处理InfoPath布局、控件和视图(8)--视图
    一步步学习微软InfoPath2010和SP2010--第三章节--表单设计基础:处理InfoPath布局、控件和视图(7)--添加含规则的提交按钮到Flight Delay表单
    一步步学习微软InfoPath2010和SP2010--第三章节--表单设计基础:处理InfoPath布局、控件和视图(6)--添加控件到Flight Delay表单
    一步步学习微软InfoPath2010和SP2010--第三章节--表单设计基础:处理InfoPath布局、控件和视图(5)--理解数据绑定的基础
  • 原文地址:https://www.cnblogs.com/wdzhz/p/10431038.html
Copyright © 2011-2022 走看看