Spring Cloud随记---分布式配置中心初探

  • 引言
  • 一个简单的单节点的配置中心搭建
    • 首先建立一个服务注册中心。
    • 搭建一个配置服务中心,使其可以获得远程git上的配置文件
    • 搭建测试服务,接入配置中心
    • 结束

引言

在分布式系统中,由于服务数量巨多,为了方便管理,就出现了分布式配置中心组件。


  1. Spring Cloud Config,它支持配置服务放在本地,或者远程Git仓库中。
  2. 在spring cloud config组件中,分为两个角色,config Server,config client

一个简单的单节点的配置中心搭建

当服务的实例很多的时候,都从远程配置中心读取配置,这时候就可以考虑将这个抽出来作为一个服务(配置中心),专门去读取分发配置文件。’
初步的整体架构数据访问流如下
  

首先建立一个服务注册中心。

我将其命名为eurekaServer1,pom文件如下

<?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><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>eurekaServer1</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-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></project>

之后在入口函数加上注解@EnableEurekaServer。
在application.yml文件中加入如下内容

server:port: 9999eureka:instance:hostname: localhostclient:registerWithEureka: falsefetchRegistry: falseserviceUrl:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

将服务注册中心开到端口9999
之后就可以访问http://localhost:9999/
来看到注册中心的相关信息。
至此注册中心搭建完成。

搭建一个配置服务中心,使其可以获得远程git上的配置文件

将此服务命名为configServerCenter
pom文件如下

<?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><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>configServerCenter</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</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></project>

application.properties文件内容如下

spring.application.name=configServerCenter
server.port=8888eureka.client.serviceUrl.defaultZone = http://localhost:9999/eureka/spring.cloud.config.server.git.uri=https://github.com/whyareyousoseriously/springCloud.git
spring.cloud.config.server.git.searchPaths=respo
spring.cloud.config.label=master
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=

