springcloud系列学习笔记目录参见博主专栏 spring boot 2.X/spring cloud Greenwich。
由于是一系列文章,所以后面的文章可能会使用到前面文章的项目。文章所有代码都已上传GitHub:https://github.com/liubenlong/springcloudGreenwichDemo
本系列环境:Java11;springboot 2.1.1.RELEASE;springcloud Greenwich.RELEASE;MySQL 8.0.5;
Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持,使用Config Server,您可以在所有环境中管理应用程序的外部属性。
目前也有一些开源的配置中心,比如百度的disconf,阿里的diamand。本文介绍springcloud官方的配置中心springcloud config。
spring cloud config 配置变化通知:依赖git每次push后,触发webhook回调,最终触发spring cloud bus(消息总线),然后由消息总线通知相关的应用。
spring cloud config包括两部分:
第一步,引入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-config-serverartifactId>
dependency>
第二步,在application.yml中添加配置:
server:
port: 8087
# 服务与服务之间相互调用一般都是根据这个name 。
spring:
application:
name: springcloud-config-server
cloud:
config:
server:
git:
#git仓库的地址
uri: https://github.com/liubenlong/springcloudGreenwichDemo.git
# 配置仓库路径,这里是文件夹搜索路径
searchPaths: mySpringCloudConfig
# git仓库的用户名和密码,如果是public仓库,可以不写
username: ***
password: ***
# 指定分支,不指定默认是master
default-label: master
在远程git仓库https://github.com/liubenlong/springcloudGreenwichDemo.git
中存在一个文件夹mySpringCloudConfig
,在该文件夹中编写了两个配置文件
http请求地址和资源文件映射如下:
springcloud-config-client-dev.properties
文件内容name=zhangsan
;
springcloud-config-client-prod.properties
文件内容name=lisi
;
启动类中需要启用springcloud config:
@SpringBootApplication
@EnableConfigServer //启用spring cloud config 服务
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
启动服务,在浏览器中访问http://127.0.0.1:8087/springcloud-config-client-dev.properties
会输出name: zhangsan
。
访问http://127.0.0.1:8087/springcloud-config-client/dev
输出:
springcloud Config server的原理是下载到本地缓存,读者可以断网测试一下。控制台的输出也可以验证这一点:
o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/HZLIUB~1/AppData/Local/Temp/config-repo-14199679004896969032/mySpringCloudConfig/springcloud-config-client-dev.properties
首先引入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-config-clientartifactId>
dependency>
在application.yml中配置基本信息
server:
port: 8088
# 服务与服务之间相互调用一般都是根据这个name 。
spring:
application:
name: springcloud-config-client
由于很多配置是需要在服务启动前加载的,比如数据库连接。所以我们要使用bootstrap.yml
这个配置,bootstrap配置的优先级高于application
,会在服务启动前加载。bootstrap.yml内容如下
#这里使用的是 bootstrap.yml 这个配置,bootstrap的优先级高于application,很多配置都是要在服务启动前加载,
#所以使用bootstrap
spring:
cloud:
config:
#启动什么环境下的配置
profile: dev
# 配置服务的URL
uri: http://127.0.0.1:8087/
启动类是最基本的
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
编写一个测试类,通过属性注入的方式来加载配置:
@RestController
public class HelloController {
//属性注入
@Value("${name}")
String name;
@RequestMapping(value = "/hi")
public String hi(){
return "hi "+name;
}
}
启动服务,访问http://127.0.0.1:8088/hi
,输出hi zhangsan
;
将bootstrap.yml文件中的spring.cloud.config.profile
改为prod
,访问http://127.0.0.1:8088/hi
,输出hi lisi
。
本节内容了解即可,太麻烦,线上集群肯定不会这样使用。
服务端不需要改动,客户端springcloud-config-client
要进行以下修改:
引入actuator
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
application.yml中添加actuator监控相关的配置:
management:
endpoints:
web:
exposure:
include: refresh,health,info
endpoint:
health:
show-details: always
server: # 指定actuator端口。如果不指定则与系统服务端口一致。建议修改
port: 8888
这里需要注意:1.X 版本的springboot 配置项
management.security.enabled
已经作废了。2.X 版本 需要使用上述配置。
management.server.port
用于指定actuator端口。如果不指定则与系统服务端口一致,建议修改。management.endpoints.web.base-path
用于指定actuator的URL路径。1.X默认是/,2.X默认是/actuator
management.endpoints.web.exposure.include
指定监控项。默认开启了health、info
。我们这里加入了refresh
management.endpoint.health.show-details
用于展示监控项详细信息,默认不展示
在HelloController
上添加注解@RefreshScope
, 用于自动刷新配置。
postman访问http://127.0.0.1:8088/hi
,结果是hi zhangsan
。此时我们修改springcloud-config-client-dev.properties
内容为name=zhangsan55
,发送post请求http://127.0.0.1:8888/actuator/refresh
手动刷新配置:
再次请求http://127.0.0.1:8088/hi
,输出hi zhangsan55
。手动更新成功。
首先,借用spring cloud Greenwich 学习笔记(一)spring cloud eureka ribbon 服务注册与发现介绍的eureka server springcloud-config-server
。
第二,改造springcloud-config-server
项目,集成eureka
pom文件中引入依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
application.yml中配置eureka地址:
eureka:
client:
serviceUrl:
# 指定服务注册中心的地址
defaultZone: http://localhost:8080/eureka/
# 心跳检测检测与续约时间
# 【测试】时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
instance:
lease-renewal-interval-in-seconds: 1 # 每间隔1s,向服务端发送一次心跳,证明自己依然”存活“
lease-expiration-duration-in-seconds: 2 #告诉服务端,如果我2s之内没有给你发心跳,就代表我“死”了,将我踢出掉。
启动类中添加注解@EnableEurekaClient
第三,改造springcloud-config-client
项目,集成eureka
引入pom
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
修改bootstrap.yml
属性配置,注意是bootstrap.yml
,主要添加spring.cloud.config.discovery
和eureka
相关配置:
#这里使用的是 bootstrap.yml 这个配置,bootstrap的优先级高于application,很多配置都是要在服务启动前加载,
#所以使用bootstrap
spring:
cloud:
config:
#启动什么环境下的配置
profile: dev
label: master
# 配置服务的URL【如果使用eureka,则不再写URL,使用下面的discovery的形式】
# uri: http://127.0.0.1:8087/
discovery:
enabled: true
service-id: springcloud-config-server # 指定配置中心的服务名称
eureka:
client:
serviceUrl:
# 指定服务注册中心的地址
defaultZone: http://localhost:8080/eureka/
注意,上面已经不再写IP端口了,discovery.service-id
写的是服务名
。
注:如果在启动客户端服务时,使用的是8888()这个端口,则将management.server.port去掉即可。具体原因待分析。
其他不变,依次启动springcloud-eureka-server
, 2个springcloud-config-server
(一个端口8087,一个8089), springcloud-config-client
。
在启动springcloud-config-client
这个服务时,通过控制台输出,可以看到eureka生效了,因为我们并没有明确指定访问哪个端口,而是指定的服务名称。
访问http://127.0.0.1:8088/hi
,返回结果hi zhangsan55
。
测试eureka服务:上面启动了两个端口,读者可以自行测试一下关闭其中一个,稍等片刻,等待http://127.0.0.1:8080/
eureka控制台中已经移除时效服务以后,重新启动springcloud-config-client
服务,观察控制台输出,会发现服务可用,端口使用的是可用的那个服务。(笔者已经测试成功,这里请读者亲自测试吧)
注:这里需要对eureka进行配置,暂时将自我保护模式关闭。具体请参考 spring cloud Greenwich 学习笔记(一)spring cloud eureka ribbon 服务注册与发现 中的自我保护机制一节。
请参考笔者文章 spring cloud Greenwich 学习笔记(五)spring cloudconfig + spring cloud bus实现全自动刷新集群配置
springcloud系列学习笔记目录参见博主专栏 spring boot 2.X/spring cloud Greenwich。
由于是一系列文章,所以后面的文章可能会使用到前面文章的项目。文章所有代码都已上传GitHub:https://github.com/liubenlong/springcloudGreenwichDemo
本系列环境:Java11;springboot 2.1.1.RELEASE;springcloud Greenwich.RELEASE;MySQL 8.0.5;