一定要看的走坑之路!SpringCloud统一配置中心 config Server

先说下client拿config的配置文件的流程!,这个不了解,很容易进坑!

1.如果config client 的配置文件为application.properties的时候

client 启动项目时,直接找自己properties,如果这个时候项目中有引用properties中的属性的时,项目启动就直接报错,因为他根本就不会去config server中找,所以找不到,就启动不了项目!!而且显示fetch
config为localhost:8888说明他没有去config中拿配置文件。所以要把application.properties改名为bootstarp.properties

2.当config client的配置文件为bootstrap.properties的时候

这个时候,client先看自己的properties有没有eureka server的注册地址
1.如果有,就从自己的properties定义的defaultZone中注册到eureka server,并且找到注册在eureka server中的config server,于是就从config server中拿配置文件,拿到了之后再启动项目。
2.如果没有,就访问默认的eureka server地址:http://localhost:8761/eureka。如果eureka server在这上面,那么就找到了,如果不在,那么也找不到config server。

3.当git上一个分支有多个版本的properties的时候,如:client.properties,
client-dev.properties, client-test.properties

这个时候若client指定要拿dev。但是,config server这边则是把client.properties,
client-dev.properties这两个配置文件搞一起,再给client端。因此,假如client.properties,client-dev.properties这俩文件有相同的部分,你改了其中一个,并不会生效,因为他们是搞一起给client的。要改两个都要改

所以:要把application.properties改名为bootstrap.properties,并且最好不要把eureka server的端口改为其他的。git一个分支多个版本的文件,原版和扩展版,不要出现相同的内容。

现在介绍config server和client端的构建。最后面介绍自动刷新

config Server:

1.在创建springboot项目的时候勾选,Eureka client +config Server
2.在github上创建一个仓库,写入一个yml配置文件,或者properties文件
在这里插入图片描述
3.在config server项目的启动类上加注解:
在这里插入图片描述
4.写它的配置文件:

spring:
  application:
    name: config
  cloud:
    config:
      server:
        git:
          uri: https://github.com/vanNo1/config-repo
          username: xxxx
          password: xxxx
#          basedir: 存放从git上拉取下来的配置文件地址,也就是本地git
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
management:
  endpoints:
    web:
      exposure:
        include: "*"

这是要开放/bus-fresh接口,用于实现自动刷新:
在这里插入图片描述
验证:
启动之后在浏览器访问:localhost:8080/client-dev.yml
在这里插入图片描述
规则:/{label}/{name}…{profiles}.yml
name:服务名(client)
profiles:环境(dev)
label(分支)默认为master
yml:这里也可以换成properties ,json 显示的内容会换成不同的格式

config client:

1.加入依赖:

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

2.写配置文件:

  cloud:
    config:
      discovery:
        enabled: true
        service-id: CONFIG
      profile: dev
  spring:
   application:
    name: client

其他的可以全部删掉了,保留这两个即可,这里是config server项目在eureka上注册的application name
在这里插入图片描述

接着把applicationProperties改为:
在这里插入图片描述
要不然启动还是读自己配置文件,而不是去config server那里拿配置中心的文件
3.启动client 项目,其实就已经从config server拿取配置文件了,如果要验证,可以在controller上把配置文件打出来。

坑:

1.如果Eureka server的端口号不是默认的8761,被我改成了如:8762
那么config client 这边会报错,因为它先去eureka server那儿注册自己,然后去config server这边拿配置文件 。现在它自己的配置文件都没有写eureka注册的地址,那么只能访问默认的eureka server port为8761.但结果又被我改了port为8762,那么它当然会报错。 正确的方法:直接把注册配置:defaultZone写在它的配置里面,不要放在配置中心。
2.如果git上有如:client.yml,client-test.yml,client-dev.yml。也就是同时有很多个client版本的yml。假如我client在配置中心用的是dev版本的,但是我更改了dev这个yml,会没有变化。因为,配置中心,它每次加载的是client.yml和client-dev.yml组合起来给client项目用的,所以改了client-dev.yml,你还要改client.yml才行。一般在client.yml里面放主配置。在其他版本里面放扩展的配置

。。。。。。。。。。。。。。。。。。。。。。。

下面实现自动刷新

在这里插入图片描述
以上做的还是无法达到自动刷新,也就是一旦我更改了配置文件,client端还是要重启项目才能刷新配置。
自动刷新原理:
最上面的图已经说了。client一开始启动的时候去拿config server中的文件
但是config server更改了文件却不会通知config server中的信息已经变动了,让他重新获取。所以client项目必须再重启才行。
现在:让config server去实现spring cloud bus,会暴露一个接口,/bus-refresh接口。只要用post访问这个接口,那么config server就会发出信息给MQ然后MQ再给client端,让client重新拿过一份配置文件。而这个/bus-refresh由git发出
。。。。。。。。。。。。。。。。。

实现:

1.在config server中加依赖:

  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

ok了之后,在浏览器访问localhost:15672可以看到rabbitMQ启动。
在client也引入这个依赖,此时会发现rabbitMQ又多了一个queue
在config server 开放bus-refresh接口。:
在这里插入图片描述
如果文件是properties类型:这样写:

management.endpoints.web.exposure.include=*

重启config server 会出现,“Endpoint ID bus-refresh contains invalid characters please migrate to a valid format”,我扎一开始认为没有开放成功。端口,然后查了很多资料发现是spring版本什么冲突。但!!!!!我试了下,并不影响我访问这个接口

下面在client 的controller加注解:
在这里插入图片描述
之后,只要改了git上面的配置文件,再用post访问bus-refresh接口就能做到client项目不重启也可以自动更新配置了:
在这里插入图片描述

访问localhost:8080/actuator/bus-refresh
新版本要加actuator

有关config server的集群:直接多创建几个实例即可,client端自己会均衡访问config server的不同实例

其实在git上配置webhook一直不成功。查了各种方式也没用,甚至在controller中转发一下,再用restTemplate去post请求bus-refresh也不成功。。。后续再搞吧,也希望有大神能提供点方法

发布了56 篇原创文章 · 获赞 1 · 访问量 1509

猜你喜欢

转载自blog.csdn.net/weixin_44841849/article/details/105427514