微服务架构核心关键点
在了解Spring Cloud
之前先了解一下微服务架构需要考量的核心关键点,如下图:
-
微服务的服务治理(服务注册及服务发现)
通过服务发现,消费者可以在预先不知道服务提供者物理地址的情况下,仅通过相应的服务名称就可以实现服务调用。
服务注册机制,可以让服务提供者在上线时将所提供的服务信息注册到服务治理服务器中,供服务消费者使用。当服务下线时将自己从服务治理服务器中注销,避免服务消费者调用而造成的异常。
-
微服务的负载均衡(客户端负载均衡的概念,也称之为软负载均衡。)
核心思想就是在服务消费者(也就是客户端)保存有一份服务者列表,这份服务者列表通常是从服务治理服务器中动态获取,也可以采用固定配置方式,然后通过某种负载均衡策略来决定每次服务调用时所使用的具体服务实例,从而实现微服务之间的负载均衡。
-
微服务的统一入口
对于微服务,
API
服务网关为微服务提供了一个统一入口,并能够附加一些路由规则,使得不同的微服务通过路由规则提供一致的访问入口。 -
微服务的容错
针对微服务架构的容错提出了断路器、服务降级等模式,这些模式都可以有效防止微服务调用失败而引起的连锁反应,并且在必要时可以通过这些模式主动实施应用的降级处理,从而保证核心业务的正常运行。
-
微服务的统一配置
由于在微服务架构的应用中微服务数量众多,建议统一对配置进行管理和发布更新
-
微服务的监控
微服务的灵活和强大也为开发者带来了“噩梦”一般的调试和跟踪分析体验。日志聚合、日志可视化分析、调用链跟踪等解决方案,都可为我们所构建的微服务应用的运维提供强有力的武器。
-
微服务的部署
在动辄几十个甚至上百个服务实例在线,并且不断上线、下线的场景下,开发者一定不愿意通过手工构建和部署这些服务实例,通过构建—发布管道来构建自动化发布流程。可以通过
Docker
工具来快速部署,通过k8s
来构建自动化部署编排等。
对于以上等核心关键点的处理,不需要我们重复造车轮,Spring Cloud
已经帮我们集成了,它使用Spring Boot
风格将一些比较成熟的微服务框架组合起来,屏蔽掉了复杂的配置和实现原理,为快速构建微服务架构的应用提供了一套基础设施工具和开发支持。
Spring Cloud技术概览
Spring Cloud
所提供的核心功能包含:
- 基于
Netflix
实现服务治理、客户端负载均衡和声明式调用; - 服务网关;
- 微服务容错管理;
- 整合消息中间件提供消息驱动式开发;
- 基于
Spring Security
提供微服务安全、单点登录功能; - 分布式、版本化的统一配置管理;
- 微服务调用链及追踪管理。
Spring Cloud架构图
Spring Cloud子项目
Spring Cloud
旗下的子项目大致可以分为两类:
- 对现有成熟的第三方开源项目
Spring Boot
化,进行封装集成,使得基于Spring
的开发非常容易集成和使用。 - 新增了一些微服务架构开发所需的基础设施,如
Spring Cloud Config
提供了统一配置中心、Spring Cloud Stream
则充当了与Kafka
、RabbitMQ
等消息中间件快速集成的桥梁。
如下:
1. Spring Cloud
与Spring Boot
Spring Boot
可以说是微服务架构的核心技术之一。通过在Spring Boot
应用中添加Spring MVC
依赖,就可以快速实现基于REST
架构的服务接口,并且可以提供对HTTP
标准动作的支持。而且Spring Boot
默认提供JackJson
序列化支持,可以让服务接口输入、输出支持JSON
等。因此,当使用Spring Cloud
进行微服务架构开发时,使用Spring Boot
是一条必经之路。
2. Spring Cloud
与服务治理(Eureka
)
服务治理是Spring Cloud
的核心,在实现上其提供了两个选择,即Consul
和Netflix
的Eureka
。
Eureka
提供了服务注册中心、服务发现客户端,以及注册服务的UI
界面应用。
在Eureka
的实现中,节点之间相互平等,有部分注册中心“挂掉”也不会对整个应用造成影响,即使集群只剩一个节点存活,也可以正常地治理服务。即使所有服务注册节点都宕机,Eureka
客户端中所缓存的服务实例列表信息,也可让服务消费者能够正常工作,从而保障微服务之间互相调用的健壮性和应用的弹性。
3. Spring Cloud
与客户端负载均衡(Ribbon
)
Ribbon
默认与Eureak
进行无缝整合,当客户端启动的时候,从Eureka
服务器中获取一份服务注册列表并维护在本地,当服务消费者需要调用服务时,Ribbon
就会根据负载均衡策略选择一个合适的服务提供者实例并进行访问。
Spring Cloud
通过集成Netflix
的Feign
项目,为开发者提供了声明式服务调用,从而简化了微服务之间的调用处理方式。并且默认Feign
项目集成了Ribbon
,使得声明式调用也支持客户端负载均衡功能。
4. Spring Cloud
与微服务容错、降级(Hystrix
)
为了给微服务架构提供更大的弹性,在Spring Cloud
中,通过集成Netflix
下子项目Hystrix
,通过所提供的@HystrixCommand
注解可以轻松为我们所开发的微服务提供容错、回退、降级等功能。此外,Hystrix
也默认集成到Feign
子项目中。
Hystrix
是根据“断路器”模式而创建。当Hystrix
监控到某服务单元发生故障之后,就会进入服务熔断处理,并向调用方返回一个符合预期的服务降级处理(fallback
),而不是长时间的等待或者抛出调用异常,从而保障服务调用方的线程不会被长时间、不必要地占用,避免故障在应用中的蔓延造成的雪崩效应。
而Hystrix
的仪表盘项目(Dashboard
)可以监控各个服务调用所消耗的时间、请求数、成功率等,通过这种近乎实时的监控和告警,可以及时发现系统中潜在问题并进行处理。
5. Spring Cloud
与服务网关(Zuul
)
Spring Cloud
通过集成Netflix
中的Zuul
实现API
服务网关功能,提供对请求的路由和过滤两个功能
路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。
过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。
通过Zuul
,可以将细粒度的服务组合起来提供一个粗粒度的服务,所有请求都导入一个统一的入口,对外整个服务只需要暴露一个API
接口,屏蔽了服务端的实现细节。通过Zuul
的反向代理功能,可以实现路由寻址,将请求转发到后端的粗粒度服务上,并做一些通用的逻辑处理。此外,Zuul
默认会与Eureka
服务器进行整合,自动从Eureka
服务器中获取所有注册的服务并进行路由映射,实现API
服务网关自动配置。
6. Spring Cloud
与消息中间件(Stream
)
Spring Cloud
为简化基于消息的开发,提供了Stream
子项目,通过建立消息应用抽象层,构建了消息收发、分组消费和消息分片等功能处理,将业务应用中的消息收发与具体消息中间件进行解耦,使微服务应用开发中可以非常方便地与Kafka
和RabbitMQ
等消息中间件进行集成。
Spring Cloud Bus
基于Stream
进行扩展,可以作为微服务之间的事件、消息总线,用于服务集群中状态变化的传播。
比如Spring Cloud Config
借助Bus
,可以实现配置的动态刷新处理。
7. Spring Cloud
与分布式配置中心(Config
)
针对微服务架构下的配置文件管理需求,Spring Cloud
提供了一个Config
子项目。Spring Cloud Config
具有中心化、版本控制、支持动态更新和语言独立等特性。
在Config
子项目中将微服务应用分为两种角色:配置服务器(Config Server
)和配置客户端(Config Client
)。使用配置服务器集中地管理所有配置属性文件,配置服务中心可以将配置属性文件存储到Git
、SVN
等具有版本管理仓库中,也可以存放在文件系统中。默认采用Git
的方式进行存储,因此可以很容易地对配置文件进行修改,并实现版本控制。
8. Spring Cloud
与微服务链路追踪(Sleuth
)
Spring Cloud
中的Sleuth
子项目为开发者提供了微服务之间调用的链路追踪。
Sleuth
核心思想就是通过一个全局的ID
将分布在各微服务服务节点上的请求处理串联起来,还原了调用关系,并借助数据埋点,实现对微服务调用链路上的性能数据的采集。
因此,通过Sleuth
可以很清楚地了解到一个用户请求经过了哪些服务、每个服务处理花费了多长时间,从而可以对用户的请求进行分析。此外,通过将采集的数据发送给Zipkin
进行存储、统计和分析,从而可以实现可视化的分析和展示,帮助开发者对微服务实施优化处理。
9. Spring Cloud
与微服务安全(Security
)
Spring Cloud Security
为我们提供了一个认证和鉴权的安全框架,实现了资源授权、令牌管理等功能,同时结合Zuul
可以将认证信息在微服务调用过程中直接传递,简化了我们进行安全管控的开发。
Spring Cloud Security
默认支持OAuth 2.0
认证协议,因此单点登录也可以非常容易实现,并且OAuth2.0
所生成的令牌可以使用JWT
的方式,进一步简化了微服务中的安全管理。
10. Spring Cloud
的其他子项目
-
Spring Cloud Cli
:提供了以命令行和脚本的方式来管理微服务。 -
Spring Cloud Data Flow
:一个用于开发、执行大数据处理的统一编程模型和托管服务。其基于原生云,并重新对Spring XD
进行设计,简化了大数据应用的开发,为基于微服务的分布式流处理和批处理数据通道提供了一系列模型和最佳实践。 -
Spring Cloud Task
:用于短时的任务管理和调度微服务管理,通常与Data Flow
一起使用。 -
Spring Cloud Starters
:类似于Spring Boot
的启动项目,为基于Spring Cloud
的微服务开发提供开箱即用的依赖管理。 -
Spring Cloud Contract
:这是面向Java的契约框架,消费者驱动的,旨在帮助开发者完成微服务测试的子项目。
选择Spring Cloud
的理由
-
Spring Cloud
作为Spring Boot
的传承,遵循约定优于配置的原则,在使用时不需要复杂的配置就可以运行起来,学习曲线低。 -
Spring Cloud
中的大部分子项目开箱即用,采用自动化配置机制,可说使用门槛非常低。 -
Spring Cloud
属于Spring
大家族,而Spring
是进行企业级开发的首选框架,因此在项目中引入Spring Cloud
的技术成本比较低。 -
Spring Cloud
的口号就是开发“面向云环境的应用程序”,通过集成成熟的第三方开源组件,为微服务架构的开发提供了全方位的支持,并且在Spring
这棵大树下后续的更新、完善都有保障。 -
Spring Cloud
抛弃了传统的RPC
通信,采用了基于HTTP
的REST
方式,使得微服务接口更为灵活,服务提供者和消费者之间的依赖只需要一纸契约即可,而不存在代码级别的强依赖,这对快速演化的微服务架构更合适。 -
Spring Cloud
并没有限制所使用的环境,可以与异构系统进行整合。同时对于所提供的各组件服务既可单独部署,又可集中部署,方便了运维和管理。