在微服务系统中,当服务越来越多, 服务的配置修改也会变得繁琐复杂,这时springCloudConfig就为微服务应用提供集中化配置的支持。
一下示例中SpringCloud 版本为最新的2020.0.0,注册中心为eureka。
一、流程分析
config-server服务统一从某处拉取配置文件,其他client服务在spring实例化bean之前从config-server处获取最新的配置文件,如果本地配置文件中已经存在该配置,将读取本地文件的配置。这个过程中虽然client读取了最新的配置文件,但是必须重启才能加载读取的最新配置。
为了解决重启才能读取最新配置的弊端,此时引入spring-boot-starter-actuator
二、config-server
config-server 主要是用来拉取git配置文件,同时config-server也是spring-cloud-bus的服务端
首先是config-server的yml配置
server:
port: 12900
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: http://192.168.2.168/gitlab/spring-config-test.git #配置文件所在仓库
username: allen
password: 123456789
default-label: dev #配置文件分支,不配置默认master
search-paths: resources #配置文件所在根目录
# bus相关配置
bus:
enabled: true
trace:
enabled: true
rabbitmq:
host: 192.168.2.100
port: 5672
username: admin
password: 654321
eureka:
client:
serviceUrl:
defaultZone: http://admin:admin123@192.168.2.252:8000/eureka
registryFetchIntervalSeconds: 5
instance:
prefer-ip-address: true
# actuator相关配置,bus刷新
management:
endpoints:
web:
exposure:
include: bus-refresh
logging:
config: classpath:config/spring-logback.xml
gitlab上yml文件放在resources文件夹下
pom依赖为
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring cloud config 服务端包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- Spring OpenFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Spring Cloud bus依赖 ,若引入bus可忽略 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
启动类加上注解@EnableConfigServer
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
public class GreenWeskitConfigApplication {
public static void main(String[] args) {
SpringApplication.run(GreenWeskitConfigApplication.class, args);
}
}
项目启动后在地址栏输入 http://localhost:12900/green-weskit-assistant/dev
在地址栏输入要看的文件名/分支就可以看到我们在gitlab中的green-weskit-assistant-dev 的文件内容,此时config-server就可以实时读取到gitlab文件中的内容,如果我们修改了git仓库中的内容,此时再次请求也可以看到更新后的内容。
三、config-client(我们正常的服务端)
和一般的springboot项目相比,集成SpringCloudConfig的服务结构上有轻微的差别,此时项目中
项目中bootstrap配置文件。
bootstrap.yml中必须有springCloudConfig的配置和eureka注册信息。
spring:
# 配置中心相关配置
# 使用配置中心
cloud:
bootstrap:
enabled: true # Spring Cloud 版本为2020.0.0时必须有此配置项。之前版本可能不需要,详细可以查看springcloud官网
config:
fail-fast: true
discovery:
enabled: true
service-id: green-weskit-config # 配置中心服务id
name: green-weskit-assistant # 与远程仓库中的配置文件的application和profile保持一致,{application}-{profile}.yml
profile: dev
label: dev # 远程仓库中的分支保持一致
# uri: http://192.168.2.252:12900
eureka:
client:
serviceUrl:
defaultZone: http://admin:admin123@192.168.2.252:8000/eureka
registryFetchIntervalSeconds: 5
instance:
prefer-ip-address: true
pom.xml配置如下:
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- Spring OpenFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- spring cloud config 客户端包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
bootstarp文件在application之前启动,项目一启动第一步就是去拉取git中的配置文件
如果项目中没有application配置文件,此时就会拉取git仓库中的配置文件启动服务。
疑问:如果我们的配置文件中还有application配置文件,且application的配置和git仓库中的配置冲突时会怎样了?
为了解决这个问题,我做了一个实验,将application的server.port修改和仓库中不一样
application.yml如下:
server:
port: 12403
而git仓库里面的配置如下: port=12400
项目启动后结果为
所以两个冲突时,以git仓库中配置优先。
虽然client读取了最新的配置文件,但是必须重启才能加载读取的最新配置,要使项目读到最新的配置
必须post请求:http://localhost:12400/actuator/refresh
四、spring-cloud-bus
上文中,当服务越来越多时,不可能每个服务都去调用一次,这时我们用到了bus
我们可以在config-server服务中集成springcloudbus
配置在上文中已经写出,
此时只要POST调用http://localhost:12900/actuator/busrefresh即可把所有的连到config-server 的客户端刷新
如果调用http://localhost:12900/actuator/busrefresh/green-weskit-assistant 则会只刷新green-weskit-assistant