文章目录
1. Spring Config分布式配置中心
微服务架构意味着将会产生越来越多的单体服务,每个业务模块都被拆成了一个微服务模块,每个微服务模块中,都有各自的配置文件,随着模块的增多,配置文件越来越多,因此,需要有一个集中式的、动态配置的管理来解决这个问题。于是Spring Cloud提供了Config类解决这个问题,它为微服务中的模块提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供一个中心化的外部配置。
微服务面临的问题
可以看到,每个微服务都需要一个配置文件,并且,如果有几个微服务都需要连接数据库
那么就需要配4次数据库相关配置,并且当数据库发生改动,那么需要同时修改4个微服务的配置文件才可以
所以有了springconfig配置中心
(1)Spring Cloud Config分为服务端和客户端两部分。
服务端称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
客户端通过指定配置中心来管理应用资源以及与业务相关的配置内容,在启动的时候,从配置中心(服务端Config)读取加载配置信息,配置服务器默认采用git来存储配置信息,有助于对环境配置进行版本管理,可以通过git客户端工具方便管理和访问配置内容。
(2)Config的功能:
- 集中管理配置文件
- 不同环境可以使用不同的配置,动态配置更新
- 运行期间,动态调整配置,不再需要在每个服务部署的机器上修改配置文件,服务回向配置中心统一拉取配置信息
- 当配置发生变化,服务不需要重启即可感知到配置的变化,并应用新的配置
- 将配置信息以REST接口形式暴露
官方文档:https://cloud.spring.io/spring-cloud-config/reference/html/
2.Config服务端和客户端配置与测试
2.1 创建Config服务端3344(分布式配置中心)
3344就是Config Server,它是微服务的配置中心,是连接外部支持(git)和内层各个微服务的通道,当外部配置变化时,3344可以同步更新,同时各个微服务客户端可以从配置中心Config Server中获取修改的更新值。
1.使用github作为配置中心的仓库
2. 新建config服务端模块3344
(1)pom.xml的主要依赖
添加cloud-config-center-3344模块,修改pom.xml,添加spring-cloud-config-server坐标。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId><!--Config服务端--->
</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.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
(2)3344yaml配置文件
server:
port: 3344 #端口号
spring:
application:
name: cloud-config-center #注册进Eureka 服务器的微服务名
cloud:
config:
server:
git:
uri: https://github.com/yaxiy/springcloud-config.git #GitHub远程仓库地址
# 搜索目录
search-paths:
- springcloud-config
#读取分支
label: master
#服务注册到eureka
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
(3)主启动类
使用注解**@EnableConfigServer
**激活Config配置中心。
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigCenterMain3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigCenterMain3344 .class,args);
}
}
(4)Windows修改hosts文件,重命名IP地址(之后直接用localhost:3344访问即可)
(5)测试Config服务端配置中心
测试,3344是否可以从github上获取配置
启动3344 (要先启动eureka7001和7002),再启动3344
这里注意之前的github上的库一定要设置成public,否则私有的访问不了
它实际上就是,读取到配置文件application.yml中的GitHub的地址,然后拼接上/master/config-dev.yml
3. 配置文件的请求地址规则(3种方式)
(1)方式1:IP地址(主机地址):端口号/label标签(master/dev…自定义)/application(config,可以自定义)-profile(文件名dev…,自定义)
(2)方式2:就是省略了label标签,因为yaml文件中已配置了,所以yaml文件配置label标签后,请求路径中可以写也可以不写
这里默认会读取master分支,因为我们配置文件中配置了
(3)方式3:就是和方式1逆序,同时省略-
注意,这个方式读取到的配置是json格式的
所有规则:
2.2 创建Config客户端3355(配置中心的客户端)
该微服端可以从配置中心3344获取更新值(当配置修改时需要同步更新)
2.1 创建config客户端微服务项目
新建cloud-config-client-3355模块,修改pom.xml,添加spring-cloud-starter-confi
g坐标。
(1)3355 微服务Config客户端pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</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.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(2)yaml配置文件
注意这个配置文件就不是application.ym 而是bootstrap.yml
这个配置文件的作用是,先到3344Config配置中心加载配置,然后加载到自己的application.yml中
(3)主启动类
微服务客户端不需要加注解@EnableConfigServer
(4)controller类
就是上面提到的,以rest风格将配置对外暴露
如果客户端运行正常,就会读取到github上配置文件的,config.info下的配置
(5)测试
启动3344,3355
访问3355的 /configInfo
这个结果就是通过3344服务端配置中心间接从git仓库获取的
(6)客户端产生的问题
上面3355确实获取到了配置文件,但是如果此时配置文件修改了,3355是获取不到的
3344可以实时获取到最新配置文件,
但是3355却获取不到,除非重启服务
2.3 实现动态刷新(3355不需要重启服务)
1,修改3355,添加一个pom依赖:
2. 3355的bootstrap.yml配置中添加监控
3,修改controller,添加注解@RefreshScope刷新
4,此时重启服务
此时3355客户端还不可以动态获取
因为此时,还需要外部发送post请求通知3355
curl -X POST "http://localhost:3355/actuator/refresh
此时在刷新3355,发现可以获取到最新的配置文件了,这就实现了动态获取配置文件,因为3355并没有重启
具体流程就是:
我们启动好服务后
运维人员,修改了配置文件,然后发送一个post请求通知3355
3355就可以获取最新配置文件
问题:
如果有多个客户端怎么办(3355,3356,3357…)
虽然可以使用shell脚本,循环刷新
但是,可不可以使用广播,一次通知??
这些springconfig做不到,需要使用springcloud Bus消息总线