Table of Contents
简述
Netflix
Config
Bus
CloudFoundry
Open Service Broker
Cluster
Consul
Security
Sleuth
Data Flow
Stream
Stream APP Starters
Task
Task APP Starters
Zookeeper
OpenFeign
Gateway
Contract
Pipelines
Spring Cloud 提供了配置管理、服务治理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选分布式会话和集群状态管理等,一系列的解决方案
Spring Cloud Netflix 为 Spring Boot 程序提供了 Netflix OSS 集成,自动配置和绑定 Spring 环境和 Spring 编程模型。通过一些简单的注解,可以快速启用和配置程序中的常见模式,并使用 Netflix 组件构建大型分布式系统。提供的模式包括服务发现(Eureka)、断路器(Hystrix)、智能路由(Zuul)、客户负载均衡(Ribbon)。
Spring Cloud Netflix 特点:
入门
只要 Spring Cloud Netflix 和 Eureka Core 在 classpath 上,任何带有 @EnableEurekaClient 注解的 SpringBoot 程序都会连接 Eureka 服务器 http:\\localhost:8761(默认值 eureka.client.serviceUrl.defaultZone
)
@SpringBootApplication
@EnableEurekaClient
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
使用 spring-cloud-starter-netflix-eureka-server 依赖和 @EnableEurekaServer 注解
运行你自己的服务器
Spring Cloud Config 为分布式系统中的外部化配置提供了服务器和客户端支持。配置服务提供了一个中心位置来管理跨所有环境的程序的配置。客户机和服务器上的概念与 Spring Environment 和 PropertySource 抽象完全相同,因此它们非常适合 Spring 应用程序,而且可以用于以任何语言运行的任何应用程序。当应用程序通过部署管道从 dev 迁移到测试并进入生产环境时,可以管理这些环境之间的配置,并确保应用程序在迁移时拥有所需的一切配置信息。默认使用 Git 作为存储后端,支持配置环境的标记版本,可以通过各种编辑工具来修改内容。更容易添加配置。
特点
服务端
客户端(Spring Applications)
入门
只要 Spring Boot Actuator 和 Spring Config 在类路径中,任何 Spring Boot 程序都将试图连接 http:\\localhost:8888,默认值 :spring.cloud.config.uri。可以在系统配置或环境配置中在 bootstrap.properties/yml 中修改 spring.cloud.config.uri。
@Configuration
@EnableAutoConfiguration
@RestController
public class Application {
@Value("${config.name}")
String name = "World";
@RequestMapping("/")
public String home() {
return "Hello " + name;
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
实例中 config.name 的之值可能来自本地配置或远程服务器配置。默认情况下,配置服务器优先。查看程序中 configServer 属性源的 /env 节点。
要运行自己的服务器,请使用 spring-cloud-config-server 依赖项和 @EnableConfigServer。如果您设置了spring.config.name=configserver,应用程序将运行在端口8888上,并提供来自示例存储库的数据。您需要一个 spring.cloud.config.server.git.uri 用于根据您自己的需要定位配置数据(默认情况下,它是 git 存储库的位置,可以是一个本地文件:..URL)。
Spring Cloud Bus 使用轻量级消息代理连接分布式系统节点,可以用来广播状态修改或其他管理指令。目前唯一的实现是使用 AMQP 代理作为传输,但是相同的基本功能集(以及更多依赖于传输的功能)在其他传输的路线图上。
入门
只要 Spring Cloud Bus AMQP 和 RabbitMQ 在类路径上,任何 Spring 启动应用程序都会尝试联系本地主机上的 RabbitMQ 服务器 localhost:5672
( spring.rabbitmq.addresses
的默认值)
@Configuration
@EnableAutoConfiguration
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
集成带有 Cloud Foundry 的程序。提供服务发现实现,简单实现 SSO 和 OAuth2 受保护资源。
Spring Cloud Open Service Broker 是一个用 Spring Boot 构建的一个用来实现 Open Service Broker API 的应用程序。
Open Service Broker API 项目允许开发人员将服务交付给在云原生平台如 Cloud Foundry、Kubernetes 和 OpenShift 中运行的应用程序。Spring Cloud Open Service Broker 提供了一个基于 Spring Boot 的框架,允许在支持 Open Service Broker API 的平台上为自己管理的服务快速创建服务代理。
Spring Boot Config入门
在项目中使用 Spring Cloud Open Service Broker 的推荐方法是使用依赖项管理系统。可以将下面的一个代码片段复制并粘贴到 pom.xml 中。
3.x Release
在应用程序中包含 Spring Boot starter POM。这个初学者支持 Spring MVC 和基于 Spring WebFlux 的应用程序。
Maven:
org.springframework.cloud
spring-cloud-starter-open-service-broker
3.0.4.RELEASE
Gradle:
dependencies {
compile 'org.springframework.cloud:spring-cloud-starter-open-service-broker:3.0.4.RELEASE'
}
2.x Release
在应用程序中包含 Spring Boot starter POM。这个启动程序只支持基于 Spring MVC 的应用程序。
Maven:
org.springframework.cloud
spring-cloud-starter-open-service-broker-webmvc
2.1.2.RELEASE
Gradle:
dependencies {
compile 'org.springframework.cloud:spring-cloud-starter-open-service-broker-webmvc:2.1.2.RELEASE'
}
Spring Cloud Cluster 为在分布式系统中构建“集群”特性提供了一组原语。例如领导权选举、集群状态的一致存储、全局锁和一次性令牌。
通过自动配置并绑定到 Spring 环境和其他 Spring 编程模型习惯用法,Spring Cloud Consul 为 Spring 启动应用程序提供了 Consul 集成。通过一些简单的注释,您可以快速启用和配置应用程序中的公共模式,并使用 Hashicorp’s Consul 构建大型分布式系统。提供的模式包括服务发现、分布式配置和控制总线。
特点
入门
只要 Spring Cloud Consul 和 Consul API 在类路径上,任何带有 @EnableDiscoveryClient 的 Spring 启动应用程序都将尝试联系localhost:8500上的 Consul agen t( spring.cloud.consul.host 和 spring.cloud.consul.port 默认值):
@Configuration
@EnableAutoConfiguration
@EnableDiscoveryClient
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
本地 Consul agent 必须运行。
Spring Cloud Security 为构建安全的应用程序和服务提供了一组基本的方法。可以在外部(或集中)进行大量配置的声明式模型有助于实现大型系统的协作、远程组件,通常使用中央身份管理服务。它在云计算(Cloud Foundry)这样的服务平台上也非常容易使用。基于Spring Boot和Spring Security OAuth2,我们可以快速创建实现单点登录、令牌中继和令牌交换等常见模式的系统。
特点
入门
如果您的应用程序也有一个 Spring Cloud Zuul 嵌入式反向代理(使用 @EnableZuulProxy) ,那么您可以要求它将 OAuth2 访问令牌转发到其代理的服务。因此,上面的SSO应用程序可以简单地增强如下:
@SpringBootApplication
@EnableOAuth2Sso
@EnableZuulProxy
class Application {
}
它(除了登录用户并获取一个令牌之外)将身份验证令牌下发给 /proxy/* 服务。如果这些服务是用 @EnableResourceServer 实现的,那么它们将在正确的请求头中获得有效的令牌。
Spring Cloud Sleuth 为 Spring Cloud 实现了一个分布式跟踪解决方案,大量借鉴了 Dapper、Zipkin 和 HTrace。对于大多数用户来说,Sleuth 应该是不可见的,与外部系统的所有交互都应该自动检测。可以简单地在日志中捕获数据,或者将其发送到远程收集器服务。
特点
Span 是工作的基本单位。例如,发送 RPC 和向 RPC 发送响应一样,都是一个新的 Span。Span 的标识符是一个惟一的64位ID(用于 Span)和另一个64位ID(用于 Span 所属的跟踪)。span还包含其他数据,比如描述、键值注释、导致它们的 span 的 ID 以及进程 ID(通常是 IP 地址)。Spans 被启动和停止,它们记录它们的时间信息。一旦你创建了一个 span,你必须在将来的某个时候停止它。形成树状结构的一组跨度,称为 Trace。例如,如果您正在运行一个分布式大数据存储,那么可以通过一个put请求形成一个 trace。
添加依赖
Maven
org.springframework.cloud
spring-cloud-sleuth
${spring-cloud-sleuth.version}
pom
import
org.springframework.cloud
spring-cloud-starter-sleuth
Gradle
buildscript {
dependencies {
classpath "io.spring.gradle:dependency-management-plugin:0.5.2.RELEASE"
}
}
apply plugin: "io.spring.dependency-management"
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-sleuth:${springCloudSleuthVersion}"
}
}
dependencies {
compile 'org.springframework.cloud:spring-cloud-starter-sleuth'
}
只要 Spring Cloud Sleuth 在类路径上,任何 Spring 启动应用程序都会生成跟踪数据::
@SpringBootApplication
@RestController
public class Application {
private static Logger log = LoggerFactory.getLogger(DemoController.class);
@RequestMapping("/")
public String home() {
log.info("Handling home");
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
运行这个应用程序,然后点击主页。您将看到在日志中填充了traceId和spanId。如果这个应用程序调用另一个(如与RestTemplate),它将发送跟踪数据的标题,如果接收者是另一个侦察应用程序,你会看到跟踪继续在那里。
- 不需要显式地在处理程序中记录请求,您可以设置 logging.level.org.springframework.web.servlet. dispatcherservlet =DEBUG
- 如果您使用 Zipkin (直到2.1.x),可以通过设置 spring. sleux .sampler 来配置跨度输出的概率。概率(默认值:0.1,即10%)。否则,你可能会认为 Sleuth 不工作,因为它省略了一些跨度。从2.2.0开始,Sleuth将默认为速率有限采样器。这意味着它每秒将采样最多1000个事务。
- 设置spring.application.name=bar(实例)来查看服务名称以及跟踪和跨度id。
云计算和 Kubernetes 的基于微服务的流和批数据处理。
Spring Cloud Data Flow 提供了创建复杂拓扑的工具,用于流式和批处理数据管道。数据管道由 Spring Boot 应用程序组成,使用Spring Cloud Stream 或 Spring Cloud Task 微服务框架构建。
Spring Cloud Data Flow 支持一系列数据处理用例,从 ETL 到导入/导出、事件流和预测分析。
特点
Spring Cloud Data Flow 服务使用 Spring Cloud Deployer,将由 Spring Cloud Stream 或 Spring Cloud Task 应用程序组成的数据管道部署到 Cloud Foundry 和 Kubernetes 等现代平台上。
为各种数据集成和处理场景选择预先构建的流和任务/批处理启动程序有助于学习和实验。
针对不同中间件或数据服务的自定义流和任务应用程序可以使用熟悉的 Spring Boot 风格编程模型构建。
一个简单的流管道 DSL 可以很容易地指定要部署哪些应用程序,以及如何连接输出和输入。当一系列任务应用程序需要作为有向图运行时,组合任务 DSL 非常有用。
仪表板提供了一个图形化编辑器,用于交互式地构建数据管道,以及可部署应用程序的视图,并使用 Prometheus、InfluxDB 或其他监控系统的指标来监视它们。
Spring Cloud Data Flow 服务公开了用于组合和部署数据管道的 REST API。一个单独的 shell 使得从命令行使用 API变 得很容易。
入门
官方:Spring Cloud Data Flow Microsite
Spring Cloud Stream是一个框架,用于构建与共享消息传递系统连接的高度可伸缩的事件驱动微服务。
该框架提供了一个灵活的编程模型,该模型建立在已经建立的和熟悉的 Spring习 惯用法和最佳实践的基础上,包括对持久的发布/订阅语义、用户组和有状态分区的支持。
Spring Cloud Stream 支持各种绑定器实现,下表包含到 GitHub 项目的链接。
Spring Cloud Stream 的核心构件有:
Spring Cloud Stream App Starters 是基于 Spring Boot 的 Spring Integration 应用程序,它提供与外部系统的集成。
Spring Cloud Task允许用户使用Spring Cloud开发和运行短期的微服务,并在本地、云中甚至在Spring Cloud数据流上运行它们。只需添加@EnableTask并作为一个Spring启动应用程序(单个应用程序上下文)运行您的应用程序。
官方:https://docs.spring.io/spring-cloud-task/docs/2.0.0.RELEASE/reference/htmlsingle/#getting-started
Spring Cloud Task Application Starters 可以是任意 Spring Boot 程序。https://projects.spring.io/spring-batch[Spring Batch] 不会停止的 job,他们会在某个点结束或停止。Spring Cloud Task APP Starters 可以与Spring Cloud Data Flow 一起使用,以创建、部署和编排短期的数据微服务。
Spring Cloud ask Application Starters 是独立的可执行应用程序,可用于随需应变的用例,如数据库迁移、机器学习和计划的操作。这些应用程序可以在各种运行时平台上独立运行,包括:Cloud Foundry、Kubernetes、Docker,甚至在您的笔记本电脑上。
特点
可用的应用程序
运行一个示例任务启动程序
java -jar timestamp-task-***.jar
Task App Starters and Spring Cloud Data Flow (**)
Artifact Type |
Stable Release |
Milestone/Snapshot Release |
Maven |
http://bit.ly/Clark-GA-task-applications-maven |
http://bit.ly/Dearborn-M1-task-applications-maven |
Docker |
http://bit.ly/Clark-GA-task-applications-docker |
http://bit.ly/Dearborn-M1-task-applications-docker |
(**)通过查看参考指南中的 app-registration 部分,了解如何在 Spring Cloud Data Flow 中使用 app-starters
应用程序的HTTP存储库位置
在这里你可以找到任务应用的uber jar的直接链接。
Spring Cloud Zookeeper 通过自动配置和绑定到 Spring 环境以及其他 Spring 编程模型习惯用法,为 Spring 引导应用程序提供 Apache Zookeeper 集成。通过一些简单的注释,您可以快速启用和配置应用程序中的公共模式,并使用 Zookeeper 构建大型分布式系统。提供的模式包括服务发现和分布式配置。
特点
入门
只要 Spring Cloud Zookeeper、Apache administrator 和 Zookeeper Java 客户端在类路径上,任何带有 @EnableDiscoveryClient 的 Spring 启动应用程序都会尝试联系 localhost:2181 上的 Zookeeper 代理(zookeeper.connectString
的默认值)。
@Configuration
@EnableAutoConfiguration
@EnableDiscoveryClient
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
必须运行本地Zookeeper服务器。
本项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法,为 Spring 引导应用程序提供 OpenFeign 集成。
特点
@SpringBootApplication
@EnableFeignClients
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
@FeignClient("name")
static interface NameService {
@RequestMapping("/")
public String getName();
}
}
官方:https://github.com/OpenFeign/feign
该项目提供了一个库,用于在 Spring MVC 之上构建 API 网关。Spring Cloud Gateway 旨在提供一种简单而有效的方法来路由到 api,并为它们提供交叉关注点,例如:安全性、监视/指标和弹性。
特点
@SpringBootApplication
public class DemogatewayApplication {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("path_route", r -> r.path("/get")
.uri("http://httpbin.org"))
.route("host_route", r -> r.host("*.myhost.org")
.uri("http://httpbin.org"))
.route("rewrite_route", r -> r.host("*.rewrite.org")
.filters(f -> f.rewritePath("/foo/(?.*)", "/${segment}"))
.uri("http://httpbin.org"))
.route("hystrix_route", r -> r.host("*.hystrix.org")
.filters(f -> f.hystrix(c -> c.setName("slowcmd")))
.uri("http://httpbin.org"))
.route("hystrix_fallback_route", r -> r.host("*.hystrixfallback.org")
.filters(f -> f.hystrix(c -> c.setName("slowcmd").setFallbackUri("forward:/hystrixfallback")))
.uri("http://httpbin.org"))
.route("limit_route", r -> r
.host("*.limited.org").and().path("/anything/**")
.filters(f -> f.requestRateLimiter(c -> c.setRateLimiter(redisRateLimiter())))
.uri("http://httpbin.org"))
.build();
}
}
要运行您自己的网关,请使用 spring-cloud-starter-gateway 依赖项。