【SpringCloud】四、Spring Cloud Config

2023-11-11

前言

目前市场长主流的分布式配置中心大概NACOS占的比例多点,其次是Apollo,但本文是以学习的角度出发,进行学习记录的。

一、什么是配置中心

  • 1、传统配置方式:
    配置信息分散到系统各个角落方式,配置文件或者在代码中;
  • 2、集中式配置中心:
    将应用系统中对配置信息的管理作为一个新的应用功能模块,进行集中统一管理,并且提供额外功能;
  • 3、分布式配置中心:
    在分布式、微服务架构中,独立的配置中心服务;

1、 为什么需要分布式配置中心

在分布式微服务体系中,服务的数量以及配置信息日益增多,比如各种服务器参数配置、各种数据库访问参数配置、各种环境下配置信息的不同、配置信息修改之后实时生效等等,传统的配置文件方式或者将配置信息存放于数据库中的方式已无法满足开发人员对配置管理的要求,如:

  • 安全性:配置跟随源代码保存在代码库中,容易造成配置泄漏
  • 时效性:修改配置,需要重启服务才能生效;
  • 局限性:无法支持动态调整:例如日志开关、功能开关;

2、常用分布式配置中心框架

Nacos:Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

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

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

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

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

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

Spring Cloud Config:Spring Cloud微服务开发的配置中心,提供服务端和客户端支持;
国外也有很多开源的配置中心 Apache 的 Apache Commons Configuration、owner、cfg4j 等等;

大型互联网公司自己内部都有自己独立分布式配置中心,用于解决服务配置管理问题;

二、什么是Spring Cloud Config?

Spring Cloud Config 是一个解决分布式系统的配置管理方案。它包含 Client和 Server 两个部分,Server 提供配置文件的存储、以接口的形式将配置文件的内容提供出去,Client 通过接口获取数据、并依据此数据初始化自己的应用。
Spring cloud config使用 git 或 svn 、也可以是本地存放配置文件,默认情况下使用 git。

1、Springcloud config 的工作原理

Spring cloud Config Server 的工作过程如下图所示:
在这里插入图片描述

1、首先需要一个远程 Git 仓库,平时测试可以使用 GitHub,在实际生产环境
中,需要自己搭建一个 Git 服务器,远程 Git 仓库的主要作用是用来保存我们的配置文件;
2、除了远程 Git 仓库之外,我们还需要一个本地 Git 仓库,每当 Config Server访问远程 Git 仓库时,都会克隆一份到本地,这样当远程仓库无法连接时,就直接使用本地存储的配置信息;
3、微服务 A、微服务 B 则是我们的具体应用,这些应用在启动的时会从 Config
Server 中获取相应的配置信息;
4.当微服务 A、微服务 B 尝试从 Config Server 中加载配置信息的时候,Config Server 会先通过 git clone 命令克隆一份配置文件保存到本地;
5、由于配置文件是存储在 Git 仓库中,所以配置文件天然具有版本管理功能;

2、构建 Spring cloud config 配置中心仓库

前面我们介绍了spring cloud config的配置中心一般是采用git存储配置,(我们在这里采用国内的码云 gitee, 也可以使用国外的GitHub,由于使用Github网络比较慢,可能连接失败) ,
接下来我们需要在 gitee 上设置好配置中心,我们通过idea 把gitee上的springcloud项目clone到本地,然后再项目下创建一个文件夹config-center,然后在 config-center中创建四个配置文件,如下:

application.properties 
application-dev.properties 
application-test.properties 
application-online.properties 

在四个文件里面分别写上要测试的内容:
比如:
url=http://www.test.com
url=http://dev.test.com
url=http://test.test.com
url=http://online.test.com
然后通过idea将本地文件同步到 Gitee 仓库中: ’

3、构建 Spring cloud config 配置中心服务端

构建一个 spring cloud config 配置中心按照如下方式进行:
1、创建一个普通的 Spring Boot 项目
2、在 pom.xml 文件中添加如下依赖:

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

3、在入口类,也就是 main 方法的类上添加注解 @EnableConfigServer

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

4、在application.properties中配置一下git仓库信息,此处我们使用gitee (也可以使用码云GitHub,由于网络比较慢,可能连接失败) ,
首先我的gitee上有一个名为 springcloud的项目,我们的配置文件如下:

server.port=8888

spring.application.name=springcloud-service-config

spring.cloud.config.server.git.uri=https://gitee.com/springcloud.git
spring.cloud.config.server.git.search-paths=config-center
spring.cloud.config.server.git.username=name
spring.cloud.config.server.git.password=123456.

