Spring-cloud配置中心

Spring Cloud Config

概念

Config Server(配置服务器):负责从各种后端存储中拉取配置信息供配置客户端使用

Config Client(配置客户端):应用程序中的一个组件,Config Client通过连接到 Config Server来动态获取配置信息。客户端可以根据条件动态选择对应的配置文件

版本控制集成:Spring Cloud Config 默认使用Git作为配置存储的后端, 这样可以利用Git的版本控制功能来管理配置文件的版本.,每个环境对应一个特定的版本, 可通过切换版本号来自动获取对应环境下的配置

使用

搭建ConfigServer

  1. 添加依赖

    复制代码
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-config-server</artifactId>
    </dependency>
  2. 启用Config Server,在启动类加上@EnableConfigServer注解

  3. 完善配置

    yaml 复制代码
    spring:
      cloud:
        config:
          server:
            git:
              uri:  #配置文件Git 地址
              default-label:  #配置文件分支
              search-paths:   #配置文件所在根目录
  4. 访问规则

    复制代码
    /{application}/{profile}[/{label}]
    /{application}-{profile}.yml
    /{label}/{application}-{profile}.yml
    /{application}-{profile}.properties
    /{label}/{application}-{profile}.properties

    application:微服务名称

    profile当前环境的配置文件,spring.profiles.active属性

    label:git仓库中的分支,默认为master

  5. git上传配置文件命名规则,{application}-{profile}.yml或者{application}-{profile}.properties

搭建ConfigClient

  1. 添加依赖

    SpringCloud会创建一个 Bootstrap Context 作为Spring应用Application Context的父上下文,负责在Spring应用初始化阶段从外部源中加载并解析配置

    复制代码
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
  2. 完善配置,由于是在Spring初始化阶段读取远程仓库的配置,所以ConfigClient的配置文件要放到bootstrap.yml 或 bootstrap.properties

    yaml 复制代码
    spring:
      profiles:
        active: 
      application:
        name: 
      cloud:
        config:
          uri: ConfigServer地址
  3. 获取配置

    java 复制代码
    @Value("${key}")
    String env;
  4. 多配置中心,读取的还是{application}-{profile}配置,根据spring.profiles.active的不同,选择下方不同的配置

    yaml 复制代码
    spring:
      profiles:
        active: prod
      application:
        name: blog-service
    ---
    spring:
      config:
        activate:
          on-profile:
            - dev
      cloud:
        config:
          uri: 
    ---
    spring:
      config:
        activate:
          on-profile:
            - prod
      cloud:
        config:
          uri: 

配置中心自动刷新

SpringCloudConfig没有原生支持动态刷新,需要手动调用接口

  1. 添加依赖

    复制代码
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    spring-boot-starter-actuator是SpringBoot提供的监控和管理工具,允许开发者查看和管理SpringBoot应用的搁置运行时指标和状态。

  2. 添加@RefreshScope

  3. 开启端点

    端点:本质上是服务端或客户端对外提供的 HTTP RESTful 接口 URL,HTTP RESTful是一种设计风格,本质上是通过HTTP 标准方法(Method)来表达增删改查的语义。所以访问/actuator/refresh 要指定为POST请求

    复制代码
    management:
      endpoint:
        shutdown:
          enabled: false #禁用/actuator/shutdown,外部通过此接口直接触发                        JVM停机
      endpoints:
        web:
          exposure:
            include:
              - "*"  #将所有可用的管理端点暴露给 HTTP 协议
  4. 访问/actuator/refresh 接口(POST)请求,动态刷新Spring Cloud Config客户端的配置

添加WebHooks

WebHooks:每次push代码,都会给远程 HTTP URL 发送一个POST请求

Spring Cloud Bus 自动刷新

解决启动多个客户端服务,修改配置时,需要调用每个服务的/actuator/refresh接口,无法实现一次调用,全服务配置刷新的问题

Spring Cloud Bus 核心原理就是利用消息队列做广播,将实例通过消息队列连接起来。当配置更新时,只需要触发一次指令,Spring Cloud Bus就会通过消息队列广播

  1. 添加依赖

    复制代码
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
  2. 添加配置,这里使用RabbitMQ作为消息代理

    复制代码
    spring:
      rabbitmq:
        addresses: amqp://账号:密码@IP:Port/Vhost
  3. 访问/actuator/busrefresh刷新配置

加密解密

对配置文件属性进行加密, 以保护配置文件中的敏感数据不被泄露

对称加密

  1. 下载jar包,用不限长度的 JCE 替换掉Java自带的有限长度的 JCE,放到$JAVA_HOME/jre/lib/security目录下

    https://www.oracle.com/java/technologies/javase-jce8-downloads.html

  2. 添加配置,设置密钥,在Config Server服务中添加bootstrap.yml文件

    yaml 复制代码
    encrypt:
      key: 
  3. 由于使用了bootstrap文件,所以要添加对应的依赖

    复制代码
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
  4. 访问/encrypt/status接口,如果返回{"status":"OK"},表示设置成功

  5. 加密:

    解密:

  6. 在配置文件中添加加密数据的格式是'{cipher}密文',单引号不能省略

