为什么需要统一配置中心
- 不方便维护
- 配置内容安全与全新
- 更新配置需要重启
看一下统一配置中心的结构图
首先IDEA创建项目,勾选的依赖还是需要eureka-client的,另外还需要config-server。
在config server的依赖中一共有一下几个:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-monitor</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
</dependencies>
因为是远端git,所以我在gitee上创建项目,并在在项目中创建几个配置文件:
order.yml
就是把之前项目本地的配置copy到git上
接着我们到config-server的配置文件中配置:
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://gitee.com/Csea/config-repo
username: {gitee的账号}
password: {gitee的密码}
# basedir: D:\SpringProject\SpringCloud\config\basedir #这个就是会把远端git的配置文件拉下来放在指定的路径
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
因为配置中心是要给其他的服务调用的,所以也是需要去注册中心去注册。
在config-server的启动类上加上,不用说你也能明白,跟注册中心是一个套路
@EnableEurekaClient
@EnableConfigServer
接着启动项目,在浏览器中输入:http://localhost:8080/order-test.yml
你就可以读取到在gitee上的配置文件了,这里我输入order-test并不只是单一的读取这份配置文件,而是他会将order.yml和order-test.yml两个文件进行合并,而且访问是有他自己的一个访问规则的,如图。两种方式皆可,你也可以用order-a.yml进行访问,也是可以成功访问到配置文件滴。
PS:你也可以不是yml后缀,.json或者.properties都是可以的,他会自动帮我们进行转换
之后在实际的生产过程中,可能会有很多的配置文件,这时候就需要有分支了,不然的话一堆配置文件在同一级目录下,看着都很烦,不利于维护。当我们创建了分支之后,需要在项目中访问不同分支的配置文件,我们就需要在配置文件中加入:
cloud:
config:
server:
git:
search-paths: /** #指定搜索根路径下的所有目录,若有多个路径使用逗号隔开
接着,我们来到config-client项目中,同理引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
注册中心的东西我就不说明了,只说关于配置中心的
引入了依赖之后,我们进行配置
spring:
application:
name: order
cloud:
config:
discovery:
enabled: true
service-id: CONFIG # 注册中心的服务名
profile: test # 指定配置文件的环境
配置完成之后,我们创建一个接口,去进行测试访问
启动项目在浏览器中输入:http://localhost:8081/env/print
这时候你会发现获取不到,这是因为我们需要修改配置文件的名称,把application修改为bootstrap,这样在springboot项目启动的时候就会优先启动配置文件了,好了,我们继续访问一下刚才的那个地址
config-server也是一个微服务,让他高可用也是很简单,只需要启动多个服务实例就可以了,直接复制几分配置文件,分配不同的端口即可
启动之后就可以在eureka注册中心看到CONFIG有3个注册了
需要注意的是,8761是eureka的默认端口,比如开设8762,8763等其他端口的时候,在远端git的配置中心上原本是有eureka的配置的,但是因为开设了8762等其他端口,他就配置中心地址,就会去打开localhost:8888默认地址去进行寻找,这样的解决办法就是把配置中心上的eureka注册地址给copy到项目自身的配置文件上去,也就是把远端配置文件的eureka配置放回到项目中去。
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
经过了配置中心的server\client,以及拉去配置文件的操作之后,接下来我们就要通过Spring Cloud Bus来实现配置文件的自动刷新
先来看一下结构图
Spring Cloud Bus会向外提供一个http接口,即图中的/actuator/bus-refresh。我们将这个接口配置到远程的git上,当git上的文件内容发生变动时,就会自动调用/bus-refresh接口。Bus就会通知config-server,config-server会发布更新消息到消息队列中,其他服务订阅到该消息就会信息刷新,从而实现整个微服务进行自动刷新。
在此之前,我们需要安装rabbitMQ,当然其他的消息中间件也是可以的,kafaka,activeMQ。我这里是通过docker去安装的rabbitMq,安装docker的话自行百度吧,如果是win10家庭版就可以参考我之前的文章
启动docker之后,cmd运行命令:docker run -d --hostname my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.7.3-management
3.7.3-management是图形化的版本
安装完成之后可以在浏览器中输入http://localhost:15672进行访问了,默认账号密码都是guest
完成以上操作之后,就可以在项目中引入依赖,server和client都需要引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
当项目启动之后,就可以看到在rabbitMq上已经注册上去了(server和client)
现在我们就要开始实现,修改了远端的配置文件之后实现自动更新
修改远端的配置文件之后,我们打开cmd命令工具输入命令:curl -v -X POST "http://localhost:8080/actuator/bus-refresh
这接口是必须用POST调用的,执行之后就可以刷新一下刚刚写的接口,你会发现你修改的配置内容已经修改过来了,这里我就不再具体放截图了。
当然啦,我们每次这样手动的输入POST命令很不方便!git提供了WebHook来帮助我们,首先在config-server引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-monitor</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
在GitHub仓库里设置WebHook,之前都是以json格式的,但是随着monitor依赖的更新,也改变了配置,这个地方坑了我很久,查了很久的资料。
gitee上的配置如下
配置完毕之后就可以随意的修改远端的配置文件啦~然后刷新client端的接口,就会发现配置已经更新过来了。
我以gitee为例
修改前:
修改后:
当你在远端提交之后来到config-server的rabbitMq的队列中查看,你会发现有数据过来了
与此同时,在config-client的客户端中也会有相应的日志打印
实现的效果图
到此为止就结束了~~当然还有很多坑,比如引入最新的spring-cloud-config-monitor依赖就不会更新配置,这个后面有时间还要看一下怎么处理,也是网上看了一个博主的引入版本,然后试了一下,竟然实现了!
补充:这里配置到git的域名是通过natapp工具镜像本地映射的,大家可以自行去他官网看一下使用说明,也是有免费的可以使用的~
https://natapp.cn/