首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用Spring Cloud Config统一管理配置,别再到处放配置文件了

1 前言

可配置是一个成熟软件系统应该提供的特性,而配置管理对于大型系统就显得十分重要,特别是对于拥有多个应用的微服务系统。可喜的是,为我们提供了很好的配置管理,如的配置就很强大。对于,就有强大的,在提供了一个在应用之外的配置管理,如文件或仓库,对分布式系统配置管理十分有益。

2 快速体验

服务端就是一个应用,启动、部署都十分简单。

整体的架构如下图所示:

2.1 服务端就是一个Springboot

在中添加依赖如下:

只需要一个就行了,它已经包含了和。

添加主类:

跟普通的应用相比只是多了一个注解而已。

2.2 配置仓库

通过我们会把配置通过版本控制管理起来,一般使用仓库,为简单展示使用本地仓库如下:

配置一下项目的,注意是项目的,而不是在目录里的:

接着就可以启动了。

但仓库里的配置文件没有什么内容,我们加入以下内容并提交(必须要提交,不然无法获取)。

2.3 配置路径匹配

那我们如何获取这些配置呢?可以通过以下读取:

指的是代码分支,如,等。

是应用的名字,在以后客户端读取会用到。

一般用于指定环境,如,,等。

所以,我们可以用以下来获取我们刚添加的配置信息:

访问如下:

最后一个地址的返回结果格式不同,直接返回配置文件内容:

如果我们先建一个分支,并修改为实际年龄,则如下:

可以看到对应的已经变为了,但访问则还是,分支之间不会相互影响。

2.4 远程仓库

本地仓库只是为了简单展示,在实际项目中,一般使用远程仓库,在创建一个新的仓库如下:

特意创建了个的仓库来检测后面的鉴权是否正确。

重新配置仓库的地址如下:

创建一个目录来放置配置,所以配置为。完成配置重启服务器,就可以正常读取远程仓库的配置了。

2.5 多个代码配置仓库

有些时候,我们的配置可能并不只在一个仓库里,而是在各自客户端的代码库中,比如我们有以下三个服务:

(1)服务发现:discovery,代码库pkslow-discovery-service

(2)API网关:gateway,代码库pkslow-gateway-service

(3)订单服务:order,代码库pkslow-order-service

它们各自的配置文件都放在各自的代码库里,那就需要配置多个代码库。我们还多配置一个默认的配置库pkslow-default,如果匹配不到,就会选择默认代码库的配置。具体配置如下:

可以各自定义配置文件所放的目录,不配置默认为根目录。

这里的的配置规则是,支持正则符号。注意只匹配一个结果,如果都满足,只取第一个匹配的仓库。

启动后我们来看看配置结果:

3 客户端使用配置

经过前面的例子我们已经了解到服务端如何从代码库里获取配置,但始终还是要使客户端能获取到对应的配置并产生效果。我们来演示一下。

3.1 项目准备

搭建一个最简单的项目,并加上的支持,添加依赖如下:

添加配置文件:(虽然我们要从服务端读取配置,但有些配置还是必须在客户添加的,如服务端地址),内容如下:

在这里我们配置了客户端的端口、服务端的地址以及客户端应用的名字,这个名字是非常关键的,待会讲解。

添加来暴露以显示读到的配置内容:

接着启动客户端即可,访问结果如下:

这些配置内容并不在客户端,说明可以从服务端获取到配置信息了。

3.2 客户端如何匹配

客户端已经获取到配置信息了,那是否正确呢?客户端又是怎样匹配的呢?其实前面的内容已经提及,主要通过三个信息来匹配:

指的是代码分支。

是应用的名字。

一般用于指定环境。

上个例子客户端名字为;没指定,默认为;没有指定,默认为。

我们在服务端匹配规则为,所以可以匹配名字,但无法匹配,因此读取了默认仓库的配置:

修改一下客户端的配置,配置为如下:

再次获取客户端的配置如下:

可见已经读取到仓库的配置内容了:

在仓库新建代码分支并添加配置,再修改客户端配置如下:

重启后再次访问,正确读取到了新分支的配置:

3.3 客户端配置生效问题

当我们修改配置后,再次访问结果如下:

结果发现,服务端已经生效了,但客户端并没有。这是因为在这种模式下客户端只会在启动的时候读取配置使其生效。如果想要客户端也生效,我们要使用提供的端点才行。

先添加依赖:

配置要保证可以访问,添加如下配置:

指定刷新的范围,在上添加注解如下:

重启应用。操作及效果如下:

3.4 自动更新配置

每次提交代码配置后,都需要手动发一次请求到客户端才能更新配置,显然是不够友好的。提供了功能,可以在触发事件后,发送请求到指定,这样便可以实现自动更新了。

通过功能实现自动更新是一对一的,如果客户端很多(通常是这种场景),就无法这样直接实现。有两个方案:

(1)自己实现一个端口来接受来自的请求,然后再分发到各个服务端。这个方法比较麻烦,不是很推荐。

(2)通过引入来刷新多个客户端。但需要引入,如或。

3.5 在有服务发现时的不同

在微服务架构中,如果配置服务端与客户端都注册在服务发现(如)上时,客户端就无须再配置服务端的地址了,会从服务发现中心获取识别。这与在有的情况下有异曲同工之妙。

代码没什么特别之外,就是把服务端和客户端同时注册到即可。

4 总结

本文通过例子一步步展示如何使用,主要是理解交互过程和匹配规则,其它都是代码细节,参考官方文档即可。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200823A00HR000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券