springcloud-springcloud之config分布式配置;server,client配置(十五)(代码片段)

MinggeQingchun MinggeQingchun     2023-03-14     154

关键词:

阅读本文前可先参考

​​​​​​SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客

在分布式微服务系统中,几乎所有服务的运行都离不开配置文件的支持,这些配置文件通常由各个服务自行管理,以 properties 或 yml 格式保存在各个微服务的类路径下,如 application.propertiesapplication.yml

1、传统配置方式:

配置信息分散到系统各个角落方式,配置文件或者在代码中;

2、集中式配置中心:

将应用系统中对配置信息的管理作为一个新的应用功能模块,进行集中统一管理,并且提供额外功能;

3、分布式配置中心:

在分布式、微服务架构中,独立的配置中心服务

传统配置方式 将配置文件散落在各个服务中的管理方式,存在以下问题:

1、管理难度大:配置文件散落在各个微服务中,难以管理。

2、安全性低:配置跟随源代码保存在代码库中,容易造成配置泄漏。

3、时效性差:微服务中的配置修改后,必须重启服务,否则无法生效。

4、局限性明显:无法支持动态调整,例如日志开关、功能开关。

为了解决这些问题,通常我们都会使用配置中心对配置进行统一管理。Spring Cloud 开发了自己的分布式配置中心,那就是 Spring Cloud Config。

市面上开源的配置中心

Apollo(阿波罗):携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景;

diamond : 淘宝开源的持久配置中心,支持各种持久信息(比如各种规则,数据库配置等)的发布和订阅;(更新稍微落后一点)

XDiamond:全局配置中心,存储应用的配置项,解决配置混乱分散的问题,名字来源于淘宝的开源项目diamond,前面加上一个字母X以示区别。

Qconf: 奇虎360内部分布式配置管理工具,用来替代传统的配置文件,使得配置信息和程序代码分离,同时配置变化能够实时同步到客户端,而且保证用户高效读取配置,这使的工程师从琐碎的配置修改、代码提交、配置上线流程中解放出来,极大地简化了配置管理工作;

Disconf:百度的分布式配置管理平台,专注于各种分布式系统配置管理的通用组件和通用平台, 提供统一的配置管理服务

一、Spring Cloud Config

Spring Cloud Config 是由 Spring Cloud 团队开发的项目,它可以为微服务架构中各个微服务提供集中化的外部配置支持。

简单来说,Spring Cloud Config 可以将各个微服务的配置文件集中存储在一个外部的存储仓库或系统(例如本地化文件系统, Git 、SVN 等,默认情况下使用 Git )中,对配置的统一管理,以支持各个微服务的运行。

Spring Cloud Config 包含以下两个部分:

1、Config Server:也被称为分布式配置中心,它是一个独立运行的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密信息和解密信息的访问接口。

2、Config Client:指的是微服务架构中的各个微服务,它们通过 Config Server 对配置进行管理,并从 Config Sever 中获取和加载配置信息

Spring Cloud Config Server工作原理

Spring Cloud Config Server 的工作过程如下图所示:

Spring Cloud Config 工作流程如下:

1、首先搭建一个远程 Git 仓库服务器;创建一个项目:springcloud-config,克隆clone到本地

2、Config Server服务端(分布式配置中心)负责连接配置仓库 Git,并对 Config 客户端(微服务A、微服务B)暴露获取配置的接口。

3、Config 客户端通过 Config 服务端暴露出来的接口,拉取配置仓库中的配置。

4、Config 客户端获取到配置信息,以支持服务的运行。

Spring Cloud Config Server特性

1、HTTP,用于外部配置的基于资源的API(名称-值对,或等价的YAML内容)

2、加密和解密属性值(对称或非对称)

3、可以使用@EnableConfigServer轻松嵌入到Spring Boot应用中

4、配置客户端特性(用于Spring应用程序):

5、绑定到Config Server并使用远程属性源初始化Spring Environment

6、加密和解密属性值(对称或非对称)

1、Spring Cloud Config Server服务端

1、在git上创建一个仓库springcloud-config,将其克隆clone到本地Git,创建config-center子文件夹

2、 新建一个springboot Module(springcloud-8-service-config),设置父项目

3、添加 spring-cloud-config-server等 依赖

<!--spring-cloud-config-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
<!--继承统一的父项目-->
    <parent>
        <groupId>com.company</groupId>
        <artifactId>springcloud-demo</artifactId>
        <version>1.0.0</version>
        <!--        <relativePath/> &lt;!&ndash; lookup parent from repository &ndash;&gt;-->
    </parent>

    <groupId>com.company</groupId>
    <artifactId>springcloud-8-service-config</artifactId>
    <version>1.0.0</version>

    <name>springcloud-8-service-config</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

