在使用springcloud做项目,我们会把原有的各个模块需要拆分成多个服务,服务数据数量多,且很多的配置内容重复,且维护的代价太高比如修改数据库的ip,修改了某个中间件的ip,这就需要修改每个涉及到这个配置的服务,可想而知需要做多少的重复工作,而且手动修改还十分容易出错 使用配置中心就可以让维护人员只修改一个地方(一般是使用git),并主动通知对应的服务,取更新拉取最新的配置,下面我们就来聊聊关于springcloud 配置详解?接下来我们就一起去了解一下吧!
springcloud 配置详解
在使用springcloud做项目,我们会把原有的各个模块需要拆分成多个服务,服务数据数量多,且很多的配置内容重复,且维护的代价太高。比如修改数据库的ip,修改了某个中间件的ip,这就需要修改每个涉及到这个配置的服务,可想而知需要做多少的重复工作,而且手动修改还十分容易出错。 使用配置中心就可以让维护人员只修改一个地方(一般是使用git),并主动通知对应的服务,取更新拉取最新的配置。
1.配置中心架构图2.流程说明各个服务的配置信息,统一集中在git仓库进行管理,并创建一个config-server服务作为"中间人",来处理服务和git之间的关系,消息总线用在动态更新时使用,这里使用rabbitmq。 1.当服务启动时候,会取config-server获取服务所需的配置信息 2.config-server会主动取git仓库拉取最新的配置,并缓存在本地仓库中 3.服务得到最新配置后,也会将配置加载到本地进行缓存,并加载初始化工作,最后启动服务
3.消息总线只要服务没有进行重启,服务会运行期间都是回去的本地配置缓存,若此时修改了git仓库中的配置信息,如何及时通知到对应的服务并更新服务配置呢?这时候消息总线就起到了作用。 配置中心提供了一些动态刷新配置的接口,当我们修改了git配置,调用对应的接口,即可刷新对应服务的配置信息,当然前提是各服务,config-server连接的是同一个rabbitmq地址,因为消息的通知是通过mq队列处理的。
4.配置中心搭建1.创建项目子模块config-server,添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
启动类添加注释 @EnableEurekaClient @EnableConfigServer 主要是配置注册中心eureka客户端,配置中心config-server服务端,还有rabbitmq消息总线
2.配置文件 <1>创建bootstrap.yml文件
server:
port: 8762
spring:
application:
name: config-server
profiles:
active: @spring.active@
cloud:
bus:
enabled: true
trace:
enabled: true
config:
name: spring-admin,rabbitmq
server:
git:
uri: git地址 # 配置git仓库的地址
username: 账号 # git仓库的账号
password: 密码 # git仓库的密码
searchPaths: /*,/*/*,/*/*/*
clone-on-start: true
force-pull: true
repos:
xxx:
pattern: xxx*
uri: git地址
searchPaths: /*,/*/*,/*/*/*
clone-on-start: true
force-pull: true
management:
endpoints:
web:
base-path: /
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
这里配置了两个仓库地址,供两个项目一起使用,如果只要一个项目,删除内层repos节点即可
简单说明下几个节点的含义:
spring.cloud.config.name:表示需要拉取配置文件的前缀,下面会讲到规则 searchPaths:表示需要在git仓库扫描的路径 force-pull:表示强制拉取,可以防止本地文件修改导致更新失败
<2>添加application文件
这里配置了不同环境的配置文件,每个都是配置了rabbitmq的信息,主要是为了消息总线使用
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: xxxx
password: xxxx
1.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
2.客户端服务新建配置文件bootstrap.yml
server:
port: 8060
spring:
application:
name: xxx #服务名称
profiles:
active: @spring.active@
cloud:
bus:
enabled: true
trace:
enabled: true
config:
fail-fast: true
name: xx1,xx2,xx3
enabled: true #开启配置
profile: @spring.active@ #版本
label: master #git配置的分支信息,master类似的
discovery:
enabled: true
service-id: config-server
当然也需要在application.yml文件中配置mq信息和其他自己所需的信息 简单说明下几个节点的含义:
label:拉取git那个分支信息 service-id:配置中心服务名,通过注册中心来管理调用信息
6.加载规则说明git配置文件存在形式,根目录为不同的类型的目录,例如rabbitmq,mysql等,以下为rabbitmq目录下的文件列表
各个微服务加载git上的配置文件,默认加载的文件名规则为:应用名称-环境变量.yml # {spring.application.name}- s p r i n g . a p p l i c a t i o n . n a m e − {spring.cloud.config.profile}-${spring.cloud.config.label} 当然我们也可以自定义应用名称前缀,name包含多个值,用逗号分隔
若profile的值为dev,则加载的配置文件为feign-hystrix-dev.yml,db-dev.yml等 配置客户端每次在启动的时候,会加载服务端的配置文件。
7.动态刷新配置问题1:修改git配置文件,不重启任何应用的情况下,重新加配置文件? 使用postman工具,发送post请求,请求地址为: 1.重新加载所有应用配置信息:http://{config-server-ip}:8762/bus-refresh {config-server-ip}表示服务配置端ip 如果存在多个配置服务端,该刷新方式也会同时刷新其他配置服务端 2.重新加载单个应用的配置信息:http://{config-server-ip}:8762/bus-refresh/{destination} {destination}表示某个客户端应用名称 例如common-invoice-service
问题2:查看此时配置服务端的所加载到的配置文件 Url访问地址: http://config-server的IP地址:8762/{label}/{filename} {label}表示git分支,例如master {filename}表示文件名称,例如feign-hystrix-dev.yml
8.启动顺序首先启动eureka注册中心,其次启动config-server配置中心,最后到各个不同的服务,因为所有的服务都依赖与这两个服务,否则无法正常启动。启动日志看到拉取信息说明成功