SpringCloud-Config配置中心
分布式架构面临的问题
又是这个重要的环节,在之前的微服务博客中我也写到了分布式架构面临的问题,因为凡是一个技术的出现,肯定是为了解决问题而出现,所以我们有必要去了解这个问题。
微服务意味着要将单体应用中的业务拆分成一个个子服务, 每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。
所以它出现了,
SpringCloud-Config为微服务架构中的微服务提供集中化的外部配置支持,
配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
Config作用
- 集中管理配置文件
- 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
- 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
- 将配置信息以REST接口的形式暴露
实操演练
在GitHub上创建一个新的仓库,请确保它是公开的
把仓库clone下来本地,命令为:git clone 地址
在里面新建一个文件
config-dev.yml
内容为
config:
info: master branch,springcloud-config/config-dev.yml version=1
然后执行下面的命令,一步一步来
代码语言:javascript复制git add.
git commit -m"init config"
git push
你就可以看到GitHub上面已经有内容了。
前戏准备好了之后呢,我们就用Java去读取了。
新建一个新的模块:cloud-config-center-3344
pom.xml
依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.yml
配置文件
说明几点:
cloud-config-git-uri:这里的地址是你GitHub仓库的地址,因为你要直接从上面读取到配置文件,采用HTTPS或者SSH视情况而定。我使用的是HTTPS,去哪找到这个地址呢,简单
代码语言:javascript复制server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: https://github.com/lexinhu/springcloud-config.git #github仓库上面的git地址
##搜索目录
search-paths:
- springcloud-config
#设置默认读取的分支
label: master
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka #注册进eureka
启动类:
代码语言:javascript复制package com.xn2001.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
/**
* @author 乐心湖
* @date 2020/5/29 1:05
**/
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigCenterMain3344.class,args);
}
}
启动7001和3344,访问:http://localhost:3344/master/config-dev.yml
可以看到我们就成功把之前写的内容输出来了。
代码语言:javascript复制config:
info: master branch,springcloud-config/config-dev.yml version=1
帅气的你会发现我们把访问地址中的master去掉也是可以访问到一样的结果的,原因在于我们设置了默认访问的分支就是master。
例如:http://localhost:3344/config-dev.yml
Spring Cloud Config 有它的一套访问规则,我们通过这套规则在浏览器上直接访问就可以。
代码语言:javascript复制/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
{application}
就是应用名称,对应到配置文件上来,就是配置文件的名称部分,例如我上面创建的配置文件。
{profile}
就是配置文件的版本,我们的项目有开发版本、测试环境版本、生产环境版本,对应到配置文件上来就是以 application-{profile}.yml
加以区分,例如application-dev.yml
、application-sit.yml
、application-prod.yml
。
{label}
表示 git 分支,默认是 master 分支,如果项目是以分支做区分也是可以的,那就可以通过不同的 label 来控制访问不同的配置文件了。
那么我们可以访问其他分支的内容吗,为了测试,我们本地建一个dev分支然后push上去GitHub。
代码语言:javascript复制//查看分支
git branch
//新建一个dev分支并切换过去
git checkout -b dev
修改config-dev.yml
内容
config:
info: dev branch,springcloud-config/config-dev.yml version=1
推送
代码语言:javascript复制git add .
git commit -m"init config"
//推送到远程仓库
git push origin dev
重新启动项目,访问:http://localhost:3344/dev/config-dev.yml
接下来我们要去用一个客户端来获取配置文件了。
注意:我们不直接通过客户端去获取GitHub上面的配置,而是有一个中心配置文件比如上面的3344,然后我们使用3355去获取。
新建模块: cloud-config-client-3355
pom.xml
依赖
<dependencies>
<!--不带server了,说明是客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
bootstrap.yml
配置文件
这里需要了解的知识点:
applicaiton.yml
是用户级的资源配置项bootstrap.yml
是系统级的,优先级更加高- SpringClould会创建一个
Bootstrap Context
,作为Spring应用的Application Context
的父上下文。初始化的时候,Bootstrap Context
负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment。 - Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。 Bootstrap context和Application Context有着不同的约定,所以新增了一个
bootstrap.ymI
文件, 保证Bootstrap Context和Application Context配置的分离。 - 要将Client模块下的
application.yml
文件改为bootstrap.yml
,这是很关键的,因为bootstrap.ym
是比application.yml
先加载的。bootstrap.yml
优先级高于application.yml
controller
接口控制层:
目的:读取config.info
,如果能返回内容说明成功
package com.xn2001.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 乐心湖
* @date 2020/5/29 14:41
**/
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo; //要访问的3344上的信息
@GetMapping("/configInfo") //请求地址
public String getConfigInfo(){
return configInfo;
}
}
访问:http://localhost:3355/configInfo
神奇吧。
成功实现了客户端3355访问SpringCloud-Config3344通过GitHub获取配置信息。