J360-cloud SpringCloud系列一:分布式配置服务器ConfigServer

分布式配置

Spring Cloud分布式配置服务由服务器端和客户端共同组成,Server端提供配置信息的存储管理,客户端完成配置信息的调度,工程结构如下

套用一个图来解释该部分在springCloud分布式系统中的结构

上面的图片说明了四个微服务以及各个服务之间的依赖关系。
configuration service 处于最顶端,黄色标识,而且被其他微服务所依赖。
discovery service 处于最低端,蓝色标识,同时也被其他服务所依赖。

  • bootstrap.yml
  • application.yml
  • 【注】建议采用bootstrap+application组合形式,一般bootstrap配置工程不可变参数,且在启动时需要设定的内容,application配置可变参数
    J360-cloud-configserver

1、POM依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-eureka</artifactId>
                </dependency>

2、注解

  • configserver提供了HTTP,为外部资源提供API配置的服务,只需要在Springboot程序中提供@EnableConfigServer注解即可。

    • @EnableConfigServer
    • 增加以下依赖 eureka(可选,作为discover服务器必选)

3、配置文件

bootstrap.properties

spring.application.name=configserver

spring.cloud.config.uri=http://localhost:8888

application.properties

server.port=8888

spring.cloud.config.server.git.uri=https://github.com/xuminwlt/config-repo

4、spring-boot:run

http://localhost:8888/configserver/application.properties

1、POM

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

2、配置

bootstrap.properties

spring.application.name=client
spring.cloud.config.uri=http://localhost:8888

application.properties

server.port=8080

apply.message=local message
user.username=xumin

3、spring-boot:run

4、http://localhost:8080/env 查看环境变量

5、http://localhost:8080/refresh post方法,更新client中的配置

【注】环境变量刷新

- post -> localhost:8080/refresh

- 定时

- 手动

环境变量仓库

默认的环境变量库使用git服务,也可以使用文件系统的服务

1、git服务

https://github.com/xuminwlt/config-repo

2、文件服务

使用 spring.profiles.active=native

环境变量仓库使用3个变量:

  • {application} 在客户端映射到"spring.application.name"
  • {profile} 在客户端映射到"spring.active.profiles",使用逗号分隔
  • {label}这是一个服务器端功能标签“版本”的一组配置文件

自动刷新

当环境变量参数通过git更新后,客户端自动更新:

1:可以使用 post /refresh来执行,客户端调用更新功能,configServer pull git完成后,更新环境变量信息,客户端获取最新的环境变量,并且更新

2:定时器执行:每隔X时间段更新一次

3:根据需要执行:只需要将定时器调用的更新接口暴露成服务形式调用

多客户端更新服务

1:通过Spring Cloud Bus更新

2:其他广播形式调用接口

调用接口:

/**
 * 手动刷新git更新方案,每20S执行一次,可以修改成手动执行,同/refresh
 * @link RefreshEndpoint
 * */
public void refresh() {
    Map<String, Object> before = extract(context.getEnvironment()
            .getPropertySources());
    addConfigFilesToEnvironment();
    Set<String> keys = changes(before,
            extract(context.getEnvironment().getPropertySources())).keySet();
    scope.refreshAll();

    context.publishEvent(new EnvironmentChangeEvent(keys));
}
@Configuration
protected static class Empty {

}

private void addConfigFilesToEnvironment() {
    ConfigurableApplicationContext capture = null;
    try {
        capture = new SpringApplicationBuilder(Empty.class).showBanner(false)
                .web(false).environment(context.getEnvironment()).run();
        MutablePropertySources target = context.getEnvironment().getPropertySources();
        for (PropertySource<?> source : capture.getEnvironment().getPropertySources()) {
            String name = source.getName();
            if (!standardSources.contains(name)) {
                if (target.contains(name)) {
                    target.replace(name, source);
                }
                else {
                    if (target.contains("defaultProperties")) {
                        target.addBefore("defaultProperties", source);
                    }
                    else {
                        target.addLast(source);
                    }
                }
            }
        }
    }
    finally {
        while (capture != null) {
            capture.close();
            ApplicationContext parent = capture.getParent();
            if (parent instanceof ConfigurableApplicationContext) {
                capture = (ConfigurableApplicationContext) parent;
            } else {
                capture = null;
            }
        }
    }
}

private Map<String, Object> changes(Map<String, Object> before,
                                    Map<String, Object> after) {
    Map<String, Object> result = new HashMap<String, Object>();
    for (String key : before.keySet()) {
        if (!after.containsKey(key)) {
            result.put(key, null);
        }
        else if (!equal(before.get(key), after.get(key))) {
            result.put(key, after.get(key));
        }
    }
    for (String key : after.keySet()) {
        if (!before.containsKey(key)) {
            result.put(key, after.get(key));
        }
    }
    return result;
}

private boolean equal(Object one, Object two) {
    if (one == null && two == null) {
        return true;
    }
    if (one == null || two == null) {
        return false;
    }
    return one.equals(two);
}

private Map<String, Object> extract(MutablePropertySources propertySources) {
    Map<String, Object> result = new HashMap<String, Object>();
    for (PropertySource<?> parent : propertySources) {
        if (!standardSources.contains(parent.getName())) {
            extract(parent, result);
        }
    }
    return result;
}

private void extract(PropertySource<?> parent, Map<String, Object> result) {
    if (parent instanceof CompositePropertySource) {
        try {
            for (PropertySource<?> source : ((CompositePropertySource) parent)
                    .getPropertySources()) {
                extract(source, result);
            }
        }
        catch (Exception e) {
            return;
        }
    }
    else if (parent instanceof EnumerablePropertySource) {
        for (String key : ((EnumerablePropertySource<?>) parent).getPropertyNames()) {
            result.put(key, parent.getProperty(key));
        }
    }
}

