文档章节

SpringCloud源码走读--ConfigServer

子达
 子达
发布于 2016/07/11 14:59
字数 382
阅读 91
收藏 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);
     }
  }
}

© 著作权归作者所有

子达
粉丝 4
博文 11
码字总数 4161
作品 0
杭州
架构师
私信 提问
深入理解SpringCloud之分布式配置

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

java~nick
2018/05/22
0
0
史上最简单的 SpringCloud 教程 | 终章

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://blog.csdn.net/forezp。 https://blog.csdn.net/forezp/article/details/70148833 转载请标明出处...

方志朋
2017/04/12
0
0
SpringBlade 2.0 正式版发布,集成Nacos与Sentinel

大家新年好!经过一个半月的持续迭代,SpringBlade2.0的正式版终于发布了,同时全新官网上线。下面我们来看一下正式版有哪些惊喜。 SpringBlade简介: SpringBlade 2.0 是一个基于 Spring B...

smallchill
02/10
5.5K
10
Spring Cloud-honghu Cloud分布式微服务云系统

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

itcloud
2018/04/25
525
0
Spring Cloud-Honghu Cloud分布式微服务云系统(一)

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

明理萝
2018/09/07
242
1

没有更多内容

加载失败,请刷新页面

加载更多

Mysql的sql_mode模式

sql_mode 是一个很容易被忽视的配置,宽松模式下可能会被输入一些非准确数据,所以生产环境下会要求为严格模式,为了保持生产环境和开发环境,测试环境一致性,我们开发环境和测试环境也要配...

贾峰uk
26分钟前
2
0
Qt程序打包发布方法(使用官方提供的windeployqt工具)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/toTheUnknown/article/details/81748179 如果使用到了Qt ...

shzwork
55分钟前
7
0
MainThreadSupport

MainThreadSupport EventBus 3.0 中的代码片段. org.greenrobot.eventbus.MainThreadSupport 定义一个接口,并给出默认实现类. 调用者可以在EventBus的构建者中替换该实现. public interface ...

马湖村第九后羿
今天
3
0
指定要使用的形状来代替文字的显示

控制手机键盘弹出的功能只能在ios上实现,安卓是实现不了的,所以安卓只能使用type类型来控制键盘类型,例如你要弹出数字键盘就使用type="number",如果要弹出电话键盘就使用type="tel",但这...

前端老手
今天
8
0
总结:Raft协议

一、Raft协议是什么? 分布式一致性算法。即解决分布式系统中各个副本数据一致性问题。 二、Raft的日志广播过程 发送日志到所有Followers(Raft中将非Leader节点称为Follower)。 Followers收...

浮躁的码农
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部