手把手教你搭建SpringCloud项目(十四 )集成Config分布式配置中心

简介: 手把手教你搭建SpringCloud项目(十四 )集成Config分布式配置中心

继续更新中,欢迎点赞关注!


为什么会有Spring Cloud Config分布式配置中心?

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式、动态的配置管理设施是必不可少的。我们每个服务都有自己的配置文件,如果有上百个微服务的话就有上百个配置文件,如果要改某一个配置的参数,有可能就需要修改好多个微服务的配置文件,那样岂不是又费时又费力,Spring Cloud提供了ConfigServer配置中心来解决这个问题,实现了一处修改,处处运行。


什么是Spring Cloud Config分布式配置中心?

Spring Cloud Config为微服务架构中的微服务提供了集中化的外部配置支持,配置服务器为各个不同的微服务应用的所有环境提供了中心的化额外部配置。如下图:

Spring Cloud Config分为服务端和客户端两部分,服务端也成为分布式配置中心,他是一个独立的微服务应用,用来连接配置服务器并未客户端提供获取配置信息,加密、解密信息等访问接口。


客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。


Spring Cloud Config都有什么作用?

集中管理配置文件,便于管理

不同的环境不同的配置,动态化的配置更新,分环境比如:dev/test/prod/bata/release

运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统计拉去配置自己的信息。

当配置发生改变时,服务不需要重启即可感知到配置的变化并应用新的配置

将配置信息以Rest接口暴露,post/curi访问刷新即可

Spring Cloud Config入门示例

1、Spring Cloud Config,默认使用并GitHub 作为配置文件存储。除了 git 外,还可以用数据库、svn、本地文件等作为存储。而且使用的是http/https访问的形式。用我们自己的账号(如果没有去github.com去注册一个账号)在GitHub上新建一个名为springcloud-config的Repostitory。


2、在github上新建一个仓库,如下图:


3、复制刚刚新建仓库的git地址

4、在本地新建git仓库



5、打开git的命令行操作(桌面右键选择Git Base Here),进入我们刚刚新建的git仓库的地址然后执行git clone GitHub - wang-so/springcloud-config命令


6、新建开发、生产、测试配置文件,并提交到github上,我这里只新建一个测试文件config-dev.yml进行提交,如下图:

提交成功后我们可以看到github上已经有这个文件了,如下图

7、新建我们的配置中心模块cloud-config-center,端口为3344,跟之前新建的方式一样,新建module(不会的看本系列第一篇文章),下图为当前的项目结构

如果我们新建成功,在总POM.XML文件中modules标签中自动为我们新增了了cloud-config-center。

8、接下我们就先配置,首先我们先配置POM.XML文件。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>mcroservice</artifactId>
        <groupId>com.study.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-config-center</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

9、在resources文件下新建application.yml配置文件,配置如下

server:
  port: 3344
spring:
  application:
     name: cloud-config-center #注册进Eureka服务器的服务名称
  cloud:
     config:
       server:
         git:
           skipSslValidation: true # 跳过ssl认证
           uri: https://github.com/wang-so/springcloud-config.git  #GitHub上复制的项目地址
           search-paths:  #搜索目录
             - springcloud-config
       label: master   #读取分支
#服务注册到​eureka地址
eureka:
  client:
     service-url:
       defaultZone: http://eureka7001.com:7001/eureka

10、新建启动类

package com.buba.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class,args);
    }
}

细心的朋友们应该可以发现,如果我们在Springboot项目中新建多个module子项目后就会出现我们新建的application.yml文件没有变成一个小绿叶,出现这个情况,其实是不影响我们使用的,但是作为一个强迫症,必须让它一致。解决方法如下:


因为我已经添加过了,所以在点击Add出现的列表中没有Spring的选项,平时我们选择Spring。

继续选择,并找到yml文件添加即可。

还有可能出现的坑就是的新建的module子项目和其他的子项目颜色不一样,颜色会稍微有点灰色,造成这个的原因可能是idea忽略了maven模块,可以尝试如下解决方法:菜单file中选择setting,搜索maven,然后选择Ignored Filess,看右边的面板中变灰的maven模块是否处于勾选状态。勾选表示忽略了这个模块的pom文件。取消勾选即可解决。传送门

11、修改hosts文件,增加映射,使本机模拟网址服务配置中心网址,host文件地址C:\Windows\System32\drivers\etc,hosts文件开启了三个配置,分别是Eureka服务注册中心集群和现在配置的服务配置中心:


12、配置中心的server端就已经搭建好了,我们先启动eureka,然后再启动cloud-config-center,先访问http://eureka7001.com:7001/,可以看到配置中心已经注册进行/eureka当中,如下图:

再访问 http://config-3344.com:3344/master/config-dev.yml ,我们可以看到3344微服务可以成功的读取到远端的配置文件。如下图:

这里由于git版本升级以后,我们的主分支由master改为了main,所以我们访问要用main,如果使用maste是访问不到的,yml配置文件中读取分支配置 label使用master和main都可以。


13、到现在我们配置中心服务端从远端Git仓库读取配置文件这一部分已经搭建完成了,接下来就搭建上边的client的客户端。

14、新建我们的配置中心模块cloud-config-client,端口为3355,跟之前新建的方式一样,新建module(不会的看本系列第一篇文章),配置pom.xml文件,主要是新增spring-cloud-starter-config的jar包,如下图:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>mcroservice</artifactId>
        <groupId>com.study.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-config-client</artifactId>
    <dependencies>
    <!--spring-cloud客户端-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    </dependencies>
