Spring Cloud Config 实战

本文最后更新于:2020年9月10日 下午

目标

  1. 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>
12345

1.1.3 启动类

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class,args);
    }
}
1234567

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
12345678910111213

1.1.6 启动项目并使用restful来测试获取配置信息

配置文件的访问规则:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
12345

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>
12345

1.2.2 添加配置文件bootstrap.yml

spring:
  application:
    name: user-service
  cloud:
    config:
      uri: http://localhost:8080
      label: master
      profile: pro
12345678

在这里使用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;
    }
}
123456789

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>
1234567

1.3.2 修改配置文件

# 默认只显示几个接口,加这个来开发所有接口
management.endpoints.web.exposure.include: '*'
# 默认只是显示一个简单的状态信息,指定来显示详情
management.endpoint.health.show-details: always
1234

在需要动态刷新配置的地方加注解:@RefreshScope

1.3.3 测试

  1. 先启动项目,访问测试接口
  2. 修改git仓库中的值,提交
  3. 刷新测试接口查询值是否已经改变
  4. 使用工具以post方式发送 http://localhost:8090/actuator/refresh 请求
  5. 再重新刷新测试接口,查看值是否已经被改变

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
12

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'
1234

properteis文件中的内容格式如下(不能使用单引号):

# 在properteis中配置加密内容
student.password={cipher}ad5d0498d6912455e512d8d2d8d069438c3a0f97f2a651ef301919cdf164d24b
12

1.4.5 在客户端中测试

访问接口,查看内容已经是解密之后的内容

1.5 给配置中心设置用户认证

配置中心默认是可以匿名访问的,为了防止配置的外泄,在这里来为config server添加用户认证

1.5.1 在配置中心项目中添加依赖

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-security</artifactId>
</dependency>
1234

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
123456789

或:

spring:
  application:
    name: user-service
  cloud:
    config:
    # 则url改为
      uri: http://localhost:8080
      username: admin
      password: 123456
      label: master
      profile: prod
1234567891011

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/