[TOC]

0 放在前面

0.1 参考文档

0.2 maven配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
</dependencies>

0.3 简介

Spring Cloud为开发人员提供了快速构建分布式系统中的一些通用模式(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式 会话,群集状态)。 分布式系统的协调引出样板模式(boiler plate patterns),并且使用Spring Cloud开发人员可以快速地实现这些模式来启动服务和应用程序。 它们可以在任何分布式环境中正常工作,包括开发人员自己的笔记本电脑,裸机数据中心和受管平台,如Cloud Foundry。

Version: Brixton.SR7


1 特征

Spring Cloud专注于为经典用例和扩展机制提供良好的开箱即用

  • 分布式/版本配置
  • 服务注册与发现
  • 路由选择
  • 服务调用
  • 负载均衡
  • 熔断机制
  • 全局锁
  • 领导人选举和集群状态
  • 分布式消息

2 原生云应用程序

原生云是应用程序开发的一种风格,鼓励在持续交付和价值驱动领域的最佳实践。

Spring Cloud的很多特性是基于Spring Boot的。更多的是由两个库实现:Spring Cloud Context and Spring Cloud Commons。

2.1 Spring Cloud Context: 应用上下文服务

Spring Boot关于使用Spring构建应用有硬性规定:通用的配置文件在固定的位置,通用管理终端,监控任务。建立在这个基础上,Spring Cloud增加了一些额外的特性。

2.1.1 引导应用程序上下文

Spring Cloud会创建一个“bootstrap”的上下文,这是主应用程序的父上下文。对应的配置文件拥有最高优先级,并且,默认不能被本地配置文件覆盖。对应的文件名bootstrap.yml或bootstrap.properties。

可通过设置spring.cloud.bootstrap.enabled=false来禁止bootstrap进程。

2.1.2 应用上下文层级结构

当用SpringApplicationSpringApplicationBuilder创建应用程序上下文时,bootstrap上下文将作为父上下文被添加进去,子上下文将继承父上下文的属性。

子上下文的配置信息可覆盖父上下文的配置信息。

2.1.3 修改Bootstrap配置文件位置

spring.cloud.bootstrap.name(默认是bootstrap),或者spring.cloud.bootstrap.location(默认是空)

2.1.4 覆盖远程配置文件的值

spring.cloud.config.allowOverride=true

spring.cloud.config.overrideNone=true

spring.cloud.config.overrideSystemProperties=false

2.1.5 定制Bootstrap配置

/META-INF/spring.factories的key为org.springframework.cloud.bootstrap.BootstrapConfiguration,定义了Bootstrap启动的组件。

在主应用程序启动之前,一开始Bootstrap上下文创建在spring.factories文件中的组件,然后是@Beans类型的bean。

2.1.6 定制Bootstrap属性来源

关键点:spring.factories、PropertySourceLocator

2.1.7 环境改变

应用程序可通过EnvironmentChangedEvent监听应用程序并做出响应。

2.1.8 Refresh Scope

Spring的bean被@RefreshScope将做特殊处理,可用于刷新bean的配置信息。

注意

2.1.9 加密和解密

Spring Cloud可对配置文件的值进行加密。

如果有"Illegal key size"异常,那么需要安装JCE。

2.1.10 服务点

除了Spring Boot提供的服务点,Spring Cloud也提供了一些服务点用于管理,注意都是POST请求

  • /env:更新Environment、重新绑定@ConfigurationProperties跟日志级别
  • /refresh重新加载配置文件,刷新标记@RefreshScope的bean
  • /restart重启应用,默认不可用
  • 生命周期方法:/pause/resume

2.2 Spring Cloud Commons:通用抽象

服务发现、负载均衡、熔断机制这种模式为Spring Cloud客户端提供了一个通用的抽象层。

2.2.1 RestTemplate作为负载均衡客户端

通过@Bean@LoadBalanced指定RestTemplate。注意URI需要使用虚拟域名(如服务名,不能用域名)。

如下:

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

public class MyClass {
    @Autowired
    private RestTemplate restTemplate;