4、application.prperties配置一下git仓库信息,此处我们使用国内码云gitee(可使用GitHub,GitHub站点访问较慢由于网络比较慢,可能连接失败)

server.port=8888

spring.application.name=springcloud-8-service-config

#uri 表示配置中心所在仓库的位置(GitHub站点访问较慢由于网络比较慢,可能连接失败;此处我们使用国内码云gitee()
spring.cloud.config.server.git.uri=https://gitee.com/xx/springcloud-config.git
#search-paths 表示仓库下的子目录
spring.cloud.config.server.git.search-paths=config-center
#GitHub 用户名,密码(如果Git仓库为公开仓库,可以不填写用户名和密码)
spring.cloud.config.server.git.username=xx
spring.cloud.config.server.git.password=xx
# 忽略ssl或者自动填充公钥
spring.cloud.config.server.git.skip-ssl-validation=true

5、在 Spring Boot 的启动类中,添加 @EnableConfigServer 注解,开启spring cloud config配置中心支持

@EnableConfigServer     //开启spring cloud config配置中心支持
@SpringBootApplication
public class Service8ConfigApplication 
    public static void main(String[] args) 
        SpringApplication.run(Service8ConfigApplication.class, args);
    

6、在config-center子文件夹 下创建多个 配置文件 application.prperties,如application-dev.prperties等,分别加一些配置

spring.profiles.active=dev

url=http://www.baidu.com

提交到Git上

7、启动springboot启动类,通过/application/profile/label访问配置文件

http://localhost:8888/master/application-dev.properties

启动程序还会在本机生成一个文件夹,路径如下

/C:/Users/xx/AppData/Local/Temp/config-repo-2778063330865096304/config-center/application.properties

配置文件的映射规则:

1、/application/profile[/label]

http://localhost:8888/application/dev/master

2、/application-profile.properties

http://localhost:8888/application-dev.properties

3、/label/application-profile.properties

http://localhost:8888/master/application-dev.properties

4、/application-profile.yml

http://localhost:8888/application-dev.yml

5、/label/application-profile.yml

http://localhost:8888/master/application-dev.yml

其中:

application 表示配置文件的名字,对应的配置文件即 application,

profile 表示环境,有 dev、test、online 及默认,

label 表示分支,默认我们放在 master 分支上,

通过浏览器上访问

http://localhost:8888/application/dev/master

返回的 JSON 格式的数据:

name 表示配置文件名 application 部分,

profiles 表示环境部分,

label 表示分支,

version 表示 GitHub 上提交时产生的版本号

同时当访问成功后,控制台会打印相关日志信息

2、Spring Cloud Config Client 客户端 

配置中心服务端配好以后,服务提供者、服务消费者等各个微服务(各个微服务都是客户端),都可以从配置中心获取配置信息

1、拷贝之前的一个provider服务提供者项目,改名 (springcloud-8-service-config-provider),设置父项目

2、添加 web,mysql,mybatis,springcloud的common公共服务,springboot自动热部署,spring-cloud-starter-netflix-eureka-client、spring-cloud-starter-config等 依赖,以及处理资源resoureces,java等插件

<!-- spring-cloud-starter-config 客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
<!--继承统一的父项目-->
    <parent>
        <groupId>com.company</groupId>
        <artifactId>springcloud-demo</artifactId>
        <version>1.0.0</version>
<!--        <relativePath/> &lt;!&ndash; lookup parent from repository &ndash;&gt;-->
    </parent>

    <groupId>com.company</groupId>
    <artifactId>springcloud-8-service-config-provider</artifactId>
    <version>1.0.0</version>

    <name>springcloud-8-service-config-provider</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--spring web 起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- MySQL的jdbc驱动包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--mybatis起步依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <!--依赖统一的springcloud-service-commons项目-->
        <dependency>
            <groupId>com.company</groupId>
            <artifactId>springcloud-2-service-common</artifactId>
            <version>1.0.0</version>
        </dependency>

        <!-- springboot 开发自动热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

        <!--spring-cloud-starter-netflix-eureka-client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!-- spring-cloud-starter-config 客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

    </dependencies>

    <build>

        <!--处理资源目录-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>
        </resources>

        <plugins>

            <!--spring boot提供的编译、打包的Maven插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

3、创建 bootstrap.properties 或者 bootstrap.yml 文件,用于获取配置信息

Spring Cloud有一个“引导上下文"的概念,这是主应用程序的父上下文。引导上下文负责从配置服务器加载配置属性,以及解密外部配置文件中的属性。

bootstrap.properties中定义的文件信息会先于application.properties中的信息加载 和主应用程序加载application.(yml或 properties)中的属性不同,引导上下文加载(bootstrap.)中的属性。

配置在 bootstrap.*中的属性有更高的优先级,因此默认情况下它们不能被本地配置覆盖

