一、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, 2.5.x (Starting with 2020.0.3)
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 是这套规范下的知名实现。不同实现的差异如图:

20210801151420

在 Netflix 停止更新了以后,Spring Cloud Alibaba 依然在持续更新和迭代。根据2020年 X-lab 开放实验室发布的《2020 年微服务领域开源数字化报告》,Spring Cloud Alibaba 已经成为最活跃的 Spring Cloud 实现。

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 已经是直接隶属于 Spring Cloud 的子项目。官网是:https://spring.io/projects/spring-cloud-alibaba#overview。对于中国用户来说,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 注解, 高效并且对业务零侵入地解决分布式事务问题。

包含组件:

  • Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

  • Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

  • RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

  • Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。

  • Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

    更多组件请参考 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时的首选注册中心。Spring Cloud Alibaba 将服务注册、配置中心与负载均衡功能都整合进 Nacos,提供图形化界面。
  • 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:阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。相较Hystrix功能更强大,使用也更加友好,同时还支持对Dubbo的调用。

功能对比可参考: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
  目录