微服务技术系列教程(24) - SpringCloud- 分布式配置中心

简介: 微服务技术系列教程(24) - SpringCloud- 分布式配置中心

引言

代码已上传至Github:有兴趣的同学可以下载来看看:https://github.com/ylw-github/SpringCloud-DynamicConfig-Demo

本文目录结构:

l____引言

l____ 1. 常用的分布式配置中心

l____2. SpringCloud Config 原理

l____3. SpringCloud Config 集成

l________3.1 Github创建项目

l________3.2 ConfigServer配置服务器

l________3.3 ConfigClient客户端

l________3.4 测试

l____4. 动态刷新数据

l________4.1 actuator端点刷新数据

l________4.2 SpringCloud Bus实时刷新配置文件

l____总结

1. 常用的分布式配置中心

分布式配置中心的文章,之前也有写过,有兴趣的同学可以参考:《分布式配置中心Apollo安装与详解》

当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,使用分布式配置中心框架可以实现微服务中的所有系统的配置文件的统一管理,而且还可以实现当配置文件发生变化的时候,系统会自动更新获取新的配置。常用的分布式配置中心框架有:

  • Disconf(依赖于zookpeer,百度研发)
  • Zookpeer(保证配置文件信息实时更新 -事件通知)
  • diamond(阿里巴巴研发)
  • Apollo阿波罗(携程研发)
  • Redis
  • xxl-conf

本文主要讲解SpringCloud Config分布式配置中心。

2. SpringCloud Config 原理

先来看看SpringCloud的流程图:

上面主要有几个对象:

  • 用户(提交配置文件信息)
  • Git/SVN(存放持久化配置文件信息)
  • Config Server(获取gti环境上的配置文件信息、Config Client 从它这里获取配置文件信息)
  • Config Client(Client服务,从ConfigServer获取配置文件信息)

用户会提交配置文件到Git/SVN,ConfigServer会定时或者手动去Git/SVN获取最新的持久化配置文件信息,Client会去ConfigServer里获取配置文件信息。

也许大家会问,为什么要这样设计,Client为什么不能直接去Git/SVN获取,还要增加多一个Config Server?

如果Client每次都从远程的Git仓库去取配置信息,那岂不是很耗时间,而且网络也不稳定。所以新增了Config Server,由ConfigServer去获取内容并临时存放着。这样就不存在这些问题了。

现在开始来讲解下SpringCloud Config集成的流程。

3. SpringCloud Config 集成

3.1 Github创建项目

务必记住,因为后面的配置文件命名用到,注意git环境分为几种:

  • dev 开发环境
  • sit 测试环境
  • pre 预发布环境
  • prd 准生产环境

1.登录Github,创建仓库,新建config目录

2.创建配置文件并上传

  • 注意配置文件的命名格式为:{项目名}-{环境}.properties
  • 文件命名如果错误了,将会读取不到,我的文件命名如下,新建了3个环境,分别是dev(开发环境)、sit(测试环境)、prd(准生产环境)

3.2 ConfigServer配置服务器

1.新增ConfigServer项目

2.添加Maven依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    <!-- 管理依赖 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.M7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!--spring-cloud 整合 config-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <!-- SpringBoot整合eureka客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
    <!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

3.application.yml配置

####端口号
server:
  port: 8888
###服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8100/eureka
spring:
  application:
    ####注册中心应用名称
    name: config-server
  cloud:
    config:
      server:
        git:
          ###git环境地址
          uri: https://github.com/ylw-github/SpringCloud-DynamicConfig-Demo.git
          ####搜索目录
          search-paths:
            - config
      ####读取分支
      label: master

4. 启动类添加注解@EnableConfigServer

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

5.验证

浏览器访问:http://localhost:8888/config-client-dev.properties,可以看到config-client-dev.properties的内容:

访问:http://localhost:8888/config-client-sit.properties

成功,说明ConfigServer能从远程仓库获取配置文件信息。

3.3 ConfigClient客户端

1.新增ConfigServer项目

2.添加Maven依赖

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.0.1.RELEASE</version>
</parent>
<!-- 管理依赖 -->
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>Finchley.M7</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
<dependencies>
  <!-- SpringBoot整合Web组件 -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
  </dependency>
  <!-- SpringBoot整合eureka客户端 -->
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  </dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
  <repository>
    <id>spring-milestones</id>
    <name>Spring Milestones</name>
    <url>https://repo.spring.io/libs-milestone</url>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </repository>
</repositories>

3.bootstrap.yml

