返回介绍

Spring Cloud(八)高可用的分布式配置中心 Spring Cloud Config

发布于 2025-02-18 23:57:58 字数 6872 浏览 0 评论 0 收藏 0

在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在 Spring Cloud 中,有分布式配置中心组件 spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程 Git 仓库中。在 spring cloud config 组件中,分两个角色,一是 config server ,二是 config client ,业界也有些知名的同类开源产品,比如百度的 disconf

相比较同类产品, SpringCloudConfig 最大的优势是和 Spring 无缝集成,支持 Spring 里面 EnvironmentPropertySource 的接口,对于已有的 Spring 应用程序的迁移成本非常低,在配置获取的接口上是完全一致,结合 SpringBoot 可使你的项目有更加统一的标准(包括依赖版本和约束规范),避免了应为集成不同开软件源造成的依赖版本冲突。

Spring Cloud Config 简介

SpringCloudConfig 就是我们通常意义上的配置中心,把应用原本放在本地文件的配置抽取出来放在中心服务器,从而能够提供更好的管理、发布能力。 SpringCloudConfig 分服务端和客户端,服务端负责将 git svn 中存储的配置文件发布成 REST 接口,客户端可以从服务端 REST 接口获取配置。但客户端并不能主动感知到配置的变化,从而主动去获取新的配置,这需要每个客户端通过 POST 方法触发各自的 /refresh

SpringCloudBus 通过一个轻量级消息代理连接分布式系统的节点。这可以用于广播状态更改(如配置更改)或其他管理指令。 SpringCloudBus 提供了通过 POST 方法访问的 endpoint/bus/refresh ,这个接口通常由 git 的钩子功能调用,用以通知各个 SpringCloudConfig 的客户端去服务端更新配置。

注意:这是工作的流程图,实际的部署中 SpringCloudBus 并不是一个独立存在的服务,这里单列出来是为了能清晰的显示出工作流程。

下图是 SpringCloudConfig 结合 SpringCloudBus 实现分布式配置的工作流

SpringCloudConfig 结合 SpringCloudBus 实现分布式配置的工作流

服务端配置

Config Server

新建项目 spring-cloud-config-server

添加依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-config-server</artifactId>
</dependency>

开启服务注册

在程序的启动类 ConfigServerApplication 通过 @EnableConfigServer 开启 SpringCloudConfig 服务端

package io.ymq.example.config.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

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

添加配置

配置文件 application.properties

spring.application.name=config-server
server.port=8888
spring.cloud.config.label=master
spring.cloud.config.server.git.uri=https://github.com/souyunku/spring-cloud-config.git
spring.cloud.config.server.git.search-paths=spring-cloud-config

#spring.cloud.config.server.git.username=your username
#spring.cloud.config.server.git.password=your password
  • spring.cloud.config.server.git.uri:配置 git 仓库地址
  • spring.cloud.config.server.git.searchPaths:配置仓库路径
  • spring.cloud.config.label:配置仓库的分支
  • spring.cloud.config.server.git.username:访问 git 仓库的用户名
  • spring.cloud.config.server.git.password:访问 git 仓库的用户密码

Git 仓库如果是私有仓库需要填写用户名密码,示例是公开仓库,所以不配置密码。

远程 Git 仓库

spring-cloud-config 文件夹下有 application-dev.properties , application-test.properties 三个文件,内容依次是: content=hello dev , content=hello test , content=hello pre

远程 Git 仓库

测试服务

启动程序 ConfigApplication

访问 Spring Cloud Config Server 服务:

http://localhost:8888/springCloudConfig/dev/master

{
  "name": "springCloudConfig",
  "profiles": [
    "dev"
  ],
  "label": "master",
  "version": "b6fbc2f77d1ead41d5668450e2601a03195eaf16",
  "state": null,
  "propertySources": [
    {
      "name": "https://github.com/souyunku/spring-cloud-config.git/application-dev.properties",
      "source": {
        "content": "hello dev"
      }
    }
  ]
}

证明配置服务中心可以从远程程序获取配置信息。

http 请求地址和资源文件映射如下:

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

客户端配置

Config Client

新建项目 spring-cloud-config-client

添加依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-config-client</artifactId>
</dependency>

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

开启服务注册

在程序的启动类 ConfigClientApplication 通过 @Value 获取服务端的 content 值的内容

package io.ymq.example.config.client;

@RestController
@SpringBootApplication
public class ConfigClientApplication {

  @Value("${content}")
  String content;

  @RequestMapping("/")
  public String home() {
    return "content:" + content;
  }

  public static void main(String[] args) {
    SpringApplication.run(ConfigClientApplication.class, args);
  }
}

添加配置

配置文件 application.properties

spring.application.name=config-client
server.port=8088

spring.cloud.config.label=master
spring.cloud.config.profile=dev
spring.cloud.config.uri=http://localhost:8888/
  • spring.cloud.config.label 指明远程仓库的分支
  • spring.cloud.config.profile
  • dev 开发环境配置文件
  • test 测试环境
  • pro 正式环境
  • spring.cloud.config.uri= http://localhost:8888/ 指明配置服务中心的网址。

测试服务

启动程序 ConfigClientApplication

访问服务: http://localhost:8088/

访问服务

下一篇,继续 Spring Cloud Config Server 整合 eureka , 等更多特性

源码下载

GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-config

码云:https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-config

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文