文档章节

SpringCloud源码走读--ConfigServer

子达
 子达
发布于 2016/07/11 14:59
字数 382
阅读 71
收藏 1

先占个坑,这篇主要记录查找更新失败的问题上, 后期有时间会详细补充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
博文 6
码字总数 3170
作品 0
杭州
高级程序员
深入理解SpringCloud之分布式配置

  Spring Cloud Config Server能够统一管理配置,我们绝大多数情况都是基于git或者svn作为其配置仓库,其实SpringCloud还可以把数据库作为配置仓库,今天我们就来了解一下。顺便分析一下其...

java~nick
05/22
0
0
Spring Cloud-Honghu Cloud分布式微服务云系统(一)

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

明理萝
09/07
0
0
Spring Cloud-honghu Cloud分布式微服务云系统

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

itcloud
04/25
0
0
SpringCloud实战7-Config分布式配置管理

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

狂小白
05/21
0
0
EurekaServer高可用

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

dalaoyang
06/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Coding and Paper Letter(二十四)

资源整理。这一次内容有点多,拆为两篇,这一篇主要针对Coding。 Coding: 1.R语言包geex,用于估计参数的框架和来自R中的一组无偏估计方程(即M-估计)的经验夹层协方差矩阵。 geex 2.R语言...

胖胖雕
4分钟前
0
0
Python中使用SQLite

SQLite: SQLite是一种数据库,Python中集成了SQLite3,所以在Python中使用SQLite,可以直接导入SQLite包,不需要做额外的配置。 更多的SQLite简介和相关知识可以查看专门的教程:http://ww...

akane_oimo
6分钟前
0
0
05《Java核心技术36讲》之几种字符串类有什么区别?

一、提出问题 今天,我们来聊聊日常使用的字符串,别看它似乎很简单,但其实字符串几乎在所有编程语言里都是个特殊的存在,因为不管是数量还是体积,字符串都是大多数应用中的重要组成。 今天...

飞鱼说编程
25分钟前
0
0
Univalsal_ImageLoader源码结构与创建者模式 初步小结

最近在回归看Univalsal_ImageLoader源码,本想自己也实现试试写一个,看源码是为了学习看能否使用,助于自己可以写出有自己逻辑结构的代码。 首先我们初始化ImageLoader的配置初始化的时候,...

DannyCoder
57分钟前
0
0
计算卷积神经网络浮点数运算量

前言 本文主要是介绍了,给定一个卷积神经网络的配置之后,如何大概估算它的浮点数运算量。 相关代码:CalFlops,基于MXNet框架的 Scala 接口实现的一个计算MXNet网络模型运算量的demo。 正文...

Ldpe2G
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部