一、Spring Cloud 介绍及组件选择


系列文章介绍

本文是《Spring Cloud 实战教程》第一篇,原文发布于个人博客:悟尘记

此系列文章共包括如下章节:

  • 一、Spring Cloud 介绍及组件选择
  • 二、Spring Cloud Consul 实战
  • 三、Spring Cloud Alibaba 实战

一、初识 Spring Cloud

1、概览

Spring Cloud 为微服务架构提供了标准化、全站式的技术方案。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。

Spring Cloud 架构图

2、特性

Spring Cloud 专注于为典型的用例和可扩展性机制(包括其他用例)提供良好的开箱即用体验,主要致力于解决如下问题:

  • 分布式/版本化配置
  • 服务注册和发现
  • 服务路由
  • 服务调用
  • 负载均衡
  • 断路器
  • 全局锁
  • 分布式消息传递

3、版本介绍

Spring Cloud 是一个由各个独立组件组成的综合项目,4年时间发布了 46 个版本,更新换代非常快。每个组件有着不同的发布节奏,需要选择匹配的组件版本确保兼容性:

Spring Cloud Version Boot Version
2020.0.x aka Ilford 2.4.x
Hoxton 2.2.x, 2.3.x (Starting with SR5)
Greenwich 2.1.x
Finchley 2.0.x
Edgware 1.5.x
Dalston 1.5.x

最新版本请参考官网: https://spring.io/projects/spring-cloud#overview。

二、Spring Cloud 规范下的实现

Spring Cloud 不是 Spring 团队全新研发的框架,他把常见的微服务组件基于 Spring Cloud 规范进行了整合。其中 Spring Cloud Netflix、Spring Cloud Consul、Spring Cloud Alibaba 是这套规范下的知名实现。

1、Spring Cloud Netflix

业界对 Spring Cloud 使用最广的就是 Spring Cloud Netflix 了,在 Spring Cloud 发展之初,Netflix 做了很大的贡献。包括以下组件:

  • Eureka:服务注册与发现
  • Zuul:服务网关
  • Ribbon:负载均衡
  • Feign:远程服务的客户端代理
  • Hystrix:断路器,提供服务熔断和限流功能
  • Hystrix Dashboard:监控面板
  • Turbine:聚合各个服务实例上的监控信息

随着 Netflix 宣布 Eureka 2.0 不再开发,Hystrix、Ribbon、Archaius 不再维护,Zuul 被 Spring Cloud Gateway 代替。Spring Cloud 也在 RoadMap 中宣布 Ilford 版本(发行说明)发布的时候删除这些维护模块,所以不建议继续使用 Spring Cloud Netflix 这套实现。

2、Spring Cloud Consul

Consul 是 HashiCorp 公司推出的开源软件,基于 Go 语言开发,提供了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。

Spring Cloud Consul 通过自动配置并绑定到 Spring Environment 和其他 Spring 编程模型习惯用法,为Spring Boot应用程序提供Consul集成。通过一些简单的注释,您可以快速启用和配置应用程序中的通用模式。

主要特性:

  • 支持服务治理:Consul 作为注册中心时,微服务中的应用可以向 Consul 注册自己,并且可以从 Consul 获取其他应用信息;
  • 支持客户端负责均衡:包括 Ribbon 和 Spring Cloud LoadBalancer;
  • 支持 Zuul:当 Zuul 作为网关时,可以从 Consul 中注册和发现应用;
  • 支持分布式配置管理:Consul 作为配置中心时,使用键值对来存储配置信息;
  • 支持控制总线:可以在整个微服务系统中通过 Control Bus 分发事件消息。

3、Spring Cloud Alibaba

Spring Cloud Alibaba 是由阿里巴巴团队主导,致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

对于中国用户来说,Spring Cloud Alibaba 还有一个非常特殊的意义:它将曾经红极一时的 Dubbo,以及阿里巴巴的强力消息中间件 RocketMQ 融入 Spring Cloud 体系。

主要功能:

  • 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
  • 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
  • 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

更多功能请参考 Roadmap

三、常用组件介绍

2、服务注册与发现

通过使用独立的组件进行服务的注册和查询,可以实现调用方和服务提供方的信息解耦。以下4种组件Spring Cloud都提供了集成方案:

  • Eureka: 使用人数最多也最成熟,Spring Cloud Netflix的默认实现,网上资料非常丰富;无需独立部署,可以嵌入到应用内(就是一个servlet程序)。但Eureka 1后续不会再有新版本更新了,2.0又不会开源,官方已经不建议使用。
  • Consul:作为Eureka的官方候补,是Spring Cloud目前主要支持的实现,各方面功能都很全面。随着 Eureka 2.x 版本停止开发,Spring Cloud 官方建议用 Spring Cloud Consul 来替代。
  • Nacos:阿里开源的产品,功能对标 Consul,CAP模型中不仅支持CP也支持AP,使用Dubbo时的首选注册中心。
  • ZooKeeper:一个通用的分布式协调器,也可以作为注册中心使用,Spring Cloud提供了集成支持,如果项目本身也依赖于ZooKeeper,就无需再单独部署新的组件了;但zookeeper缺少一些对于注册中心来说比较重要的特性,比如健康检查和DNS服务集成等。