其中:
1.uri 表示配置中心所在仓库的位置
2.search-paths 表示仓库下的子目录
3.username 表示你的 GitHub 用户名
4.password 表示你的 GitHub 密码
至此我们的配置中心服务端就创建好了。

配置文件的映射规则:
/{application}/{profile}[/{label}]
http://localhost:8888/application/dev/master 

/{application}-{profile}.properties
http://localhost:8888/application-dev.properties 

/{label}/{application}-{profile}.properties
http://localhost:8888/master/application-dev.properties 

/{application}-{profile}.yml
http://localhost:8888/application-dev.yml 


/{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 上提交时产生的版本号, 
同时当我们访问成功后,在控制台会打印了相关的日志信息; 
当访问成功后配置中心会通过 git clone 命令将远程配置文件在本地也保存一 
份,以确保在 git 仓库故障时我们的应用还可以继续正常使用。

4、构建 Springcloud config 配置中心客户端

前面已经搭建好了配置中心的服务端,并且通过访问接口从config服务端读取配置信息, 不过实际开发中,更多的不是我们人为去获取配置信息,而是由微服务自己从config服务端上加载配置信息, 那么怎么来加载呢?
1、我们的各个微服务都是客户端,比如服务提供者、服务消费者等各个微服务都可以从配置中心获取配置信息,但是要添加如下依赖:

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

2、创建 bootstrap.properties 文件,用于获取配置信息,文件内容如下:
(注意这些信息一定要放在 bootstrap.properties 文件中才有效)

spring.application.name=application
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:8888/

其中:

  • name 对应配置文件中的 application 部分,
  • profile 对应了 profile 部分,
  • label 对应了 label 部分,
  • uri 表示配置中心的地址。

bootstrap.properties 文件;

Spring Cloud有一个“引导上下文"的概念,这是主应用程序的父上下文。引导上下文负责从配置服务器加载配置属性,以及解密外部配置文件中的属性。和主应用程序加载application.(yml或 properties)中的属性不同,引导上下文加载(bootstrap.)中的属性。配置在 bootstrap.*中的属性有更高的优先级,因此默认情况下它们不能被本地配置覆盖;

3、创建一个 Controller 进行测试:

@RestController 
@RefreshScope 
public class ConfigController { 
@Value("${url}")//读取远程配置中心配置的信息
private String url; 
@Autowired 
private Environment env; 
@RequestMapping("/cloud/url") 
public String url () { 
return this.url; 
} 
@RequestMapping("/cloud/url2") 
public String url2 () { 
return env.getProperty("url"); 
} 
} 

我们可以直接使用@Value 注解注入配置的属性值,也可以通过 Environment
对象来获取配置的属性值。

5、配置信息的加解密安全处理

前面是在Git仓库中明文存储配置信息值,很多场景下,对于某些敏感的配置内容(例如数据库账号、密码等),应该加密存储,config server为我们考虑到了这一点,对配置内容提供了加密与解密支持;
安装JCE
config server的加解密功能依赖Java Cryptography Extension(JCE)
Java 8 JCE下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下载得到JCE的zip压缩包并解压,将其中的jar包覆盖到JDK/jre/lib/security目录下;
在这里插入图片描述

对称加密

config server提供了加密与解密的接口,分别是

加密接口:http://localhost:8888/encrypt
解密接口:http://localhost:8888/decrypt  (这个接口我们不需要用)

解密是config-server自动完成的;
在原来的springcloud-service-config项目中添加bootstrap.properties配置文件,里面配置密钥:
#设置对称密钥,用这个密钥进行加密和解密

encrypt.key=testencrypt

运行项目,验证加解密:

加密:curl http://localhost:8888/encrypt -d root 
得到:9455e7d7333e1cc9d1a8680244f6db3aae6de93825d4bc6f9f4258993f7a8cad
解密:curl http://localhost:8888/decrypt -d 9455e7d7333e1cc9d1a8680244f6db3aae6de93825d4bc6f9f4258993f7a8cad

在git仓库增加修改配置文件application-dev.properties,增加如下内容:

spring.datasource.username={cipher}9455e7d7333e1cc9d1a8680244f6db3aae6de93825d4bc6f9f4258993f7a8cad
spring.datasource.password={cipher}5a6e3e417d416736d638cd4db7a6380a71a8709c3ec335a28e01cff05705eeaa

访问地址:http://localhost:8888/application-dev.properties 得到密钥原文;
说明 config server能自动解密配置内容;

6、Spring Cloud Config配置动态刷新

很多场景下,需要在运行期间动态调整配置,如果配置发生了修改,微服务要如何实现配置的动态刷新呢?

配置信息局部刷新

Spring Boot 的actuator提供了一个刷新端点/refresh,添加依赖spring-boot-starter-actuator,可用于配置的刷新;
1、添加依赖:

<!--springboot的一个监控actuator-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、在Controller上添加注解@RefreshScope,添加这个注解的类会在配置更新时得到特殊的处理;

3、打开web访问端点:management.endpoints.web.exposure.include=*

4、访问http://localhost:8080/actuator/refresh 进行手动刷新配置;
(Post访问)
这种方式的刷新,就是你对每个微服务分别进行刷新,也一个一个操作,如果你有80个微服务,那么就需要手动刷新这80个微服务;

配置信息全局刷新

前面使用/actuator/refresh端点手动刷新配置虽然可以实现刷新,但所有微服务节点的配置都需要手动去刷新,如果微服务非常多,其工作量非常庞大。因此,实现配置的自动刷新是志在必行,Spring Cloud Bus就可以用来实现配置的自动刷新;
Spring Cloud Bus使用轻量级的消息代理/总线(例如RabbitMQ、Kafka等)广播传播状态的更改(例如配置的更新)或者其他的管理指令,可以将Spring Cloud Bus想象成一个分布式的Spring Boot Actuator;

Config项目添加依赖:(服务端)

<!-- spring-cloud-starter-bus-amqp -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

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

配置文件增加rabbitmq的配置:
#配置rabbitmq

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

#开启spring cloud bus,默认是开启的,也可以省略该配置
spring.cloud.bus.enabled=true

#打开所有的web访问端点
management.endpoints.web.exposure.include=*

各个微服务(客户端)
其他各个微服务用于接收消息,那么也需要有spring cloud bus的依赖和RabbitMQ的连接信息;

<!-- spring-cloud-starter-bus-amqp -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

#配置rabbitmq

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

然后post方式请求地址:http://localhost:8888/actuator/bus-refresh 如果返回成功1,则RabbitMQ将收到消息,然后微服务会消费消息,config的所有客户端的微服务配置都会动态刷新;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【SpringCloud】四、Spring Cloud Config 的相关文章

  • 未找到 MessageSource 的 ResourceBundle [消息]:找不到基本名称消息的包

    在 applicationContext xml 中 我定义了 MessageSource 如下所示
  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 在文本文件中搜索单词并返回其频率

    如何在包含单词文本的文本文件中搜索特定单词并返回其频率或出现次数 使用扫描仪 String text Question how to search for a particular word in a text file containin
  • Condition 接口中的 signalAll 与对象中的 notificationAll

    1 昨天我才问过这个问题条件与等待通知机制 https stackoverflow com questions 10395571 condition vs wait notify mechanism 2 我想编辑相同的内容并在我的问题中添加
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • 在哪里存储 Java 的 .properties 文件?

    The Java教程 http download oracle com javase tutorial essential environment properties htmlon using Properties 讨论如何使用 Prop

随机推荐

  • Spring Cloud简介

    一 Spring Cloud简介 SpringCloud是微服务架构中的集成 将一系列优秀的组件进行了整合 基于SpringBoot构建 对熟希spring的程序员来说 表容易上手 通过简单的注解 就可以快速的在应用中配置一下常用模块并构建
  • java正则表达式-案例代码

    转载请注明出处 http blog csdn net droyon article details 8635735 jdk在线api http docs oracle com javase 7 docs api index html 选择j
  • 使用 Element 实现首页

    完成首页 使用 Container 布局容器 结构
  • 背景渐变,多层背景图

    背景渐变 多层背景图 一 线性渐变 linear gradient 二 径向渐变 三 背景大小 一 线性渐变 linear gradient 为了创建一个线性渐变 你必须至少定义两种颜色结点 颜色结点即你想要呈现平稳过渡的颜色 同时 你也可
  • Relying upon circular references is discouraged and they are prohibited by default.循环依赖bug解决

    Relying upon circular references is discouraged and they are prohibited by default 循环依赖bug解决 出现的bug大概意思是 不鼓励依赖循环引用 默认情况下
  • 肌电信号采集电路分析

    最近在开发肌电信号的采集 表面肌电信号是非常微弱的生物信号 正常人体表面肌电信号赋值为0 1 5mV 主要能量频段集中在10 150Hz 电路主要是根据原始信号 设计相应的放大电路 滤波电路 下面直接放原理图说明 一级放大电路 一级放大电路
  • Spring MVC使用注解实现账户注册与登陆

    涉及到的注解 Controller 控制器类 RequestMapping 映射路径 RequestParam 用于将指定的请求参数赋值给方法中的形参 定义域对象 User1 用来接受并封装前台传递的数据 package com wen d
  • Java基础(七)——eclipse、集合(容器)

    集合 1 集合框架 l 所谓的框架就是一个类库的集合 集合框架就是一个用来表示和操作集合的统一的架构 它包含了实现集合的接口和类 l 集合框架中不同的集合类有各自不同的数据结构 所以在使用中要根据应用的性能要求来选择不用的集合类 l 集合类
  • C语言指针初阶

    思维导图 目录 编辑 1 指针与内存 1 1内存中的门牌号 地址 是如何编号的 1 2一个指针的大小 在32位平台上 1 3内存总空间大小 2 指针的使用 2 1指针的构成 2 2指针类型的作用 1 决定指针访问的权限的大小 2 决定指针走
  • 在家带娃有没有什么副业可以做?在家带娃的副业有哪些?

    很多朋友在有了自己的孩子之后 为了给孩子一个良好的成长环境 就会辞去工作专心在家带孩子 不过 考虑生活开销的支出问题 还是会想要做点副业赚钱 那在家带孩子可以做什么副业呢 1 数据录入 这是一个大行业 几乎所有人都可以做 需要的仅仅是一台能
  • Oracle TNS简述

    什么是TNS TNS是Oracle Net的一部分 专门用来管理和配置Oracle数据库和客户端连接的一个工具 在大多数情况下客户端和数据库要通讯 必须配置TNS 当然在少数情况下 不用配置TNS也可以连接Oracle数据库 比如通过JDB
  • java使用xfire创建和调用webservices

    1 创建工程 File gt New gt Web Service Project 弹出Web Service Project窗口 需要填写Project Name 例子是Demo 选择XFire 然后一路next 直到完成 创建完成后 打
  • 如何让Element UI的Message消息提示每次只弹出一个

    Element UI的Message消息提示是点击一次触发一次的 在开发的时候经常会作为一些校验提示 但是公司的测试人员在进行测试时会一直点 然后就会出现如下图的情况 虽然客户使用的时候一般来说不会出现这种情况 毕竟客户不会闲着没事一直点点
  • 用 visio 2013反转图形或镜像图形

    软件版本 visio 2013 选择待反转图形 依次点击 开始 位置 旋转形状 即可根据需求进行图形反转 若需要进行图形镜像操作 可提前将图形复制出一份 将复制出来的图形进行垂直反转或水平反转
  • 2020年tensorflow定制训练模型笔记(3)——开始训练

    现在 我们开始训练文件 这里 我将用一些训练好的模型来做迁移训练 这里简单介绍一下迁移训练 迁移训练就是在别人训练的模型基础上继续训练 这样我们的模型训练就不是从零开始 加快速度以及提高准确率 我讲的比较简单 参考网址在这 https bl
  • 华为OD题目:快递投放问题

    华为OD题目 快递投放问题 有N个快递站点用字符串标识 某些站点之间有道路连接 每个站点有一些包裹要运输 每个站点间的包裹不重复 路上有检查站会导致部分货物无法通行 计算哪些货物无法正常投递 输入描述 1 第一行输入M N M个包裹N个道路
  • python中的random和range

    random import random print random randint 1 10 产生 1 到 10 的一个整数型随机数 包括1和10 print random random 产生 0 到 1 之间的随机浮点数 print ra
  • 靶场 : upload-labs1-10

    搭建 用phpstudy搭建的 搭建很简单 下载源码 放置在phpstudy的根目录下 在phpstudy中创建 步骤 这里上传的文件内容是一句话木马 pass 1 上传一个php文件试一试 传不上的 使用的白名单过滤的 我们考虑一下是什么
  • 12个超好用的配色网站

    每次做海报做ppt的时候总是为配色发愁 到底怎样才能调出好看的配色方案呢 调着调着感觉自己已经是个色盲了 今天小编就给你们带来了福利 12个超好用的配色网站推荐 01 Material Palette 网站地址 http www mater
  • 【SpringCloud】四、Spring Cloud Config

    Spring Cloud Config 前言 一 什么是配置中心 1 为什么需要分布式配置中心 2 常用分布式配置中心框架 二 什么是Spring Cloud Config 1 Springcloud config 的工作原理 2 构建 S