一、配置中心的作用:可以将多种应用的配置进行集中式的管理,将这些配置统一存放到git或svn里面存储;

二、搭建SpringCloud-Config-Server

2.1如图后续步骤勾选Config Server即可;

创建好后的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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>me.silentdoer</groupId>
<artifactId>springcloud-config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-config-server</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> <repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories> </project>

  

2.2创建好后在Application上加上@EnableConfigServer注解,并且修改application.properties文件(貌似SpringCloud的标准文件是bootstrap.properties|yml,但是我用application.properties也可以,如果同时存在据说bootstrap.properties优先于application.properties)为:

# config-server服务的端口
server.port=8888
# 服务名
spring.application.name=config-server
#表示这个是config-server不需要去发现服务,它不依赖其他服务
spring.cloud.config.discovery.enabled=false
# 配置git仓库地址
spring.cloud.config.server.git.uri=https://github.com/Silentdoer/config-server-repo.git
# 配置仓库的搜索目录,必须配置(相对于根目录),如果要填写多种应用的配置可以用英文逗号分隔
spring.cloud.config.server.git.search-paths=qq-api,wechat-api
# 配置仓库的分支
spring.cloud.config.label=master
# 访问git仓库的用户名,如果是私密仓库需要填这两个
#spring.cloud.config.server.git.username=xxxx
# 访问git仓库的用户密码
#spring.cloud.config.server.git.password=xxxx

到这里,SpringCloud的Config-Server就创建好了;

可以启动Config-Server,然后访问http:localhost:8888/qq-prod.properties来看server是否启动成功;(如果用的是properties格式的配置还需要添加额外的转换器否则消费者看到的是中文乱码【浏览器看到是乱码可以不用管】)

我这边访问后是这样子:

注意,这里的访问方式有很多种:(这里用的是第二种,第一种的label是可以省略的)

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

三、接着我们来创建Config-Server的消费服务,这里比如就叫qq-api;(注意这是个普通的Webapp,只不过添加了Config-Client的功能)

步骤和上面差不多,不过勾选时要勾选Ops里的Actuator和Config Client和以及Web应用相关的东西(根据自己需求);

创建好后的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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>me.silentdoer</groupId>
<artifactId>springcloud-qq-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-qq-api</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</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> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> <repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories> </project>

  

接着将qq-api的application.properties内容改为:

#application.properties可以认为是application-default.properties
server.port=8080
# 和git里的文件名对应
spring.application.name=qq-prod
# 远程仓库的分支
spring.cloud.config.label=master
# 和git里的文件名对应
spring.cloud.config.profile=prod
# 指明配置服务中心的网址
spring.cloud.config.uri=http://localhost:8888/
# 暴露刷新配置的接口,然后调用curl -X POST http://localhost:8080/actuator/refresh即可刷新配置,但是相关的bean仍然需要@RefreshScope
# 否则虽然这个config-client程序里的某个properties属性刷新了,但是它的老的值已经赋值给了这个bean的对应的属性,所以还是用的老的bean值;
management.endpoints.web.exposure.include=health,info,refresh

然后再添加一个Controller用于测试:

@RestController
@RequestMapping("/api/backstage/test")
@RefreshScope
public class TestController { @Value("${country:瓜瓜国}")
private String country; @GetMapping("test1")
public String test1() {
System.out.println(this.country);
return this.country;
}
}

这里的@RefreshScope是为了调用curl -X POST http://localhost:8080/actuator/refresh是能够将这个bean刷新从而应用最新的配置值;

调用该接口获取的配置就是在Git仓库里的配置,如果commit更新了该key的value值,那么调用refresh后这里再调用接口获取的会是最新的配置值;

四、健康监测

通过GET请求调用http://localhost:8080/actuator/health,然后可以看到{"status":"UP"},这里UP表示Config-Server是好的,如果是DOWN那么表示无法连接到Config-Server;

五、到此就结束了,SpringCloud的配置中心还是比较简单是实现的,后续还可以结合MQ和消息总线来实现更新配置文件后自动通知应用来刷新配置;

六、一些有问题的地方:

1.经过测试,如果通过spring.cloud.config.name来读取多配置(必需在指定的搜索目录的根目录【Git根目录也默认会搜索】,网上的searchPaths的*不是指同时搜索子目录,而是如xxx*表示xxx开头的目录,但内部的子目录不会搜索),那么qq-api是能够读取到wechat-api里的配置的,所以这里的配置中心其实不是为多种应用准备的?

