微服务技术系列教程(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

目录
相关文章
|
12月前
|
人工智能 安全 Nacos
Nacos 3.0:微服务与AI融合的技术新纪元
Nacos 3.0:微服务与AI融合的技术新纪元
501 83
|
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注册中心服务 构建商品
1471 3
|
9月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
10月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
583 1
|
10月前
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
806 0
|
12月前
|
缓存 负载均衡 NoSQL
基于微服务架构的唯品会商品详情接口技术解析
本文介绍了唯品会电商平台商品详情接口的微服务化实现方案,涵盖架构设计、代码示例与性能优化策略。采用FastAPI构建服务,结合Redis缓存、异步处理、Nginx负载均衡等技术,实现高并发、低延迟的接口性能。
|
12月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
1507 0
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
923 6
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
481 1

热门文章

最新文章