【SpringCloud】之配置中心(进阶使用)

发布时间:2024年01月07日

??🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的博客专栏《SpringCloud开发之远程消费》。🎯🎯

🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁


前言

? ? ? ? 在上一期的SpringCloud博客分享中我们学习到了SpringCloud中的远程消费是如何去实现的,以及其中的一些关键的知识点。在第一期的博客中我们学习了如何集成nacos的使用,但是只涉及到了其中的服务管理。本期博客带来的是nacos中的配置管理。

一、什么是配置管理

1. 简要概述

?????????在Spring Cloud中,配置管理是指一种机制,通过该机制,可以在分布式系统中集中管理和配置应用程序的配置信息。Spring Cloud提供了多个组件来支持配置管理,其中最核心的组件之一是Spring Cloud Config

????????Spring Cloud Config允许你将应用程序的配置信息集中存储在一个中心化的位置,而不是散落在各个服务中。这个中心化的配置存储可以是Git仓库,也可以是其他后端存储,例如基于文件系统的存储、Vault、Consul等。通过Spring Cloud Config,你可以在需要时动态刷新应用程序的配置,而不需要重新启动应用。

2. 主要特性和概念

????????以下是Spring Cloud Config的主要特性和概念:

Spring Cloud Config的主要特性和概念
特性及概念说明
配置存储库(Configuration Repository)应用程序的配置信息被存储在一个版本控制系统(通常是Git)中的一个特定存储库中。每个微服务都可以有一个或多个配置文件,包括不同的环境配置(如开发、测试、生产)。
配置客户端(Configuration Client)微服务通过Spring Cloud Config客户端访问配置服务器获取其配置信息。这些客户端可以是任何使用Spring框架的Java应用,不仅限于Spring Cloud应用。
配置服务器(Configuration Server)这是Spring Cloud Config的核心组件。配置服务器负责管理和提供应用程序的配置信息。它从配置存储库中获取配置文件,并通过HTTP或其他协议将配置信息提供给配置客户端。
动态刷新(Dynamic Refresh)Spring Cloud Config支持动态刷新配置,即在应用程序运行时更新配置,而无需重启应用。这对于实现配置的热更新和动态调整非常有用。

? ? ? ? ?总之,使用Spring Cloud Config,可以轻松地实现跨多个微服务的配置管理,并确保配置的一致性和集中管理。这对于分布式系统中的微服务架构非常重要,因为它允许在整个系统中轻松管理和修改配置,而无需逐个修改每个服务的配置文件。

3. 使用场景概述

?????????微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大 量的服务。 由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。 Spring Cloud 提供了 ConfigServer来解决这个问题.

????????Spring Cloud Config 为微服务架构中的微服务提供集中化的外部配置支持 , 配置服务器为各个不同微服务应用的所有环境提供了一个 中心化的外部配置
????????pringCloud Config 分为 服务端和客户端 两部分。

图解一

?????????服务端也称为分布式配置中心,他是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密 信息等访问接口。

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

?图解二

?????????一个使用微服务架构的应用系统可能会包括成百上千个微服务,配置各部相同,需求各不相同:

????????不同环境不同配置:例如数据源在不同的环境(开发, 测试 , 生产)是不同的 , 可以通过配置中心 运行期间可以动态调整。例如根据各个微服务的负载状况, 动态调整数据源连接池大小或者熔断阀 值, 并且调整时不停止微服务(配置修改后可以自动更新)

图解三

二、实际使用运用

1. 导入配置中心的依赖

? ? ? ? 我们将依赖导入到主项目的pom文件中,因为后续可能有很多服务需要配置

<!--引入配置中心的依赖-->
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  </dependency>

2. 新建配置

? ? ? ? 我们启动nacos服务,在网页中访问nacos管理网页