文章转载自 开源中国社区[https://www.oschina.net]

时间: 2024-11-05 14:44:18

J360-cloud SpringCloud系列一:分布式配置服务器ConfigServer的相关文章

springcloud config 分布式配置中心

一.介绍 1.场景: 微服务系统中,系统多.实例多,如果每个系统都有自己一套配置加载.维护的机制,会导致在生产过程中因为配置问题引发的不必要的沟通成本.故障风险.需要采用分布式配置中心统一管理.统一实现方式. 2.Spring cloud config特性 服务端:存储方式(git.svn.本地文件).配置读取方式(环境化.多项目仓库).安全性(访问密码.加密存储).自动刷新. 客户端:加载远程配置.刷新配置.@refreshscope作用域刷新.集成消息总线. 二.docker中运行gitla

Docker生态系统系列之三:服务发现和分布式配置存储

本文讲的是Docker生态系统系列之三:服务发现和分布式配置存储,[编者的话]本文介绍了服务发现与全局可读配置存储两部分内容,不仅介绍了工作原理和工作方式,也介绍了与之相关的故障检测.重配置和安全问题,最后还介绍了常用的服务发现项目.整篇文章将这个知识点介绍的很全面细致,让读者能够对服务发现和全局可读配置存储有一个全面的认识,值得学习. 介绍 容器给寻找大规模设计与部署应用的需求提供了一个优雅的解决方案.在Docker提供实际容器技术的同时,许多其他的项目也在协助开发在部署环境中所需要的引导和沟

服务器部署十大问题系列二:配置与升级

本系列文章介绍数据中心服务器部署前后整个过程需要考虑到的十个基础问题.第一部分<服务器部署十大问题系列一:软件与硬件>中,我们介绍了新增服务器对当前设施有哪些影响,以及软硬件方面需要考虑的问题. 本文为系列二,主要介绍在配置服务器时应该注意的问题,因为即使是对最能干和熟练的IT专业人士来说,手动配置也不仅耗时也是个易错的过程.另外,新的服务器需要有正确的打补丁和升级方式等等. 服务器配置有没有清晰的模板? 新的服务器需要通过安装软件.设置服务器角色.设定IP地址,通过域名系统和Active D

大型网站架构系列:分布式消息队列(一) (转)

以下是消息队列以下的大纲,本文主要介绍消息队列概述,消息队列应用场景和消息中间件示例(电商,日志系统). 本次分享大纲 消息队列概述 消息队列应用场景 消息中间件示例 JMS消息服务(见第二篇:大型网站架构系列:分布式消息队列(二)) 常用消息队列(见第二篇:大型网站架构系列:分布式消息队列(二)) 参考(推荐)资料(见第二篇:大型网站架构系列:分布式消息队列(二)) 本次分享总结(见第二篇:大型网站架构系列:分布式消息队列(二)) 一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要

大型网站架构系列:分布式消息队列(一)

以下是消息队列以下的大纲,本文主要介绍消息队列概述,消息队列应用场景和消息中间件示例(电商,日志系统). 本次分享大纲 消息队列概述 消息队列应用场景 消息中间件示例 JMS消息服务(见第二篇:大型网站架构系列:分布式消息队列(二)) 常用消息队列(见第二篇:大型网站架构系列:分布式消息队列(二)) 参考(推荐)资料(见第二篇:大型网站架构系列:分布式消息队列(二)) 本次分享总结(见第二篇:大型网站架构系列:分布式消息队列(二)) 一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要

ASP编程入门进阶(一) 安装配置服务器

编程|服务器|服务器 申明:asp编程入门进阶系列文章COPY自http://www.cnbruce.com/blog/ 部分运行代码请到该站进行在线测试ASP编程入门进阶(一):安装配置服务器 鉴于ASP脚本语言是在服务器端IIS或PWS中解释和运行,并可动态生成普通的HTML网页,然后再传送到客户端供浏览的这一特点.我们要在本机上进行调试,那就要求我们的个人电脑具有服务器的功能. 不要看到"服务器"三个字就感到担心:我的机子配置这么底,性能这么差,是不是不能配啊.放心!配个服务器,

spring cloud放弃系列之--1-config

是什么 Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持.使用Config Server,您可以集中管理所有环境中应用程序的外部属性 干嘛用 统一管理各个微服务的配置文件 怎么用 引入jar <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-serve

IBM充分利用云计算各种资源自动配置服务器

最近的一系列市场活动表明,在完善云计算技术平台的道路上,蓝色巨人正在迈开大步.在不久前刚刚发布了一款生成能够帮助用户更高效的管理跨平台虚拟服务器.降低数据中心成本的系统级软件--VM Control的同时,IBM透露有更高性能的Power7处理器也计划会在明年早些时候推出.此外,在一年一度的IBM Rational软件开发论坛上发布的基于"软件经济学"的理论的Rational Insight.MCIF等新产品也有助于企业在云环境中部署软件交付平台. IBM公司推出了针对公共云和私有云环

ftp服务器-毕设求大神指点!!题目是基于SaaS模式的分布式FTP服务器技术研究

问题描述 毕设求大神指点!!题目是基于SaaS模式的分布式FTP服务器技术研究 内容是: 目前,云计算正在各领域得到越来越多的应用,出现了多种云计算环境,掌握云计算的概念,熟悉相关云计算平台上的软件开发方法,对提高学生综合运用所学知识解决实际问题具有十分重要的现实意义.作为云计算平台之一的百度云,已得到了广泛应用, 本课题在理解FTP服务器模式的前提下,在saas环境下建立分布式的ftp服务,用户可通过ftp客户端传送数据. 该课题具有以下要求: 1. 了解云计算的基本原理,掌握基于saas的开