SpringCloud学习笔记二:总架构概略

这篇博客主要讲 SpringCloud 架构,不会细讲,总的介绍一下 SpringCloud 整体架构

springCloud-total-framework

对 SpringCloud 技术名称的理解

1、Sleuth-链路跟踪 为服务之间调用提供链路追踪。通过 Sleuth 可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长。从而让我们可以很方便的理清各微服务间的调用关系。

2、断路器(Hystrix)在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在 Spring Cloud 可以用 RestTemplate+Ribbon 和 Feign 来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证 100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet 容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。Netflix 开源了 Hystrix 组件,实现了断路器模式,SpringCloud 对这一组件进行了整合

3、Turbine 集群监控 Turbine 是聚合服务器发送事件流数据的一个工具,用来监控集群下 hystrix 的 metrics 情况。 通过 turbine 可以监控集群的请求量,可以知道系统的请求高峰期,从而更好的知道系统的短板在哪里。

4、Consul 服务治理 和 Eureka 服务治理 由于 Spring Cloud 为服务治理做了一层抽象接口,所以在 Spring Cloud 应用中可以支持多种不同的服务治理框架,比如:Netflix Eureka、Consul、Zookeeper。

Spring Cloud Consul 项目是针对 Consul 的服务治理实现。Consul 是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。它包含了下面几个特性:服务发现、 健康检查、 Key/Value 存储、 多数据中心。由于 Consul 自身提供了服务端,所以我们不需要像之前实现 Eureka 的时候创建服务注册中心,直接通过下载 consul 的服务端程序就可以使用。Consul 比 Eureka 注册支持的更多一些。

5、config 配置管理 引入 spring cloud config 后,我们的外部配置文件就可以集中放置在一个 git 仓库里,再新建一个 config server,用来管理所有的配置文件,维护的时候需要更改配置时,只需要在本地更改后,推送到远程仓库,所有的服务实例都可以通过 config server 来获取配置文件,这时每个服务实例就相当于配置服务的客户端 config client,为了保证系统的稳定,配置服务端 config server 可以进行集群部署

6、Nginx 用来做反向代理、负载均衡,当有请求的时候,根据配置的调度策略(加权轮询、IP 哈希、最少连接数、一致性哈希)给请求者返回相应的服务器 IP。

7、Zuul 服务网关 zuul 的核心是一系列的 filters, 其作用可以类比 Servlet 框架的 Filter Zuul 的主要功能是路由和过滤器。是各种服务的统一入口,同时还会用来提供监控、授权、安全、调度等等;可以通过扩展 ZuulFilter,在执行方法之前,做各种检查工作。

SpringCloud 项目

SpringCloud 的简单介绍

springCloud 是基于 SpringBoot 的一整套实现微服务的框架。他提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。最重要的是,跟 spring boot 框架一起使用的话,会让你开发微服务架构的云服务非常好的方便。

SpringBoot 旨在简化创建产品级的 Spring 应用和服务,简化了配置文件,使用嵌入式 web 服务器,含有诸多开箱即用微服务功能

spring cloud 子项目包括:

Spring Cloud Config:配置管理开发工具包,可以让你把配置放到远程服务器,目前支持本地存储、Git 以及 Subversion。

Spring Cloud Bus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与 Spring Cloud Config 联合实现热部署。

Spring Cloud Netflix:针对多种 Netflix 组件提供的开发工具包,其中包括 Eureka、Hystrix、Zuul、Archaius 等。

Netflix Eureka:云端负载均衡,一个基于 REST 的服务,用于定位服务,以实现云端的负载均衡和中间层服务器的故障转移。

Netflix Hystrix:容错管理工具,旨在通过控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。

Netflix Zuul:边缘服务工具,是提供动态路由,监控,弹性,安全等的边缘服务。

Netflix Archaius:配置管理 API,包含一系列配置管理 API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。

Spring Cloud for Cloud Foundry:通过 Oauth2 协议绑定服务到 CloudFoundry,CloudFoundry 是 VMware 推出的开源 PaaS 云平台。

Spring Cloud Sleuth:日志收集工具包,封装了 Dapper,Zipkin 和 HTrace 操作。

Spring Cloud Data Flow:大数据操作工具,通过命令行方式操作数据流。

Spring Cloud Security:安全工具包,为你的应用程序添加安全控制,主要是指 OAuth2。

Spring Cloud Consul:封装了 Consul 操作,consul 是一个服务发现与配置工具,与 Docker 容器可以无缝集成。

Spring Cloud Zookeeper:操作 Zookeeper 的工具包,用于使用 zookeeper 方式的服务注册和发现。

Spring Cloud Stream:数据流操作开发包,封装了与 Redis,Rabbit、Kafka 等发送接收消息。

Spring Cloud CLI:基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件

springCloud 的特点

  1. 约定优于配置
  2. 开箱即用、快速的启动
  3. 适用各种环境
  4. 轻量级的组件
  5. 组件丰富,功能完整

SpringCluod 逻辑结构图

springcloud-role

Spring cloud 作为当下主流的微服务框架,让我们实现微服务架构简单快捷,Spring cloud 中各个组件在微服务架构中扮演的角色如上图所示,黑线表示注释说明,蓝线由 A 指向 B,表示 B 从 A 处获取服务。包括各种微服务、注册发现、服务网关、熔断器、统一配置、跟踪服务等……

SpringCloud 组件角色概况

feign(接口调用)

微服务之间通过 Rest 接口通讯,Spring Cloud 提供 Feign 框架来支持 Rest 的调用,Feign 使得不同进程的 Rest 接口调用得以用优雅的方式进行,这种优雅表现得就像同一个进程调用一样。。