</project>

15、然后我们新建配置文件bootstrap.yml,这里为什么不用application.yml呢???


application.yml是用户级的资源配置项,而bootstrap.yml是系统级的资源配置项,bootstrap.yml的优先级更高,SpringCloud会创建一个"Bootstrap Context",作为Spring应用的“Application Context"的父上下文。


初始化的时候,“Bootstrap Context"负责从外部源加载配置属性并解析配置,这两个上下文共享一个从外部获取的"Environment”。”Bootstrap“属性有高优先级,默认情况系,它们不会被本地配置覆盖。


"Bootstrap Context"和"Application Context"这两个上下文有不同的约定,所以新增一个bootstrap.yml文件,保证这两个上下文的配置分离。bootstrap.yml配置文件如下:

server:
  port: 3355
spring:
  application:
    name: config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
      uri: http://localhost:3344 #配置中心地址
#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

16、新建启动类和服务类,如下图:

package com.buba.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
public class ConfigClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class,args);
    }
}
package com.buba.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;
    @GetMapping("/config")
    public String getConfigInfo() {
        return configInfo;
    }
}

17、配置中心的搭建就完成了,接下来我们就测试客户端是否能够通过访问配置中心获取配置信息,先启动Eureka服务注册中心、Config服务配置中心后,再启动服务配置中心客户端3355。访问localhost:3355/config。


我们可以获取通过服务端获取到远端的配置文件。如下图:

18、但是现在就有这样的问题,当我们在GitHub上修改配置文件内容,刷新配置中心服务端Server,发现S服务端erver配置中心立刻响应并刷新了配置信息,但是,我们刷新客户端Client,发现没有任何响应,配置信息仍然是原来的配置信息。总不能每次远端修改了配置文件后,客户端都需要重启来进行对配置信息的重新加载对吧,针对这个问题,我们需要使用动态刷新。只需要在客户端Client,加上actuator监控,我们需要在客户端Client的pom文件中加入这个依赖,如下图:

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

19、修改bootstrap.yml配置文件,加入如下配置暴露监控断点:

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

20、在业务类ConfigClientController上添加@RefreshScope注解使客户端服务具有刷新功能,如下图:

@RestController
@RefreshScope
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;
    @GetMapping("/config")
    public String getConfigInfo() {
        return configInfo;
    }
}

21、发送POST请求刷新客户端Client该刷新请求必须发送后,客户端才能获得刷新后的信息,刷新客户端的请求必须是POST请求。如下图:

curl -X POST "http://127.0.0.1:3355/actuator/refresh"

当出现以下信息时说明激活刷新客户端Client成功,再次访问,就可以得到刷新后的配置信息。



我们Spring Cloud Config到这里就学习完毕了,so easy!


但是假设如果我们有多个微服务客户端呢?难道每个微服务都需要执行一次POST请求进行手动刷新吗?我们可以通过广播的方式进行一次通知,处处生效,这里就要下一节要学习的知识消息总线——Spring Cloud Bus。


下一篇文章我们学习Spring Cloud Bus分布式配置中心,持续学习,持续更新,下一节更精彩!欢迎朋友们点赞关注!感谢!

相关文章
|
7月前
|
Java 开发工具 git
实现基于Spring Cloud的配置中心
实现基于Spring Cloud的配置中心
|
5月前
|
Java 开发工具 对象存储
简化配置管理:Spring Cloud Config与Netflix OSS中的动态配置解决方案
简化配置管理:Spring Cloud Config与Netflix OSS中的动态配置解决方案
87 2
|
6月前
|
Cloud Native Java Nacos
Spring Cloud Config、Apollo、Nacos和Archaius对比
这篇文章对比了Spring Cloud Config、Apollo、Nacos和Archaius这四种配置中心的适应场景、优缺点。文中讨论了它们的功能特点,例如Spring Cloud Config的集中化配置管理和动态刷新能力,Apollo的实时配置推送和权限治理,Nacos的服务发现和管理功能,以及Archaius的动态配置更新能力。文章指出选择配置中心应根据项目需求和架构来决定,并提供了一个对比图来帮助读者更直观地理解这些工具的差异。
183 1
Spring Cloud Config、Apollo、Nacos和Archaius对比
|
7月前
|
Java API 开发工具
Spring Boot与Spring Cloud Config的集成
Spring Boot与Spring Cloud Config的集成
|
4月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
9天前
|
缓存 NoSQL 中间件
Redis,分布式缓存演化之路
本文介绍了基于Redis的分布式缓存演化,探讨了分布式锁和缓存一致性问题及其解决方案。首先分析了本地缓存和分布式缓存的区别与优劣,接着深入讲解了分布式远程缓存带来的并发、缓存失效(穿透、雪崩、击穿)等问题及应对策略。文章还详细描述了如何使用Redis实现分布式锁,确保高并发场景下的数据一致性和系统稳定性。最后,通过双写模式和失效模式讨论了缓存一致性问题,并提出了多种解决方案,如引入Canal中间件等。希望这些内容能为读者在设计分布式缓存系统时提供有价值的参考。感谢您的阅读!
88 10
Redis,分布式缓存演化之路
|
6月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
175 2
基于Redis的高可用分布式锁——RedLock
|
2月前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
210 5
|
3月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
101 8
|
3月前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
84 16

热门文章

最新文章