文档章节

SpringCloud源码走读--ConfigServer

子达
 子达
发布于 2016/07/11 14:59
字数 382
阅读 59
收藏 1
点赞 0
评论 0

先占个坑,这篇主要记录查找更新失败的问题上, 后期有时间会详细补充ConfigServer的主要源码分析。

源码阅读目标

  • 启动过程
  • Restful获取配置原理过程

启动

  • 通过注解引入4个class
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ EnvironmentRepositoryConfiguration.class, ResourceRepositoryConfiguration.class,
     ConfigServerEncryptionConfiguration.class, ConfigServerMvcConfiguration.class })
public @interface EnableConfigServer {
}
  • EnvironmentRepositoryConfiguration 配置 environmentRepository

Profile为native或者subversion分别配置native和svn的repository, 否则为git

  • ResourceRepositoryConfiguration:Resource仓库配置

  • ConfigServerEncryptionConfiguration: 加密bean 注册

  • ConfigServerMvcConfiguration: controller baen注册

Restful获取配置原理过程

  • 对于git上配置更新,configserver是在restful请求的时候再更新的。
  • Controller -> XXX(这部分调用很简单,略过) -> AbstractScmEnvironmentRepository.findOne -> JGitEnvironmentRepository.getLocations -> JGitEnvironmentRepository.refresh -> JGitEnvironmentRepository.shouldPull(判断是否需要pull) -> pull

AbstractScmEnvironmentRepository.java

@Override
public synchronized Environment findOne(String application, String profile, String label) {
  NativeEnvironmentRepository delegate = new NativeEnvironmentRepository(
        getEnvironment());
  Locations locations = getLocations(application, profile, label);
  delegate.setSearchLocations(locations.getLocations());
  Environment result = delegate.findOne(application, profile, "");
  result.setVersion(locations.getVersion());
  result.setLabel(label);
  return this.cleaner.clean(result, getWorkingDirectory().toURI().toString(),
        getUri());
}

JGitEnvironmentRepository.java

@Override
public synchronized Locations getLocations(String application, String profile,
     String label) {
  if (label == null) {
     label = this.defaultLabel;
  }
  Ref ref = refresh(application, label);
  String version = null;
  if (ref != null) {
     version = ref.getObjectId().getName();
  }
  return new Locations(application, profile, label, version,
        getSearchLocations(getWorkingDirectory(), application, profile, label));
}

private Ref refresh(String application, String label) {
  initialize();
  Git git = null;
  try {
     git = createGitClient();
     git.getRepository().getConfig().setString("branch", label, "merge", label);
     Ref ref = checkout(git, label);
     if (shouldPull(git, ref)) {
        pull(git, label, ref);
     }
     return ref;
  }
  catch (RefNotFoundException e) {
     throw new NoSuchLabelException("No such label: " + label);
  }
  catch (GitAPIException e) {
     throw new IllegalStateException("Cannot clone or checkout repository", e);
  }
  catch (Exception e) {
     throw new IllegalStateException("Cannot load environment", e);
  }
  finally {
     try {
        if (git != null) {
           git.close();
        }
     }
     catch (Exception e) {
        this.logger.warn("Could not close git repository", e);
     }
  }
}

© 著作权归作者所有

共有 人打赏支持
子达
粉丝 3
博文 5
码字总数 3170
作品 0
杭州
高级程序员
Spring Cloud-honghu Cloud分布式微服务云系统

简介 鸿鹄云Cloud是基于SpringCloud来封装的,是一系列框架的有序集合。利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现、注册、配置中心、消息总线、负载均衡、断路器...

itcloud ⋅ 04/25 ⋅ 0

SpringCloud实战7-Config分布式配置管理

分布式环境下的统一配置框架,已经有不少了,比如百度的disconf,阿里的diamand 官方文档对spring Cloud Config的描述如下:   Spring Cloud Config为分布式系统中的外部配置提供服务器和客...

狂小白 ⋅ 05/21 ⋅ 0

史上最简单的 SpringCloud 教程

《史上最简单的 SpringCloud 教程》系列: 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka) 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon) 史上最...

外星人et59 ⋅ 04/21 ⋅ 0

SpringCloud实战9-Stream消息驱动

官方定义 Spring Cloud Stream 是一个构建消息驱动微服务的框架。   应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互,通过我们配置来 binding ,而 Spring Clo...

狂小白 ⋅ 05/29 ⋅ 0

EurekaServer高可用

前言 之前一篇文章文章《服务注册与发现---eureka》介绍了单点EurekaServer。但是实际环境中,这种单点的的模式可能会有很多隐形的问题。比如EurekaServer发生宕机,或者某些意外情况发生,很...

dalaoyang ⋅ 06/15 ⋅ 0

【Spring Cloud】分布式必学springcloud(一)——简介和看法

一、前言 开篇之前,我想说,springcloud会完胜dubbo。 小编以前做分布式是用的webservice、dubbo。最近的项目中,开始使用了springcloud,springcloud包含了很多的组件,这些组件是dubbo没有...

kisscatforever ⋅ 04/16 ⋅ 0

springcloud 高效率本地加Redis双级缓存

在springcloud中我们可以使用spring-boot-starter-data-redis已经为我们处理好分布式缓存,但是我们还是不满足于只存在于网络中传输的缓存,我们现在来扩展成本地加Redis双级缓存,这样就可以...

dounine ⋅ 04/19 ⋅ 0

springcloud架构搭建(一) Eureka服务器搭建及配置

springcloud架构搭建(一) Eureka服务器搭建及配置 今天开始准备学习一下springcloud的相关知识以及环境部署,并且搭建一套springcloud分布式框架: 本文只针对刚开始接触或者没有接触过spr...

itcloud ⋅ 05/21 ⋅ 0

服务链路追踪---Sleuth

Sleuth:日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案。 当服务与服务之间调用复杂时,SpringCloud Sleuth配合Zip...

dalaoyang ⋅ 04/26 ⋅ 0

5. 分布式配置中心客户端(测试) springcloud-config-client-test

建立空的子项目 springcloud-config-server 2. 修改 pom.xml 增加 修改后的 pom.xml 如下 3. 添加启动类 com.xnx3.springcloud.config.client.test.ConfigClientApplication 4. 添加类 com.......

鬼画符 ⋅ 04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 14分钟前 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 24分钟前 ⋅ 0

如何将S/4HANA系统存储的图片文件用Java程序保存到本地

我在S/4HANA的事务码MM02里为Material维护图片文件作为附件: 通过如下简单的ABAP代码即可将图片文件的二进制内容读取出来: REPORT zgos_api.DATA ls_appl_object TYPE gos_s_obj.DA...

JerryWang_SAP ⋅ 42分钟前 ⋅ 0

云计算的选择悖论如何对待?

导读 人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云...

问题终结者 ⋅ 50分钟前 ⋅ 0

637. Average of Levels in Binary Tree - LeetCode

Question 637. Average of Levels in Binary Tree Solution 思路:定义一个map,层数作为key,value保存每层的元素个数和所有元素的和,遍历这个树,把map里面填值,遍历结束后,再遍历这个map,把每...

yysue ⋅ 今天 ⋅ 0

IDEA配置和使用

版本控制 svn IDEA版本控制工具不能使用 VCS-->Enable Version Control Integration File-->Settings-->Plugins 搜索Subversion,勾选SVN和Git插件 删除.idea文件夹重新生成项目 安装SVN客户......

bithup ⋅ 今天 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 今天 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部