server:
  port: 8882
spring:
  application:
    ####注册中心应用名称
    name:  config-client
  cloud:
    config:
      ####读取后缀
      profile: dev
      ####读取config-server注册地址
      discovery:
        service-id: config-server
        enabled: true
#####    eureka服务注册地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8100/eureka

4.启动类

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

5.Controller

@RestController
public class IndexController {
    @Value("${user:defalut}")
    private String user;
    @Value("${sex:defalut}")
    private String sex;
    @Value("${blog:defalut}")
    private String blog;
    @RequestMapping("/getUserInfo")
    private String name() {
        return "userName -> " + user + "  sex -> " + sex + "  blog -> " + blog;
    }
}

3.4 测试

1.启动Eureka注册中心项目、ConfigServer项目、ConigClient项目

2.请求ConfigServer:http://localhost:8882/getUserInfo,获取数据成功。

4. 动态刷新数据

在SpringCloud中有手动刷新配置文件和实时刷新配置文件两种方式。

  • 手动方式采用actuator端点刷新数据
  • 实时刷新采用SpringCloud Bus消息总线

4.1 actuator端点刷新数据

1.添加Maven依赖:

<!--暴露各种指标  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

1.Bootstrap.xml新增开启监控断点:

management:
  endpoints:
    web:
      exposure:
        include: "*"

2.添加@RefreshScope注解,当配置更改时,标有@RefreshScope的Bean将得到特殊处理来生效配置。

@RestController
@RefreshScope
public class IndexController {
    @Value("${user:defalut}")
    private String user;
    @Value("${sex:defalut}")
    private String sex;
    @Value("${blog:defalut}")
    private String blog;
    @RequestMapping("/getUserInfo")
    private String name() {
        return "userName -> " + user + "  sex -> " + sex + "  blog -> " + blog;
    }
}

3.使用PostMan ,Post请求手动刷新:http://127.0.0.1:8882/actuator/refresh 启动刷新器 从Config Server读取。返回的是[],可以看出文件没有修改。

4.修改config-client-dev.properties文件

5.使用Postman请求:http://127.0.0.1:8882/actuator/refresh 启动刷新器 从Config Server读取。可以看出三个字段都改变了,返回内容如下:

6.浏览器输入:http://localhost:8888/config-client-dev.properties,可以看到ConfigServer里面的内容也改了。

7.浏览器输入:http://127.0.0.1:8882/getUserInfo,可以看出ConfigClient实时修改:

4.2 SpringCloud Bus实时刷新配置文件

不建议使用,具体的网上百度。

5 总结

代码已上传至Github:有兴趣的同学可以下载来看看:https://github.com/ylw-github/SpringCloud-DynamicConfig-Demo

目录
相关文章
|
10月前
|
机器学习/深度学习 监控 算法
分布式光伏储能系统的优化配置方法(Matlab代码实现)
分布式光伏储能系统的优化配置方法(Matlab代码实现)
520 1
|
11月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1480 3
|
10月前
|
存储 安全 Java
管理 Spring 微服务中的分布式会话
在微服务架构中,管理分布式会话是确保用户体验一致性和系统可扩展性的关键挑战。本文探讨了在 Spring 框架下实现分布式会话管理的多种方法,包括集中式会话存储和客户端会话存储(如 Cookie),并分析了它们的优缺点。同时,文章还涵盖了与分布式会话相关的安全考虑,如数据加密、令牌验证、安全 Cookie 政策以及服务间身份验证。此外,文中强调了分布式会话在提升系统可扩展性、增强可用性、实现数据一致性及优化资源利用方面的显著优势。通过合理选择会话管理策略,结合 Spring 提供的强大工具,开发人员可以在保证系统鲁棒性的同时,提供无缝的用户体验。
218 0
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
454 5
|
9月前
|
编解码 运维 算法
【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
778 12
|
9月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
安全 网络安全 数据库
YashanDB分布式节点间SSL连接配置
本文介绍YashanDB分布式节点间SSL连接配置方法,确保通信安全。需统一为整个集群配置SSL,使用相同根证书签名的服务器证书,否则可能导致连接失败或数据库无法启动。文章详细说明了使用OpenSSL生成根证书、服务器私钥、证书及DH文件的步骤,并指导如何将证书分发至各节点。最后,通过配置数据库参数(如`din_ssl_enable`)并重启集群完成设置。注意,证书过期需重新生成以保障安全性。
|
10月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
589 1
|
10月前
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
817 0

热门文章

最新文章