#使用spring-cloud-config配置中心
#name 对应配置文件中的 application
#profile 对应 profile
#label 对应 label
#uri 表示配置中心的地址
spring.application.name=application
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:8888/

4、在 本地 Git仓库 spring-cloud 下的 子文件config-center 新建 provider 子文件夹,并将springcloud-8-service-config-provider 下的 application.properties文件复制过来,并删除本地项目的application.properties文件(或者清空),并将其上传到Git远程仓库

5、启动eureka 服务注册中心, 再启动 springcloud-8-service-config 配置中心服务端,启动springcloud-8-service-config-provider 访问项目不报错即可,浏览器也可查看

springcloud-springcloud之config分布式配置;config注册至eureka;集成security安全认证(十七)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125337347https://blog.csdn.net/MinggeQingchun/arti 查看详情

springcloud-springcloud之config分布式配置;加解密;配置信息局部刷新;springcloudbus+rabbitmq全局刷新(十六)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125337347一、加解密在Git仓库中明文存储配置信息值,对于某些敏感... 查看详情

springcloud-springcloud之sleuth分布式链路跟踪;zipkin埋点数据;elasticsearch数据持久化(十八)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、SpringCloudSleuth微服务有几种监控方式,如SpringBootActuator监控微服务,SpringBootAdmin监控微服务,Hy... 查看详情

springcloud-springcloud之security服务安全机制(二十)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客SpringSecurity微服务的Rest服务都是基于http请求的,因此很有可能暴露在公网上,任何人都可能调用访问&#... 查看详情

springcloud-springcloud之gateway网关(十三)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、API网关引自百度百科API网关,软件术语,两个相互独立的局域网之间通过路由器进行通信,中... 查看详情

springcloud-springcloud之zuul和gateway网关(十四)(代码片段)

SpringCloudGateway是SpringCloud的一个子项目。而zuul则是Netflix公司的项目,只是Spring将zuul集成在SpringCloud中使用而已。因为zuul2.0连续跳票和zuul1的性能表现不是很理想,所以催生了spring团队开发了Gateway项目ZuulZuul是netflix公司的... 查看详情

springcloud-springcloud之config分布式配置;server,client配置(十五)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客在分布式微服务系统中,几乎所有服务的运行都离不开配置文件的支持,这些配置文件通常由各个服务... 查看详情

springcloud-springcloud之apolloconfig携程阿波罗配置中心(二十一)(代码片段)

由于SpringCloud自带的Config需要配合Bus使用,且不能实时刷新,因此市面上出现了很多开元的配置中心市面上开源的配置中心Apollo(阿波罗):携程框架部门研发的分布式配置中心,能够集中化管理应用不同... 查看详情

springcloud-springcloud根/父项目,开发准备(代码片段)

一、SpringCloud开发项目工程说明在后续的SpringCloud工程项目开发,以及博文中,都要注意此文说明!1、SpringCloud本身并不是一个拿来即可用的框架,它是一套微服务规范,共有两代实现。(1)SpringCloudNet... 查看详情

springcloud-springcloudalibaba之gateway集成sentinel(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud之Gateway网关(十三)_MinggeQingchun的博客-CSDN博客_spring.cloud.gateway.routes[0]SpringCloud-SpringCloudAlibaba之Sentinel规则持久化(十)_MinggeQingchun的博客-CSDN 查看详情

springcloud-springcloudnetflix之ribbon(代码片段)

阅读本文前可先参考 SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客SpringCloudRibbon是一套基于NetflixRibbon实现的客户端负载均衡和服务调用工具Ribbon是Netflix公司发布的开源组件,其主要功... 查看详情

springcloud-springcloudnetflix之hystrixdashboard仪表盘监控(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125308948https://blog.csdn.net/MinggeQingchun/article/de 查看详情

springcloud-springcloudnetflix之eureka,ribbon(代码片段)

阅读本文前可先参考 SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客我们首先来看下不需要注册服务中心,服务消费者直接调用服务提供者一、服务消费者直接访问服务提供者1、服务提... 查看详情

springcloud-springcloudnetflix之zuul网关;路由(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、API网关引自百度百科API网关,软件术语,两个相互独立的局域网之间通过路由器进行通信,中间的路由被称... 查看详情

springcloud-springcloud简介(代码片段)

1,springcloud简介​springcloud是分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。实现的功能有服务注册与发现,服务调用,服务熔断,负载均衡,服务降... 查看详情

c++11之基于范围的for循环(代码片段)

系列文章C++11之正则表达式(regex_match、regex_search、regex_replace)C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)浅谈内存管理C+... 查看详情

c++11之追踪返回类型(代码片段)

系列文章C++11之正则表达式(regex_match、regex_search、regex_replace)C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、 查看详情

c++11之委派构造函数(代码片段)

系列文章C++11之正则表达式(regex_match、regex_search、regex_replace)C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、 查看详情