`? ? ? ? ?我们对其填写对应的信息

? ? ? ? 最后我们点击发布即可。?

?

? ? ? ? 上述的图片就是我们点击发布弹出的窗口?

3. 代码读取配置文件

3.1 创建bootstrap.yml文件

·? ? ? ? 在生产者的resources的文件目录下创建一个bootstrap.yml文件

?

? ? ? ? ?创建的bootstrap.yml文件执行在application.yml之前的运行,但是我们创建之后但是还是不会生效的,需要我们导入一个依赖,我们放在主项目中。

<!--引入bootstrap.yml-->
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
  </dependency>

?application与Bootstrap的区别

????????SpringBoot默认支持properties和YAML两种格式的配置文件。
????????bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,如可以使 用来配置application.yml中使用到参数等
????????application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用 的公共参数等。
????????bootstrap.yml 先于 application.yml 加载

3.2 将application.yml文件内容复制到Bootstrap.yml文件中

? ? ? ? 将application.yml文件内容复制到Bootstrap.yml文件中

server:
  port: 8080
spring:
  cloud:
    nacos:
      discovery:
        #        标注nacos地址
        server-addr: localhost:8848
  application:
    name: ${spring.application.name}
    server-addr: ${spring.cloud.nacos.discovery.server-addr}
    file-extension: yaml

? ? ? ? ?然后我们新建一个与之对应的配置文件。

4. 访问配置文件

? ? ? ? 当我们启动程序访问配置文件的时候我们默认访问的是provider.yaml文件?,因为哦们新建配置文件的时候是说有一个默认分组,所以文件中需要对应的配置

编写Controller类进行读取

方式一:
package com.yx.provider;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * com.yx.provider
 *
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create 2024/1/7
 */
@RestController
@RequestMapping("/user")
@Slf4j
public class ConfigController {

//        邮箱配置
    @Value("${email.account}")
    private String account;
    @Value("${email.password}")
    private String password;

    @RequestMapping("/test01")
    public String test01(){
        log.info("account:{},password:{}",account,password);
        return "木易";
    }



}

? ? ? ? ?我们直接启动项目进行访问即可?

? ? ? ? ?由上图所示我们的生产者成功的获取配置中心对应的配置内容并且打印输出

方式二:

? ? ? ? ?为了方便我们获取配置内容中的信息,因此我们创建一个类用于获取

?EmailProperties.java
package com.yx.provider.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * com.yx.provider.config
 *
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create 2024/1/7
 *
 */
@Component
@ConfigurationProperties("email")
@Data
public class EmailProperties {

//    定义属性
    private String account;
    private String password;
}

? ? ? ? 我们光写了对应的配置类之后,还要在Controller中去引用它。

?

? ? ? ? ?我们重新启动项目访问该请求方法进行测试

三、公共配置

1. bootstrap.yml文件配置

server:
  port: 8080
spring:
  application:
    name: provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        prefix: ${spring.application.name}
        file-extension: yaml
        group:  DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
        # 共享配置集数组
        shared-configs:
#          - 第一个配置文件
          - data-id: redis.yaml #名称
            group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
            refresh: true # 是否自动刷新配置,默认为 false
#          - 有多个配置文件在后面进行配置

? ? ? ? 根据你配置的信息创建对应的类进行接收

?

?2. controller类引入

?????????在controller类中进行对应的引入使用

3. 测试验证

? ? ? ? 重启项目访问请求方法验证?

四、环境的设置

? ? ? ? 我们的项目开发过程中分别有开发、测试、灰度、生产环境,对应的我们的配置每切换一个环境都要进入对应的配置中去修改,这样麻烦还容易出问题。因此我们在nacos的管理网页中的命名空间去新建我们对应需要的环境。

1. 创建命名空间?

?

2. 将配置文件克隆至指定的空间中

? ? ? ? 在我们的配置列表中选择指定的配置文件,点击克隆选择对应的空间,最后点击开始克隆即可。

3. 对不同的环境进行修改

4. 指定命名空间

? ? ? ? 在我们的Bootstrap.yml的文件中进行配置

? ? ? ? 我们重新启动访问测试?

? ? ? ? 我们将?namespace的值换成测试环境的id,再重新运行测试


?🎉🎉本期的博客分享到此结束🎉🎉

📚📚各位老铁慢慢消化📚📚

🎯🎯下期博客博主会带来新货🎯🎯

🎁三连加关注,阅读不迷路?!🎁

文章来源:https://blog.csdn.net/weixin_74352229/article/details/135437291
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。