SpringCloud-分布式配置中心(基于SpringBoot2.X)的更多相关文章

  1. SpringCloud 分布式配置中心

    SpringCloud 分布式配置中心 服务端 创建工程并完善结构 国际惯例,把maven工程创建完善 pom.xml <?xml version="1.0" encodin ...

  2. SpringCloud搭建分布式配置中心(基于git)

    1.简介 Spring Cloud Config.它用来为分布式系统中的基础设施和微服务提供集中化的外部配置支持,分为服务端和客户端两个部分. 其中服务端也称为分布式配置中心,他是独立的微服务应用,用 ...

  3. SpringCloud分布式配置中心

    一.什么是配置中心 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud c ...

  4. SpringCloud分布式配置中心Config

    统一管理所有配置. 1.微服务下的分布式配置中心 简介:讲解什么是配置中心及使用前后的好处 什么是配置中心: 一句话:统一管理配置, 快速切换各个环境的配置 相关产品: 百度的disconf 地址:h ...

  5. 《springcloud 三》分布式配置中心

    Git环境搭建 使用码云环境搭建git服务器端 码云环境地址:https://gitee.com/majie2018 服务端详解 项目名称:springboot2.0-config_server Ma ...

  6. SpringCloud系列之分布式配置中心极速入门与实践

    SpringCloud系列之分布式配置中心极速入门与实践 @ 目录 1.分布式配置中心简介 2.什么是SpringCloud Config? 3.例子实验环境准备 4.Config Server代码实 ...

  7. SpringCloud全家桶学习之分布式配置中心----Config(七)

    一.概述 (1)背景 微服务意味着将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中出现大量的服务.由于每个服务都需要配置必要的配置信息才能运行,所以一套集中式的.动态的配置管理 ...

  8. spring cloud 入门系列七:基于Git存储的分布式配置中心

    我们前面接触到的spring cloud组件都是基于Netflix的组件进行实现的,这次我们来看下spring cloud 团队自己创建的一个全新项目:Spring Cloud Config.它用来为 ...

  9. SpringCloud(6)分布式配置中心Spring Cloud Config

    1.Spring Cloud Config 简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组 ...

  10. SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)

    一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud config ...

随机推荐

  1. 项目(一)ftp搭建

    FTP服务 FTP两种模式: 主动模式服务器向客户端敲门,然后客户端开门 被动模式客户端向服务器敲门,然后服务器开门 传输模式:可以是文本模式,也可以是二进制模式,二进制模式更适合传输图片等非文本字符 ...

  2. PRD是什么

    产品需求文档(Product Requirement Document,PRD)的英文简称.是将商业需求文档(BRD)和市场需求文档(MRD)用更加专业的语言进行描述

  3. k8s中yaml文常见语法

    在k8s中,所有的配置都是 json格式的.但为了读写方便,通常将这些配置写成yaml 格式,其运行的时候,还是会靠yaml引擎将其转化为json,apiserver 也仅接受json的数据类型. y ...

  4. JavaSE基础知识(5)—面向对象(5.7 final关键字)

    一.说明 final属于一种修饰符,可以用于修饰类和属性.方法.局部变量 二.特点 1.修饰类 该类不能被继承,如String.Integer等 2.修饰方法 该方法不能被重写 3.修饰变量(属性和局 ...

  5. 1. NES简介

    NES(Nintendo Entertainment System)简介 NES是北美地区对任天堂发行的第三代家用游戏机的简称. 1.CPU NES使用一颗理光[1]制造的8位2A03 NMOS处理器 ...

  6. python zlib ,zlib 压缩流

    zlib 字符串:使用zlib.compress可以压缩字符串.使用zlib.decompress可以解压字符串. 数据流:压缩:compressobj,解压:decompressobj       ...

  7. python chardet

    chardet:字符编码检测工具 字符串编码一直是令人非常头疼的问题,尤其是我们在处理一些不规范的第三方网页的时候.虽然Python提供了Unicode表示的str和bytes两种数据类型,并且可以通 ...

  8. centos7 使用kubeadm 快速部署 kubernetes 国内源

    前言 搭建kubernetes时看文档以及资料走了很多弯路,so 整理了最后成功安装的过程已做记录.网上的搭建文章总是少一些步骤,想本人这样的小白总是部署不成功(^_^). 准备两台或两台以上的虚拟机 ...

  9. c#跨线程访问的代码和窗体关闭退出死循环的代码

    一:一段跨线程访问,给页面内的控件赋值的代码找了半天没找到,还得找了以前写的程序. 在这记下来吧 .  这是其他程序内可以跨线程访问的代码 . if (gridControl1.InvokeRequi ...

  10. 后台跨域(CORS)

    解决跨域问题 一.为什么会有跨域问题? 是因为浏览器的同源策略是对ajax请求进行阻拦了,但是不是所有的请求都给做跨域,像是一般的href属性,a标签什么的都不拦截. 二.解决跨域问题的两种方式 JS ...