下面是网上找的一个特性对比图:

服务注册与发现组件特性对比图

3、分布式配置管理

采用统一的配置中心的主要目的是为了简化运维和动态刷新配置。通过提供配置变更、配置推送、历史版本管理、灰度发布、配置变更审计等配置管理操作,配置中心帮助您集中管理所有生产环境中的配置,降低分布式系统中管理配置的成本,并降低因错误的配置变更带来可用性下降甚至发生故障的风险。Spring Cloud 集成的解决方案包括下面几种:

  • Nacos:2018年6月,阿里开源的配置中心。如果已经用Nacos作为注册中心,不想单独部署配置管理中心,nacos是最佳选择。
  • Consul:直接利用Consul 的KV存储功能来存储配置项,如果采用Consul作为注册中心则不需要再引入额外的系统,可以在Consul的管理后台直接编辑配置信息。
  • Spring Cloud Config : 以文件的方式加载远程配置,提供了定义良好的REST风格API用来访问配置文件,且可以自动转换配置文件的格式;但需要结合结合版本控制工具使用,如GIT,SVN等等;动态配置更新还需要配合Spring Cloud Bus和MQ组件使用;也没有提供维护配置的界面。
  • Apollo: 携程开源的配置管理中心,具备规范的权限、流程治理等特性。能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

4、服务网关

服务网关是外部系统(前端,手机端等等)访问微服务的一个反向代理服务器。默认的实现是 zuul,但和 Eureka 的情况类似,Netflix 后续的2.0版本不断跳票,Spring忍无可忍最后自己搞了一个网关出来 Spring Cloud Gateway 出来。后面zuul 2.0开源以后,Spring Cloud似乎也不打算再集成进来了。

  • Zuul : 和 Eureka 的情况类似,成熟,流行。缺点是基于Servlet 2.5构建,阻塞式的 API,性能不够好,不支持长连接。后面zuul 2.0开源以后,Spring Cloud似乎也不打算再集成了。
  • Spring Cloud Gateway : 基于 Spring Boot 2.x 响应式的、非阻塞式的 API开发,性能更好,也支持长连接,后续的维护集成不用担心。
  • Nginx : 性能是最好的,结合Consul Template也能够实现服务的动态负载均衡。但缺点是和Spring Cloud整合相对困难一些,缺少类似于过滤器,断路保护等特性的原生支持。

5、服务间调用和负载均衡

选择比较少,常用的是 Feign(声明式http客户端)+ Ribbon(客户端负载均衡),但 Spring Cloud Ribbon 项目目前已经处于维护模式,使用时会有警告;另一种选择是使用阿里的 Dubbo。Spring也开发了自己的负载均衡器 spring-cloud-loadbalancer,可以用来取代Ribbon的位置。

  • OpenFeign : 是 Spring Cloud 的一个子项目,为微服务架构下服务之间的调用提供解决方案。可以动态创建基于Spring MVC注解的接口实现服务调用,在 SpringCloud 2.0 中已经取代 Feign 成为了一等公民,并且集成了 Ribbon 来做负载均衡。
  • Dubbo : 自带负载均衡策略;可以使用自有的二级制 RPC 协议,占用带宽更少,性能更好 ;如果要使用的话最好采用 Spring Cloud Alibaba 套件的整套解决方案;但 Dubbo 的服务调用方需要依赖于提供方的接口Jar包,解耦并不彻底;由于使用的是自定义协议,跨语言调用比较困难。

6、熔断限流

为了避免“雪崩”,需要引入熔断机制。利用断路器对某个服务的故障进行监控,一旦发现服务不可用,就立即对调用方返回错误响应(或者做一些应急处理,也就是服务降级),避免了调用方的长时间等待。目前Spring Cloud已经集成的断路器有:Hystrix,Sentinel,Resilience4j。

  • Hystrix:2018年12月,Spring官方宣布Netflix的相关项目进入维护模式(Maintenance Mode)。不再开发新的功能,但是Hystrix整体上还是比较稳定的,对于老用户不必更换,影响也不大。
  • Resilience4j:Hystrix停更之后,Netflix官方推荐使用resilience4j,它是一个轻量、易用、可组装的高可用框架,支持熔断、高频控制、隔离、限流、限时、重试等多种高可用机制。
  • Sentinel:阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。

功能对比可参考:Guideline: 从 Hystrix 迁移到 Sentinel

参考


文章作者: 李小龙
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议,转载请注明来源 悟尘记 !
评论
 上一篇
二、Spring Cloud Consul 实战 二、Spring Cloud Consul 实战
本文是 SpringCloud 实战教程第二篇,基于 Hoxton.SR8 版本,使用Consul、OpenFeign组件。
2020-11-18
下一篇 
北京市通州区与河北省三河、大厂、香河三县市协同发展规划(转载) 北京市通州区与河北省三河、大厂、香河三县市协同发展规划(转载)
本规划是指导通州区与北三县规划建设的基本依据。规划范围包括北京市通州区和河北省廊坊市所辖三河市、大厂回族自治县、香河县行政辖区范围,国土总面积2164平方公里。规划近期至2025年,远期至2035年。
2020-05-20
  目录