【Springcloud】(09)Config分布式配置中心
(1)Config分布式配置中心介绍
(1.1)问题发现
微服务意味着要把单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能进行,所以一套集中式、动态的配置管理设施是必不可少的。
SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,一百个配置文件的管理…就很混乱
配置中心还有Alibaba的Nacos,携程的Apollo
(1.2)配置中心是什么
Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置
假如现在有三个子服务连接同一个数据库,每一个服务都要有一个自己的yml配置,这样当数据库的信息修改以后,每个服务的yml也要对应修改一次,这样成本很大。于是我们这部分共通的配置内容抽取出来,放进统一的配置中心里面,这样修改配置中心里的数据库的信息,子服务里就不要再一个个配置了。其他私有的,还是放在yml中让子服务自己管理。
(1.3)配置中心怎么用
服务端也成为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密、解密信息等访问接口
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。
(1.4)配置中心能干嘛
1-集中管理配置文件
2-不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
3-运行期间动态调整配置,服务不需要重启即可感知到配置的变化并应用新的配置
4-把配置信息已rest接口的形式暴露,post、crul访问刷新即可…
(1.5)与GitHub整合配置
由于config默认使用Git来存储配置文件,也可以使用SVN和本地文件,但是更推荐使用Git,而是使用http/https访问的形式
(2)Config配置总控中心搭建
(2.1)用你自己的账号在github上新建一个名为springcloud-config的新仓库
(2.2)由上一步获取刚新建的git地址
HTTPS:https://github.com/AllenSun03/springcloud-config.git(用这个)
SSH:git@github.com:AllenSun03/springcloud-config.git
直接用老师准备好的:git@github.com:zzyybs/springcloud-config.git(https://github:com/zzyybs/springcloud-config:git)
注意:复制是alt+ins,粘贴是shift+ins
(2.3)本地硬盘目录上新建git仓库clone
创建文件夹E:\AllenGit\Springcloud2020,然后右键选择Git Bush Here,如下图所示,然后输入两条命令,可以了。
(2.5)新建Module模块cloud-config-center3344,就是为Cloud的配置中心模块
(2.6)修改POM
<dependencies>
<!--config配置中心server端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</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-netflix-eureka-client</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<!--引入自己定义的API通用包,可以使用Payment支付的Entity-->
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!--devtools-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
(2.7)修改yml
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: https://github.com/AllenSun03/springcloud-config.git #Github上git仓库的名字
#搜索目录
search-paths:
- springcloud-config
#读取分支
label: master
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
(2.8)创建启动类
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigCenterMain3344.class,args);
}
}
(2.9)测试通过Config微服务是否可以从GitHub上获取配置内容
测试地址:http://localhost:3344/master/config-dev.yml
(3)Config客户端配置与测试
(3.1)新建cloud-config-client-3355,并且修改pom
<dependencies>
<!--config配置中心client端-->
<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-netflix-eureka-client</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<!--引入自己定义的API通用包,可以使用Payment支付的Entity-->
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!--devtools-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
(3.2)创建yml文件:bootstrap.yml
application.yml是用户级的资源配置项
bootstrap.yml是系统级的,优先级更高
server:
port: 3355
spring:
application:
name: config-client
cloud:
# config客户端配置
config:
label: master # 分支名称
name: config # 配置文件名称
profile: dev # 读取后缀名称
uri: http://localhost:3344 # 配置中心地址()先让3344拿到,然后3355到3344上去拿
# 服务注册到eureka注册中心
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
(3.3)创建启动类
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3355.class,args);
}
}
(3.4)创建业务类
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo(){
return configInfo;
}
}
(3.5)测试启动
测试地址:http://localhost:3355/configInfo
(3.6)发现问题
当对github上的配置内容进行了修改,那么3344和3355都需要重新启动,才能获取新的版本,分布式配置的动态刷新问题会比较费时费力。
当我们修改github上的版本号时,只需要刷新3344的请求就可以刷新了,但是3355必须要重新启动太可以实现刷新