• SpringCloud - Spring Cloud 之 Config分布式配置;server,client配置(十五)


    阅读本文前可先参考

    ​​​​​​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等 依赖

    1. <!--spring-cloud-config-server-->
    2. <dependency>
    3. <groupId>org.springframework.cloud</groupId>
    4. <artifactId>spring-cloud-config-server</artifactId>
    5. </dependency>
    1. <!--继承统一的父项目-->
    2. <parent>
    3. <groupId>com.company</groupId>
    4. <artifactId>springcloud-demo</artifactId>
    5. <version>1.0.0</version>
    6. <!-- <relativePath/> &lt;!&ndash; lookup parent from repository &ndash;&gt;-->
    7. </parent>
    8. <groupId>com.company</groupId>
    9. <artifactId>springcloud-8-service-config</artifactId>
    10. <version>1.0.0</version>
    11. <name>springcloud-8-service-config</name>
    12. <description>Demo project for Spring Boot</description>
    13. <properties>
    14. <java.version>1.8</java.version>
    15. </properties>
    16. <dependencies>
    17. <!--spring-cloud-config-server-->
    18. <dependency>
    19. <groupId>org.springframework.cloud</groupId>
    20. <artifactId>spring-cloud-config-server</artifactId>
    21. </dependency>
    22. </dependencies>
    23. <build>
    24. <plugins>
    25. <plugin>
    26. <groupId>org.springframework.boot</groupId>
    27. <artifactId>spring-boot-maven-plugin</artifactId>
    28. </plugin>
    29. </plugins>
    30. </build>

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

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

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

    1. @EnableConfigServer //开启spring cloud config配置中心支持
    2. @SpringBootApplication
    3. public class Service8ConfigApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(Service8ConfigApplication.class, args);
    6. }
    7. }

    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等插件

    1. <!-- spring-cloud-starter-config 客户端 -->
    2. <dependency>
    3. <groupId>org.springframework.cloud</groupId>
    4. <artifactId>spring-cloud-starter-config</artifactId>
    5. </dependency>
    1. <!--继承统一的父项目-->
    2. <parent>
    3. <groupId>com.company</groupId>
    4. <artifactId>springcloud-demo</artifactId>
    5. <version>1.0.0</version>
    6. <!-- <relativePath/> &lt;!&ndash; lookup parent from repository &ndash;&gt;-->
    7. </parent>
    8. <groupId>com.company</groupId>
    9. <artifactId>springcloud-8-service-config-provider</artifactId>
    10. <version>1.0.0</version>
    11. <name>springcloud-8-service-config-provider</name>
    12. <description>Demo project for Spring Boot</description>
    13. <properties>
    14. <java.version>1.8</java.version>
    15. </properties>
    16. <dependencies>
    17. <!--spring web 起步依赖-->
    18. <dependency>
    19. <groupId>org.springframework.boot</groupId>
    20. <artifactId>spring-boot-starter-web</artifactId>
    21. </dependency>
    22. <!-- MySQL的jdbc驱动包 -->
    23. <dependency>
    24. <groupId>mysql</groupId>
    25. <artifactId>mysql-connector-java</artifactId>
    26. </dependency>
    27. <!--mybatis起步依赖-->
    28. <dependency>
    29. <groupId>org.mybatis.spring.boot</groupId>
    30. <artifactId>mybatis-spring-boot-starter</artifactId>
    31. <version>2.2.2</version>
    32. </dependency>
    33. <!--依赖统一的springcloud-service-commons项目-->
    34. <dependency>
    35. <groupId>com.company</groupId>
    36. <artifactId>springcloud-2-service-common</artifactId>
    37. <version>1.0.0</version>
    38. </dependency>
    39. <!-- springboot 开发自动热部署 -->
    40. <dependency>
    41. <groupId>org.springframework.boot</groupId>
    42. <artifactId>spring-boot-devtools</artifactId>
    43. <optional>true</optional>
    44. </dependency>
    45. <!--spring-cloud-starter-netflix-eureka-client-->
    46. <dependency>
    47. <groupId>org.springframework.cloud</groupId>
    48. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    49. </dependency>
    50. <!-- spring-cloud-starter-config 客户端 -->
    51. <dependency>
    52. <groupId>org.springframework.cloud</groupId>
    53. <artifactId>spring-cloud-starter-config</artifactId>
    54. </dependency>
    55. </dependencies>
    56. <build>
    57. <!--处理资源目录-->
    58. <resources>
    59. <resource>
    60. <directory>src/main/java</directory>
    61. <includes>
    62. <include>**/*.xml</include>
    63. </includes>
    64. </resource>
    65. <resource>
    66. <directory>src/main/resources</directory>
    67. <includes>
    68. <include>**/*.*</include>
    69. </includes>
    70. </resource>
    71. </resources>
    72. <plugins>
    73. <!--spring boot提供的编译、打包的Maven插件-->
    74. <plugin>
    75. <groupId>org.springframework.boot</groupId>
    76. <artifactId>spring-boot-maven-plugin</artifactId>
    77. </plugin>
    78. </plugins>
    79. </build>

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

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

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

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

    1. #使用spring-cloud-config配置中心
    2. #name 对应配置文件中的 application
    3. #profile 对应 profile
    4. #label 对应 label
    5. #uri 表示配置中心的地址
    6. spring.application.name=application
    7. spring.cloud.config.profile=dev
    8. spring.cloud.config.label=master
    9. 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 访问项目不报错即可,浏览器也可查看

  • 相关阅读:
    【Kettle实战】字符串处理及网络请求JSON格式处理
    C语言--每日五道选择题--Day12
    怎么实现软件测试的游戏化,如何制定游戏化策略
    国内外最好的12款项目管理系统优劣势分析
    人脸识别系统技术方案
    子结点的数量(2)
    【牛客-算法】NC61 两数之和(哈希表的运用,C++)
    论文解读( N2N)《Node Representation Learning in Graph via Node-to-Neighbourhood Mutual Information Maximization》
    JS常用时间操作moment.js参考文档
    Day07 Stream流&递归&Map集合&Collections&可变参数
  • 原文地址:https://blog.csdn.net/MinggeQingchun/article/details/125337347