非对称加密

  1. 使用keytool生成密钥

    复制代码
    keytool -genkeypair -keystore 密钥库的位置和名称(D:/config-server.keystore) -alias keystore关联的别名 -keyalg 指定密钥生成的算法(RSA) -keypass 密钥库口令 -storepass 密钥口令
  2. 添加配置

    复制代码
    encrypt:
      key-store:
        location: #keystore文件存储路径
        alias:  #密钥别名
        password:  #storepass密钥仓库
        secret:  #keypass 用来保护所生成密钥对中的密钥

Consul

启动命令

复制代码
nohup consul agent -dev -client 0.0.0.0 -ui &
http://IP:8500/

服务注册/服务发现

  1. 添加依赖

    复制代码
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    引入 Consul Discovery 后,Consul Server 默认对注册的客户端进行健康检查。客户端必须引入 spring-boot-starter-actuator 并且暴露/actuator/health 接口

  2. 添加配置

    yaml 复制代码
    spring: 
      application:
        name: 
      cloud:
        consul:
          host: 
          port: 
          discovery:
            service-name:  #可省略,默认为application.name
  3. 在主启动类加上@EnableDiscoveryClient注解

服务配置/刷新

Consul使用的 Key/Value 格式来管理配置信息,Key为文件名, Value 对应整个配置文件

  1. 添加配置

    1. 建立配置文件夹

      config/product-service/:使应用名为product-service,未配置profiles.active

      config/product-service,dev/ 应用名为product-service, 配置profiles.active为dev

      config/product-service,prod/ 应用名为product-service, 配置profiles.active为prod

      默认情况下, 配置的路径前缀是 /config

    2. 添加配置文件

      文件名使用data,内容为key:data的yaml格式

  2. 添加依赖

    复制代码
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-config</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
  3. 读取配置,使用@value注解

    java 复制代码
    @Value("${service-name}")
    public String serviceName;
    @Value("${output.info}")
    String outPutInfo;

动态刷新

Consul原生支持动态刷新配置,在Controller类上面添加@RefreshScope注解开启动态刷新。Consul对配置的检查时间间隔为 1000 ms,通过spring.cloud.consul.config.watch.delay修改。

只针对修改原有配置,不支持新增配置

路径优先级

复制代码
config/product-service,dev/ #对应服务dev环境的配置
config/product-service/     #对应服务默认环境的配置
config/application,dev/     #全局dev环境的配置
config/application/         #全局默认环境的配置

由具体到抽象,Consul会先优先寻找对应服务名的配置,然后再拉取全局配置,对于相同的key,前者会覆盖后者

bootstrap.yml更多配置

复制代码
spring:
  cloud:
    consul:
      host: 127.0.0.1
      port: 8500
      config:
        # 是否启用配置中心,默认值 true 开启
        enabled: true
        # 设置配置的基本文件夹,默认值 config 可以理解为配置文件所在的最外层文件夹
        prefix: config
        # 配置环境分隔符,默认值 "," 和 default-context 配置项搭配
        # 需在 config 文件夹下创建 product-service, product-service-dev, product-service-prod 文件夹即可
        profile-separator: '-'
        # 指定配置格式为 yaml
        format: YAML
        # Consul 的 Key/Values 中的 Key, Value 对应整个配置文件,默认为data,也就是配置文件名
        data-key: productConfig
        # 以上配置可以理解为:加载 config/product-service/ 文件夹下 Key 为 productConfig 的 Value 对应的配置信息
        watch:
          # 是否开启自动刷新,默认值 true 开启
          enabled: true
          # 刷新频率,单位:毫秒,默认值 1000
          delay: 1000

配置持久化

Consul是否开启持久化与启动命令有关

consul agent options

-dev:开发模式, 关闭所有持久化选项, 用于快速开启consul代理

-server:以服务器模式启动 Consul

client:指定HTTP/DNS/gRPC等服务调用的监听地址,默认为127.0.0.1

-ui:启用 Consul 的 Web 用户界面

-bootstrap-expect:n 设置期望加入的服务器节点数, 只有n个节点成功互通后才开始对外服务

-data-dir:指定数据存储目录,会自动创建目录。除开发模式之外,这个参数必须配置

相关推荐
ydd1001008 小时前
寻找两个正序数组的中位数 Java 题解,二分分割详解
java·开发语言
SL-staff10 小时前
JVS数字底座实践:如何复用企业文档能力快速构建知识类应用
低代码·微服务·springcloud·知识管理·权限控制·jvs·elasticsea
真上帝的左手10 小时前
10. 软件设计&架构-Spring Security 7 整合CAS SSO 单点登录
java·spring·架构·sso
Zane199410 小时前
单例线程安全、生产者消费者、死锁:并发面试三连问串讲
java·后端
云烟成雨TD11 小时前
Micrometer 系列【42】链路追踪:Span 体系 | 核心 API
java·链路追踪·micrometer
Gorway11 小时前
理解 Spring 依赖注入:从构造器注入到集合与条件 Bean
java·后端
LiLiYuan.11 小时前
【字符串常量池】
java·开发语言·面试
Sylvia33.11 小时前
从轮询到推送:足球数据API架构演进与火星数据技术拆解
java·服务器·网络·python·websocket·架构
cfm_291412 小时前
高并发系统缓存全解
java·缓存