文档章节

spring cloud config server源码解析

go4it
 go4it
发布于 2016/12/01 16:09
字数 439
阅读 189
收藏 2

##获取配置

curl -i http://config-server-host:port/{application}/{proflie}

##主要过程

输入图片说明

##ResourceController

@RequestMapping("/{name}/{profile}/{label}/**")
	public String resolve(@PathVariable String name, @PathVariable String profile,
			@PathVariable String label, HttpServletRequest request) throws IOException {
		String path = getFilePath(request, name, profile, label);
		return resolve(name, profile, label, path);
	}

###resolve方法

synchronized String resolve(String name, String profile, String label, String path)
			throws IOException {
		if (label != null && label.contains("(_)")) {
			// "(_)" is uncommon in a git branch name, but "/" cannot be matched
			// by Spring MVC
			label = label.replace("(_)", "/");
		}
		StandardEnvironment environment = prepareEnvironment(
				this.environmentRepository.findOne(name, profile, label));

		// ensure InputStream will be closed to prevent file locks on Windows
		try (InputStream is = this.resourceRepository.findOne(name, profile, label, path)
				.getInputStream()) {
			String text = StreamUtils.copyToString(is, Charset.forName("UTF-8"));
			return resolvePlaceholders(environment, text);
		}
	}

##GenericResourceRepository.findOne

public synchronized Resource findOne(String application, String profile, String label,
			String path) {
		String[] locations = this.service.getLocations(application, profile, label).getLocations();
		try {
			for (int i = locations.length; i-- > 0;) {
				String location = locations[i];
				for (String local : getProfilePaths(profile, path)) {
					Resource file = this.resourceLoader.getResource(location)
							.createRelative(local);
					if (file.exists() && file.isReadable()) {
						return file;
					}
				}
			}
		}
		catch (IOException e) {
			throw new NoSuchResourceException(
					"Error : " + path + ". (" + e.getMessage() + ")");
		}
		throw new NoSuchResourceException("Not found: " + path);
	}

##JGitEnvironmentRepository.getLocations

public synchronized Locations getLocations(String application, String profile,
			String label) {
		if (label == null) {
			label = this.defaultLabel;
		}
		String version = refresh(label);
		return new Locations(application, profile, label, version,
				getSearchLocations(getWorkingDirectory(), application, profile, label));
	}

##refresh

/**
	 * Get the working directory ready.
	 */
	private String refresh(String label) {
		initialize();
		Git git = null;
		try {
			git = createGitClient();
			if (shouldPull(git)) {
				fetch(git, label);
				//checkout after fetch so we can get any new branches, tags, ect.
				checkout(git, label);
				if(isBranch(git, label)) {
					//merge results from fetch
					merge(git, label);
					if (!isClean(git)) {
						logger.warn("The local repository is dirty. Resetting it to origin/"
								+ label + ".");
						resetHard(git, label, "refs/remotes/origin/" + label);
					}
				}
			}
			else{
				//nothing to update so just checkout
				checkout(git, label);
			}
			//always return what is currently HEAD as the version
			return git.getRepository().getRef("HEAD").getObjectId().getName();
		}
		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);
			}
		}
	}

##shouldPull

public /*public for testing*/ boolean shouldPull(Git git) throws GitAPIException {
		boolean shouldPull;
		Status gitStatus = git.status().call();
		boolean isWorkingTreeClean = gitStatus.isClean();
		String originUrl = git.getRepository().getConfig().getString("remote", "origin",
				"url");

		if (this.forcePull && !isWorkingTreeClean) {
			shouldPull = true;
			logDirty(gitStatus);
		}
		else {
			shouldPull = isWorkingTreeClean && originUrl != null;
		}
		if (!isWorkingTreeClean && !this.forcePull) {
			this.logger.info("Cannot pull from remote " + originUrl
					+ ", the working tree is not clean.");
		}
		return shouldPull;
	}

##docs

© 著作权归作者所有

go4it
粉丝 89
博文 1101
码字总数 1038833
作品 0
深圳
私信 提问
spring cloud下用nacos做配置中心的初步探究,替换spring config server

一, 背景: 1, 引入nacos来做配置中心 项目现在用的是spring cloud netflix,没有用到spring-cloud-alibaba的全家桶,但又想用到nacos来做配置中心,故按官网提供的方式是不行的 2, 探究下...

爱吃大肉包
04/11
282
3
java版spring cloud+spring boot+redis多租户社交电子商务平台 (六)分布式配置中心(Spring Cloud Config)

一、简介 电子商务社交平台源码请加企鹅求求:一零三八七七四六二六。在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring ...

sccspuercode
05/08
32
1
java B2B2C 多租户电子商城系统-(六)分布式配置中心(Spring Cloud Config)

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

01/22
0
0
(六)java b2b2c springcloud shop 多用户商城系统源码-分布式配置中心(Spring Cloud Config)

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

sccspuercode
02/16
74
1
史上最简单的 SpringCloud 教程 | 终章

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

方志朋
2017/04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis + Ehcache 二级缓存实例

二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕...

xiaolyuh
27分钟前
4
0
Spring源码学习(二)哎呦,按菜谱做菜与AbstractAutowireCapableBeanFactory.createBean流程差不多

记得跟老婆谈恋爱时,有一天心血来潮给老婆做饭,按照菜谱一步一步的做,结果差点把厨房烧了!!! 这事至今老婆还记得。 入口 上一篇说了,AbstractBeanFactory.getBean的主流程 ,今天来说下...

温安适
30分钟前
37
0
前端UI攻城狮 你们该抛弃jQuery了

你不再需要jQuery! Web工程师太依赖jQuery了,某种意义上说jQuery已经成了JavaScript的同义词。但是我们真的需要他么?或许我们应该反思一下什么时候才真的需要jQuery。 对我个人而言开始使...

前端老手
31分钟前
5
0
六、Java设计模式之工厂方法

工厂方法定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 类型:创建型 工厂方法-使用场景: 创建对象需要大量重复的代码 ...

东风破2019
今天
6
0
win服务器管理遇到的一系列问题记录

有些小伙伴在使用iis7远程桌面管理工具的时候总是会遇到一系列的问题,下面就是为大家介绍一下服务器日常管理过程中出现的问题及我的解决办法和心得。希望能帮到大家。   拒绝服务器重新启...

1717197346
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部