访问公用库,不用填写用户名和密码
spring.cloud.config.server.git.searchPaths相当于是库中的具体的一个文件夹
spring.cloud.config.label是库的分支名
之后记得在入口ConfigServerCenterApplication处加上@EnableConfigServer注解
至此配置服务中心已经搭建完成。
访问http://localhost:8888/config-client/dev 可以访问到远程git库中的config-client-dev.properties。
访问http://localhost:8888/address/dev 可以访问到远程git库中的address-dev.properties。
同理就可以访问库中的其他配置文件。
(ps: 本例上的git库并非公有的库,不能直接拿来用,git库的简单配置请移步至https://blog.csdn.net/qq_33121481/article/details/81392204)
附上git访问规则

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
上面的url会映射{application}-{profile}.properties对应的配置文件,{label}对应git上不同的分支,默认为master。

搭建测试服务,接入配置中心

将其命名为serverOne。
其pom文件如下

<?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><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>serviceOne</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.SR1</spring-cloud.version></properties><dependencies><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.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</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></project>

application.properties文件

##什么都不写

bootstrap.properties文件如下

spring.application.name=serviceOne
spring.cloud.config.label=master
spring.cloud.config.profile=deveureka.client.serviceUrl.defaultZone=http://localhost:9999/eureka/
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=configServerCenter
server.port=7777

此处特别说明一下bootstrap和application的区别
Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

.因此,对比 application 配置文件,bootstrap 配置文件具有以下几个特性。

  1. boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载
  2. boostrap 里面的属性不能被覆盖

bootstrap/ application 的应用场景
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景。

  1. 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
  2. 一些固定的不能被覆盖的属性
  3. 一些加密/解密的场景;

通过配置服务中心(该例子中配置服务中心所在的端口为8888)获取远程git库中的master分支的配置文件serviceOne-dev.properties。
spring.cloud.config.discouvery.serviceId的值就是远程配置服务的服务名

改造程序入口如下

package com.example.demo;import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@SpringBootApplication
public class ServerOneApplication {public static void main(String[] args) {SpringApplication.run(ServerOneApplication.class, args);}@Value("${valueFromGit}")String valueFromGit;@RequestMapping("/getValueFromGit")public String getValueFromGit(){return valueFromGit;}
}

结束

至此所有的配置完成,通过访问http://localhost:7777/getValueFromGit 可以获取配置文件中的值

下篇:Spring Cloud随记----分布式配置中心再探—消息总线的引入


本文参考

https://blog.csdn.net/forezp/article/details/81041045

Spring Cloud随记---分布式配置中心初探--一个单节点的配置中心相关推荐

  1. Spring Cloud Alibaba Nacos 分布式配置中心

    文章目录 1 摘要 2 核心 Maven 依赖 3 核心代码 3.1 bootstrap 配置文件 3.2 application 配置文件 3.3 配置测试类 - Controller 层 3.4 ...

  2. Spring Cloud 如何选择分布式配置中心

    ##微服务必备的几样武器有了,才能独闯武林, 有哪几样呢? 注册中心(eureka, consul, zk, etcd) 配置中心 (Spring Cloud Config, disconf ) AP ...

  3. Spring Cloud入门-Config分布式配置中心(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 Spring Cloud Config 简介 在Git仓库中准备配置信息 配置仓库目录结构 master分支下的配置信息 dev分支下的配置信息 ...

  4. Spring Cloud Alibaba Nacos 分布式配置

    Spring Cloud Alibaba 分布式配置 1. 简介 Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持.使用 Spr ...

  5. Spring Cloud Alibaba入门教程-05【Alibaba微服务组件Nacos配置中心】

    1. Nacos配置中心使用 官方文档: https://github.com/alibaba/spring­cloud­alibaba/wiki/Nacos­config Nacos 提供用于存储配 ...

  6. spring cloud 集成 seata 分布式事务

    spring cloud 集成 seata 分布式事务 基于 seata-server 1.6.x 序言 下载 seata-server 准备一个数据库 seata 专门为 seata-server ...

  7. 基于Spring Cloud + MyBatis的分布式架构网约车平台(DD 打车)后端原型系统设计与实现

    资源下载地址:https://download.csdn.net/download/sheziqiong/85638879 资源下载地址:https://download.csdn.net/downl ...

  8. 五分钟学会 Spring Cloud Sleuth:分布式请求链路跟踪(小白必看,一看就会教程)

    Spring Cloud Sleuth:分布式请求链路跟踪 Spring Cloud Sleuth 简介 给服务添加请求链路跟踪 整合Zipkin获取及分析日志 使用Elasticsearch存储跟踪 ...

  9. (二)spring cloud微服务分布式云架构 - 整合企业架构的技术点

    spring cloud本身提供的组件就很多,但我们需要按照企业的业务模式来定制企业所需要的通用架构,那我们现在需要考虑使用哪些技术呢? 下面我针对于spring cloud微服务分布式云架构做了以下 ...

  10. spring cloud微服务分布式云架构 - 整合企业架构的技术点

    spring cloud本身提供的组件就很多,但我们需要按照企业的业务模式来定制企业所需要的通用架构,那我们现在需要考虑使用哪些技术呢? 下面我针对于spring cloud微服务分布式云架构做了以下 ...

最新文章

  1. 刷前端面经笔记(七)
  2. 笔试算法题--汪仔换道具
  3. order by、group by也会使用索引?使用这俩关键字的时候索引什么时间会失效
  4. 【推荐系统】一文梳理联邦学习推荐系统研究进展
  5. 使用匿名内部类创建线程
  6. 工厂方法 coding
  7. [react] react非父子组件如何通信?
  8. 深度残差收缩网络:(一)背景知识
  9. android黑屏日志_Android启动页黑屏的解决方案
  10. 面试题46. 把数字翻译成字符串
  11. JavaScript -- Window-Resize
  12. 《物联网Android程序开发案例式教程》Demo2:相对布局
  13. NAGA-Ⅱ与QPSO算法求解下层为非合作博弈模型的双层规划组合优化模型(铁路开行方案)
  14. Protel 99SE在Win10下按键就卡,无法使用
  15. 数学 二维向量(加法、减法、模、点乘、叉乘)
  16. 时间戳转换格林威治时间
  17. Python爬取网易云音乐热歌榜(爬虫)
  18. webdriver+Chrome 设置代理
  19. 基于51单片机的三角波信号发生器设计
  20. 施工控制网的精度确定方法?

热门文章

  1. 做可穿戴医疗,你的对手是“天性”
  2. 在tomcat文件夹下启动war项目
  3. jquery实现点击元素,如果弹出层隐藏则显示,显示则隐藏
  4. oracle DBTIMEZONE时区调整
  5. CPU占用率高的可能性与解决办法
  6. Mybatis无法获取带有下划线前缀的字段的值
  7. python制作查询工具发给别人使用_Python 制作查询商品历史价格的小工具
  8. python 面向对象编程、别人么样用_Python 中的面向对象没有意义
  9. webpack 打包第三方库_webpack提取第三方库的正确姿势
  10. bigdecimal计算开n次方_随笔:HashMap中容量为什么是2的次方数?