    public String doOtherStuff() {
        String results = restTemplate.getForObject("http://stores/stores", String.class);
        return results;
    }
}

2.2.2 多个RestTemplate对象

注意@Primary注解的使用。

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    RestTemplate loadBalanced() {
        return new RestTemplate();
    }

    @Primary
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

public class MyClass {
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    @LoadBalanced
    private RestTemplate loadBalanced;

    public String doOtherStuff() {
        return loadBalanced.getForObject("http://stores/stores", String.class);
    }

    public String doStuff() {
        return restTemplate.getForObject("http://example.com", String.class);
    }
}

2.2.3 忽略网络接口

忽略确定名字的服务发现注册,支持正则表达式配置。


3 Spring Cloud Config

Spring Cloud Config提供服务端和客户端在分布式系统中扩展配置。支持不同环境的配置(开发、测试、生产)。使用Git做默认配置后端,可支持配置环境打版本标签。

3.1 快速开始

可通过IDE运行或maven运行。

默认加载property资源的策略是克隆一个git仓库(at spring.cloud.config.server.git.uri')。

HTTP服务资源的构成:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

application是SpringApplication的spring.config.name,(一般来说'application'是一个常规的Spring Boot应用),profile是一个active的profile(或者逗号分隔的属性列表),label是一个可选的git标签(默认为"master")。

3.1.1 客户端示例

创建以Spring Boot应用即可,添加依赖“org.springframework.cloud:spring-cloud-starter-config”。

配置application.properties,注意URL为配置服务端的地址

spring.cloud.config.uri: http://myconfigserver.com

3.2 Spring Cloud Config 服务端

针对系统外的配置项(如name-value对或相同功能的YAML内容),该服务器提供了基于资源的HTTP接口。使用@EnableConfigServer注解,该服务器可以很容易的被嵌入到Spring Boot 系统中。使用该注解之后该应用系统就是一个配置服务器。

@SpringBootApplication
@EnableConfigServer
public class ConfigApplicion {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(ConfigApplicion.class, args);
    }
}

3.2.1 资源库环境

  • {application} 对应客户端的"spring.application.name"属性
  • {profile} 对应客户端的 "spring.profiles.active"属性(逗号分隔的列表)
  • {label} 对应服务端属性,这个属性能标示一组配置文件的版本

如果配置库是基于文件的,服务器将从application.yml和foo.yml中创建一个Environment对象。高优先级的配置优先转成Environment对象中的PropertySource

3.2.1.1 Git后端

默认的EnvironmentRepository是用Git后端进行实现的,Git后端对于管理升级和物理环境是很方便的,对审计配置变更也很方便。也可以file:前缀从本地配置库中读取数据。

这个配置库的实现通过映射HTTP资源的{label}参数作为git label(提交id,分支名称或tag)。如果git分支或tag的名称包含一个斜杠 ("/"),此时HTTP URL中的label需要使用特殊字符串"(_)"来替代(为了避免与其他URL路径相互混淆)。如果使用了命令行客户端如 curl,请谨慎处理URL中的括号(例如:在shell下请使用引号''来转义它们)。

Git URI占位符

Spring Cloud Config Server支持git库URL中包含针对{application}和 {profile}的占位符(如果你需要,{label}也可包含占位符, 不过要牢记的是任何情况下label只指git的label)。所以,你可以很容易的支持“一个应用系统一个配置库”策略或“一个profile一个配置库”策略。

模式匹配和多资源库

spring:
cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          repos:
            simple: https://github.com/simple/config-repo
            special:
              pattern: special*/dev*,*special*/dev*
              uri: https://github.com/special/config-repo
            local:
              pattern: local*
              uri: file:/home/configsvc/config-repo

