目标
- spring cloud config
1. spring cloud config
Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,但是后来又发布了 Consul 可以代替配置中心功能,但是 Config 依然适用于 Spring Cloud 项目,通过简单的配置即可实现功能。分客户端、服务端。
spring cloud config服务端
也称分布式配置中心,是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
spring cloud config客户端
是通过指定配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。
默认采用 git,并且可以通过 git 客户端工具来方便管理和访问配置内容。
优点
- 集中管理配置文件
- 不同环境不同配置,动态化的配置更新
- 运行期间,不需要去服务器修改配置文件,服务会想配置中心拉取自己的信息
- 配置信息改变时,不需要重启即可更新配置信息到服务
- 配置信息以 rest 接口暴露
1.1 搭建config server
1.1.1 创建项目
就是一个普通的springboot项目,加入springcloud的管理依赖就好
1.1.2 添加依赖
<!--spring cloud config server依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
1.1.3 启动类
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class,args);
}
}
1.1.4 在gitee创建存放配置信息的仓库并准备配置文件
创建配置文件:
- user-service.yml
- user-service-dev.yml
- user-service.prod.yml
1.1.5 项目配置文件
server.port: 8080
spring:
application:
name: config-server
cloud.config.server.git:
# git仓库的url地址
uri: https://gitee.com/gucj/springcloud-config
# 要读取的git分支名
default-label: master
# 在仓库中的目录
search-paths: config
1.1.6 启动项目并使用restful来测试获取配置信息
配置文件的访问规则:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
http://localhost:8888/user-service.yml
http://localhost:8888/user-service-dev.yml
http://localhost:8888/user-service/dev
http://localhost:8888/user-service/dev/master
http://localhost:8888/master/user-service.yml
http://localhost:8888/master/user-service-prod.yml
1.2 调整user-service项目作为config client
1.2.1 添加依赖
<!-- spring cloud config client的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
1.2.2 添加配置文件bootstrap.yml
spring:
application:
name: user-service
cloud:
config:
uri: http://localhost:8080
label: master
profile: pro
在这里使用bootstrap.yml来配置configserver相关的信息
1.2.3 在项目中读取配置
Spring Cloud Config 读取配置中心内容的方式和读取本地配置文件中的配置是一模一样的。可以通过 @Value 或 @ConfigurationProperties 来获取。
@RestController
public class DemoController {
@Value("${student.name}")
private String name;
@GetMapping("/testconfig")
public String test1(){
return name;
}
}
1.2.4 测试
http://localhost:8090/testconfig
1.3 手动刷新配置
1.3.1 在client添加spring-boot-starter-actuator依赖
<!--
spring-boot-starter-actuator依赖,SpringBoot自带的监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
1.3.2 修改配置文件
# 默认只显示几个接口,加这个来开发所有接口
management.endpoints.web.exposure.include: '*'
# 默认只是显示一个简单的状态信息,指定来显示详情
management.endpoint.health.show-details: always
在需要动态刷新配置的地方加注解:@RefreshScope
1.3.3 测试
- 先启动项目,访问测试接口
- 修改git仓库中的值,提交
- 刷新测试接口查询值是否已经改变
- 使用工具以post方式发送 http://localhost:8090/actuator/refresh 请求
- 再重新刷新测试接口,查看值是否已经被改变
1.4 加密配置
应用中会有很多敏感配置信息比如一些账户名,密码,明文存储是不好的,都需要加密。Spring Cloud Config 提供了统一的加解密方式,方便使用,它依赖于JCE(Java Cryptography Extension)。
1.4.1 安装JCE
jce的安装就是使用下载的jar去覆盖JDK/jre/lib/secrutity目录中的两个jar
https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
1.4.2 在config server中配置秘钥
创建配置文件bootstrap.yml(一定是在bootstrap.yml中配置)
encrypt:
key: 123456
1.4.3 直接访问接口测试
加密测试:
POST http://localhost:8888/encrypt
body:要加密内容
解密测试:
POST http://localhost:8888/decrypt
body:要解密内容
1.4.4 在配置中心配置加密内容
yml 中配置加密内容的格式如下
student:
name: 王五4.0
# 在yml中配置加密内容要使用 '' 包裹内容
password: '{cipher}ad5d0498d6912455e512d8d2d8d069438c3a0f97f2a651ef301919cdf164d24b'
properteis文件中的内容格式如下(不能使用单引号):
# 在properteis中配置加密内容
student.password={cipher}ad5d0498d6912455e512d8d2d8d069438c3a0f97f2a651ef301919cdf164d24b
1.4.5 在客户端中测试
访问接口,查看内容已经是解密之后的内容
1.5 给配置中心设置用户认证
配置中心默认是可以匿名访问的,为了防止配置的外泄,在这里来为config server添加用户认证
1.5.1 在配置中心项目中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
1.5.2 启动config server
默认用户名: user
密码从启动日志中查看
1.5.3 config client连接需要认证的配置中心
使用在url中指定用户名或密码的方式:
spring:
application:
name: user-service
cloud:
config:
# 则url改为
uri: http://user:密码@localhost:8080
label: master
profile: prod
或:
spring:
application:
name: user-service
cloud:
config:
# 则url改为
uri: http://localhost:8080
username: admin
password: 123456
label: master
profile: prod
1.6 客户端使用eureka来使用配置中心
1.6.1 配置中心注册到eureka
添加eureka客户端的依赖
在启动类中添加注解@EnableDiscoveryClient
1.6.2 客户端的bootstrap.yml中的配置
spring:
application.name: user-service
cloud.config:
profile: dev
label: master
discovery:
# 表示使用eureka中的配置中心,而不是自己指定Config server的uri,默认为false
enable: true
# 配置中心的服务名,默认为configserver
service-id: config-server
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/