Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。
一, Git环境搭建
SpringCloud Config的使用主要是通过Git/SVN方式做一个配置中心。
所以在进行配置之前,我们应该先搭建一个git环境,并建立一个用于学习SpringCloud的仓库。将application.yml配置文件放入仓库。
spring:
profiles:
active: dev
---
spring:
profiles: dev
application:
name: springcloud-config-dev
---
spring:
profiles: test
application:
name: springcloud-config-test
二,服务端连接Git配置
导入依赖
<dependencies>
<!--config-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-config-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<!--actuator完善监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
配置application.yml
server:
port: 3344
spring:
application:
name: springcloud-config-server
# 连接远程仓库
cloud:
config:
server:
git:
uri: https://gitee.com/petrichot/springcloud-config.git # 通过 config-server可以连接到git,访问其中的资源以及配置~
注意配置文件的内容格式一定义要标准,不然会报错
这个uri是我的代码的克隆地址
配置主配置文件
@SpringBootApplication
@EnableConfigServer //
public class Config_Server_3344 {
public static void main(String[] args) {
SpringApplication.run(Config_Server_3344.class,args);
}
}
访问 http://localhost:3344/application-dev.yml
三,客户端连接服务端访问远程
首选准备一个客户端配置文件并推到Gitee/Github上
spring:
profiles:
active: dev
---
server:
port: 8201
spring:
profiles: dev
application:
name: springcloud-provide-dept
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
---
server:
port: 8202
spring:
profiles: test
application:
name: springcloud-provide-dept
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
新建模块springcloud-config-client-3355
导入依赖
<dependencies>
<!--config-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-config-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<!--actuator完善监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
启动config服务端,确保服务端已脸上Git
配置bootstrap.yml
# 系统级别的配置
spring:
cloud:
config:
name: config-client # 需要从git上读取的资源名称,不要后缀
profile: dev
label: master
uri: http://localhost:3344 # 客户端请求服务端
之所以要用bootstrap.yml,是因为启动SpringBoot项目时,会优先读取bootstrap.yml里的配置,然后才会读取application.yml。
再配置application.yml
# 用户级别的配置
spring:
application:
name: springcloud-config-client-3355
创建一个controller用于查询当前配置
@RestController
public class ConfigClientController {
@Value("${spring.application.name}")
private String applicationName;
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServer;
@Value("${server.port}")
private String port;
@RequestMapping("/config")
public String getConfig(){
return "applicationName:"+applicationName +
"eurekaServer:"+eurekaServer +
"port:"+port;
}
}
创建主配置类
@SpringBootApplication
public class ConfigClient_3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClient_3355.class,args);
}
}
启动config客户端,会发现当我们在bootstrap中配置了profiles: dev时,该服务的端口是8201
将profiles配置为test时,该服务的端口是8202
项目启动的时候会优先读取bootstrap.yml,按照配置的内容去配置中心(config)服务端)拉取配置文件
四,远程配置实战测试
在实际的开发中,为了便于统一管理配置文件,我们可以将各服务的配置文件放在Git上,再像前文中所提到的那样按照配置的内容去配置中心(config)服务端)拉取配置文件。
在Gitee/Github中存放eureka注册中心以及提供者服务的配置文件
config-dept.yml
spring:
profiles:
active: dev
---
server:
port: 8001
#mybatis的配置
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
type-aliases-package: com.seinonana.springcloud.pojo
mapper-locations: classpath:mybatis/mapper/**/*.xml
#spring的相关配置
spring:
profiles: dev
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 数据源
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动
url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC #数据库名称
username: root
password: 4560
dbcp2:
min-idle: 5 #数据库连接池的最小维持连接数
initial-size: 5 #初始化连接数
max-total: 5 #最大连接数
max-wait-millis: 200 #等待连接获取的最大超时时间
#eureka配置
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: springcloud-provider-dept8001 # 重点,和client平级
prefer-ip-address: true # true访问路径可以显示IP地址
#info配置
info:
app.name: kuang-springcloud
company.name: www.kuangstudy.com
build.artifactId: ${project.artifactId}
build.version: ${project.version}
---
server:
port: 8001
#mybatis的配置
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
type-aliases-package: com.seinonana.springcloud.pojo
mapper-locations: classpath:mybatis/mapper/**/*.xml
#spring的相关配置
spring:
profiles: test
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 数据源
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动
url: jdbc:mysql://localhost:3306/db02?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC #数据库名称
username: root
password: 4560
dbcp2:
min-idle: 5 #数据库连接池的最小维持连接数
initial-size: 5 #初始化连接数
max-total: 5 #最大连接数
max-wait-millis: 200 #等待连接获取的最大超时时间
#eureka配置
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: springcloud-provider-dept8001 # 重点,和client平级
prefer-ip-address: true # true访问路径可以显示IP地址
#info配置
info:
app.name: kuang-springcloud
company.name: www.kuangstudy.com
build.artifactId: ${project.artifactId}
build.version: ${project.version}
config-eureka.yml
spring:
profiles:
active: dev
---
server:
port: 7001
spring:
profiles: dev
application:
name: spring-config-eureka
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false # 是否将自己注册到Eureka服务器中,本身是服务器,无需注册
fetch-registry: false # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
---
server:
port: 7001
spring:
profiles: test
application:
name: spring-config-eureka
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false # 是否将自己注册到Eureka服务器中,本身是服务器,无需注册
fetch-registry: false # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
按顺序启动配置中心服务端,客户端,eureka注册中心,提供者服务
打开http://localhost:7001/确保注册中心已经成功打开
访问http://localhost:8001/dept/list
注意,我们如果修改了Git上的配置文件,就应该重新启动该服务,尽管我们直接从配置中心3344端口能够查看到新的配置。但是服务是一启动的时候就在bootstrap.yml配置的配置中心地址去拿到配置的,是固定的。