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的。要改两个都要改
4.如果你想搞个config client端,一定记住除了勾选config client,还要自己添加依赖:spring-cloud-starter-bus-amqp,还有@RefreshScope
5.config server分发规则,按application name分发:
比如我这个master分支里面有两个文件。
这里也相应的注册了client,gateway两个应用,他们都是config client端
config client端写的配置文件:
spring.cloud.config.discovery.service-id=config spring.cloud.config.discovery.enabled=true spring.cloud.config.profile=dev
就三条,也没有指定他们所需要的具体的properties名字,所以他们怎么辨别自己要获取哪一个config server上的properties文件呢?
!!!是通过自己的application name来获取自己对应文件的!
所以一开始我就设置了他们的应用名字和properties文件名字相同,所以能找到。
并且启动的时候你能够找到他有没有找到对应的properties文件。如果找到了的话,会在控制台出现:
b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-configClient'}, BootstrapPropertySource {name='bootstrapProperties-https://github.com/vanNo1/config-repo/gateway-dev.properties'}]
总结:要把application.properties改名为bootstrap.properties,并且最好不要把eureka server的端口改为其他的。git一个分支多个版本的文件,原版和扩展版,不要出现相同的内容。并且git上properties文件名要和自己设置的application name 一样
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 显示的内容会换成不同的格式
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