如果 {application}/{profile}不能匹配任何表达式,那么将使用“spring.cloud.config.server.git.uri”对应的值。在上例子中,对于 "simple" 配置库, 匹配模式是simple/* (也就说,无论profile是什么,它只匹配application名称为“simple”的应用系统)。“local”库匹配所有application名称以“local”开头任何应用系统,不管profiles是什么(来实现覆盖因没有配置对profile的匹配规则,“/*”后缀会被自动的增加到任何的匹配表达式中)。

Git搜索路径中的占位符

spring.cloud.config.server.git.searchPaths

3.2.1.2 版本控制后端文件系统使用

伴随着版本控制系统作为后端(git、svn),文件都会被check outclone 到本地文件系统中。默认这些文件会被放置到以config-repo-为前缀的系统临时目录中。在Linux上,譬如应该是/tmp/config-repo-<randomid>目录。有些操作系统routinely clean out放到临时目录中,这会导致不可预知的问题出现。为了避免这个问题,通过设置spring.cloud.config.server.git.basedirspring.cloud.config.server.svn.basedir参数值为非系统临时目录。

3.2.1.3 文件系统后端

使用本地加载配置文件。

需要配置:spring.cloud.config.server.native.searchLocationsspring.profiles.active=native

路径配置格式:classpath:/, classpath:/config,file:./, file:./config

3.2.1.4 共享配置给所有应用

基于文件的资源库

在基于文件的资源库中(i.e. git, svn and native),这样的文件名application*命名的资源在所有的客户端都是共享的(如 application.properties, application.yml, application-*.properties,etc.)。

属性覆盖

“spring.cloud.config.server.overrides”添加一个Map类型的name-value对来实现覆盖。

例如

spring:
  cloud:
    config:
      server:
        overrides:
          foo: bar

会使所有的配置客户端应用程序读取foo=bar到他们自己配置参数中。

3.2.2 健康指示器

通过这个指示器能够检查已经配置的EnvironmentRepository是否正常运行。

通过设置spring.cloud.config.server.health.enabled=false参数来禁用健康指示器。

3.2.3 安全

你可以自由选择任何你觉得合理的方式来保护你的Config Server(从物理网络安全到OAuth2 令牌),同时使用Spring Security和Spring Boot 能使你做更多其他有用的事情。

为了使用默认的Spring Boot HTTP Basic 安全,只需要把Spring Security 增加到classpath中(如org.springframework.boot.spring-boot-starter-security)。默认的用户名是“user”,对应的会生成一个随机密码,这种情况在实际使用中并没有意义,一般建议配置一个密码(通过 security.user.password属性进行配置)并对这个密码进行加密。

3.2.4 加密与解密

如果远程属性包含加密内容(以{cipher}开头),这些值将在通过HTTP传递到客户端之前被解密。

使用略

3.2.5 密钥管理

配置服务可以使用对称(共享)密钥或者非对称密钥(RSA密钥对)。

使用略

3.2.6 创建一个测试密钥库

3.2.7 使用多密钥和循环密钥

3.2.8 加密属性服务


3.3 可替换格式服务

配置文件可加后缀".yml"、".yaml"、".properties"


3.4 文本解释服务

/{name}/{profile}/{label}/{path}


3.5 嵌入配置服务器

一般配置服务运行在单独的应用里面,只要使用注解@EnableConfigServer即可嵌入到其他应用。


3.6 推送通知和总线

添加依赖spring-cloud-config-monitor,激活Spring Cloud 总线,/monitor端点即可用。

当webhook激活,针对应用程序可能已经变化了的,配置服务端将发送一个RefreshRemoteApplicationEvent


3.7 客户端配置

3.7.1 配置第一次引导

通过spring.cloud.config.uri属性配置Config Server地址

3.7.2 发现第一次引导

如果用的是Netflix,则用eureka.client.serviceUrl.defaultZone进行配置。

3.7.3 配置客户端快速失败

在一些例子里面,可能希望在没有连接配置服务端时直接启动失败。可通过spring.cloud.config.failFast=true进行配置。

3.7.4 配置客户端重试

添加依赖spring-retryspring-boot-starter-aop,设置spring.cloud.config.failFast=true。默认的是6次重试,初始补偿间隔是1000ms,后续补偿为1.1指数乘数,可通过spring.cloud.config.retry.*配置进行修改。

3.7.5 定位远程配置资源

路径:/{name}/{profile}/{label}

  • "name" = ${spring.application.name}
  • "profile" = ${spring.profiles.active} (actually Environment.getActiveProfiles())
  • "label" = "master"

label对于回滚到之前的版本很有用。

3.7.6 安全

通过spring.cloud.config.passwordspring.cloud.config.username进行配置。

Spring Cloud 学习笔记(一)——入门、特征、配置的更多相关文章

  1. Spring Cloud学习笔记【十】配置中心(消息驱动刷新配置)

    上一篇中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用 Webhook 的机制每次提交代码发送请求来刷新客户端,当客户端越来越多的时候,需要每个客户端都执行一遍,这种方案 ...

  2. Spring Cloud学习笔记【九】配置中心Spring Cloud Config

    Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端 ...

  3. Spring Cloud学习笔记-010

    分布式配置中心:Spring Cloud Config Spring Cloud Config是Spring Cloud团队创建的一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外 ...

  4. Spring Cloud学习笔记--Spring Boot初次搭建

    1. Spring Boot简介 初次接触Spring的时候,我感觉这是一个很难接触的框架,因为其庞杂的配置文件,我最不喜欢的就是xml文件,这种文件的可读性很不好.所以很久以来我的Spring学习都 ...

  5. Spring Cloud 学习笔记(二)——Netflix

    4 Spring Cloud Netflix Spring Cloud 通过自动配置和绑定到Spring环境和其他Spring编程模型惯例,为Spring Boot应用程序提供Netflix OSS集 ...

  6. Spring Cloud学习笔记-005

    服务消费者 之前已经搭建好了微服务中的核心组件——服务注册中心(包括单节点模式和高可用模式).也有了服务提供者,接下来搭建一个服务消费者,它主要完成两个目标,发现服务以及消费服务.其中,服务发现的任务 ...

  7. Spring Cloud学习笔记-007

    声明式服务调用:Spring Cloud Feign Feign基于Netflix Feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两 ...

  8. Spring Cloud学习笔记-009

    API网关服务:Spring Cloud Zuul API网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的Façade模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户 ...

  9. spring cloud 学习笔记(1)

    SpringCloud + Eureka / Nacos git:https://github.com/huanmsf/springCloudLearn.git 项目目录: 父pom: <?xm ...

随机推荐

  1. 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体

    注:本文适用.net 2.0+的winform项目 目的: 点击页面中的target="_blank"链接时,弹出新窗体 页面中有window.close()操作时,关闭窗体 上述 ...

  2. all requires API level 3 (current min is 1)问题的解决

    几次出现了all requires API level 3 (current min is 1)的错误,后来发现解决的方法是右键单击项目文件夹,选择Android Tools->Clear Li ...

  3. zabbix3.0报错记录

    一.问题描述 在zabbix_server添加变量时,出现了以下的报错,

  4. 蓝牙BLE LINK LAYER剖析(一) -- status and channel

    一.LINK LAYER STATES 二.PHYSICAL CHANNEL

  5. Amazon 开始接受 Windows 礼品卡预订

    在 8 月微软虚拟货币系统 Microsoft Points 已经正式被真实货币替代,但目前,配套真实货币系统将推出的礼品卡还并没有开始销售.Amazon 上的一则预订显示“Windows 礼品卡”( ...

  6. [转] Android自动测试之monkeyrunner工具(二)

    monkeyrunner工具  前言: 最近开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括android测试框架.CTS.Monkey.Monkeyru ...

  7. [r]Setting up Django and your web server with uWSGI and nginx

    Setting up Django and your web server with uWSGI and nginx This tutorial is aimed at the Django user ...

  8. LED发光二极管

    半导体发光器件包括半导体发光二极管(简称LED).数码管.符号管.米字管及点阵式显示屏(简称矩阵管)等.事实上,数码管.符号管.米字管及矩阵管中的每个发光单元都是一个发光二极管. 一. 半导体发光二极 ...

  9. 每天一个linux命令:du

    1.命令简介 du (Disk usage) 用来计算每个文件的磁盘用量,目录则取总用量. 2.用法 用法:du [选项]... [文件]... 或:du [选项]... --files0-from= ...

  10. org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class &#39;com.microsoft.sqlserver.jdbc.SQLServerDriver &#39;

    问题摘要: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nest ...