Netflix eureka(注册发现)

微服务模式下,一个大的 Web 应用通常都被拆分为很多比较小的 web 应用(服务),这个时候就需要有一个地方保存这些服务的相关信息,才能让各个小的应用彼此知道对方,这个时候就需要在注册中心进行注册。每个应用启动时向配置的注册中心注册自己的信息(ip 地址,端口号, 服务名称等信息),注册中心将他们保存起来,服务间相互调用的时候,通过服务名称就可以到注册中心找到对应的服务信息,从而进行通讯。注册与发现服务为微服务之间的调用带来了方便,解决了硬编码的问题。服务间只通过对方的服务 id,而无需知道其 ip 和端口即可以获取对方方服务。

Ribbon(负载均衡)

Ribbon 是 Netflix 发布的负载均衡器,它有助于控制 HTTP 和 TCP 客户端的行为。为 Ribbon,配置服务提供者的地址列表后,Ribbon 就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon 默认为我们提供了很多的负载均衡算法,例如轮询、随机等。当然,我们也可为 Ribbon 实现自定义的负载均衡算法。在 SpringCloud 中,当 Ribbon 与 Eureka 配合使用时,Ribbon 可自动从 EurekaServer 获取服务提供者的地址列表,并基于负载均衡算法,请求其中一个服务提供者的实例(为了服务的可靠性,一个微服务可能部署多个实例)。

Hystrix(熔断器)

当服务提供者响应非常缓慢,那么消费者对提供者的请求就会被强制等待,直到提供者响应或超时。在高负载场景下,如果不做任何处理,此类问题可能会导致服务消费者的资源耗竭甚至整个系统的崩溃(雪崩效应)。Hystrix 正是为了防止此类问题发生。Hystrix 是由 Netflix 开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。Hystrix 主要通过以下几点实现延迟和容错。

包裹请求:使用 HystrixCommand(或 HystrixObservableCommand)包裹对依赖的调用逻辑,每个命令在独立线程中执行。这使用了设计模式中的“命令模式”。

跳闸机制:当某服务的错误率超过一定阈值时,Hystrix 可以自动或者手动跳闸,停止请求该服务一段时间。

资源隔离:Hystrix 为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等候,从而加速失败判定。

监控:Hystrix 可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时和被拒绝的请求等。

回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑可由开发人员指定。

Zuul(网关)

不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求。例如一个电影购票的手机 APP,可能调用多个微服务的接口才能完成一次购票的业务流程,如果让客户端直接与各个微服务通信,会有以下的问题:

客户端会多次请求不同的微服务,增加了客户端的复杂性。

存在跨域请求,在一定场景下处理相对复杂。

认证复杂,每个服务都需要独立认证。

难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将很难实施。

某些微服务可能使用了对防火墙/浏览器不友好的协议,直接访问时会有一定的困难。

以上问题可借助微服务网关解决。微服务网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过微服务网关。使用微服务网关后,微服务网关将封装应用程序的内部结构,客户端只用跟网关交互,而无须直接调用特定微服务的接口。这样,开发就可以得到简化。不仅如此,使用微服务网关还有以下优点:

易于监控。可在微服务网关收集监控数据并将其推送到外部系统进行分析。

易于认证。可在微服务网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。

减少了客户端与各个微服务之间的交互次数。

SpringCloudBus(统一配置服务)

对于传统的单体应用,常使用配置文件管理所有配置。例如一个 SpringBoot 开发的单体应用,可将配置内容放在 application.yml 文件中。如果需要切换环境,可设置多个 Profile,并在启动应用时指定 spring.profiles.active={profile}。然而,在微服务架构中,微服务的配置管理一般有以下需求:

集中管理配置。一个使用微服务架构的应用系统可能会包含成百上千个微服务,因此集中管理配置是非常有必要的。

不同环境,不同配置。例如,数据源配置在不同的环境(开发、测试、预发布、生产等)中是不同的。

运行期间可动态调整。例如,可根据各个微服务的负载情况,动态调整数据源连接池大小或熔断阈值,并且在调整配置时不停止微服务。

配置修改后可自动更新。如配置内容发生变化,微服务能够自动更新配置。综上所述,对于微服务架构而言,一个通用的配置管理机制是必不可少的,常见做法是使用配置服务器管理配置。Spring cloud bus 利用 Git 或 SVN 等管理配置、采用 Kafka 或者 RabbitMQ 等消息总线通知所有应用,从而实现配置的自动更新并且刷新所有微服务实例的配置。

SpringCloud Sleuth + ZipKin(跟踪服务)

Sleuth 和 Zipkin 结合使用可以通过图形化的界面查看微服务请求的延迟情况以及各个微服务的依赖情况。需要注意的是 Spring boot2 及以上不在支持 Zipkin 的自定义,需要到官方网站下载 ZipKin 相关的 jar 包。

SpringCloud Actuator(执行器)

提供了很多监控端点如/actuator/info、/actuator/health、/acutator/refresh 等,可以查看微服务的信息、健康状况、刷新配置等。


鸣谢

本博客参考自:简单了解 SpringCloud 的微服务架构 –程序员手册大全

-------------本文结束感谢您的阅读-------------

本文标题:SpringCloud学习笔记二:总架构概略

文章作者:ssqxx

发布时间:2019年10月24日 - 11:15:24

最后更新:2020年03月29日 - 17:10:27

原始链接:http://yoursite.com/2019/10/24/the-learning-notes-by-SpringCloud-framework-overview/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。