Spring Cloud Alibaba的行业调研

1,604 阅读17分钟

以下六个方面来介绍:

  1. spring cloud alibaba的定义

  2. spring cloud alibaba的发展历史

  3. spring cloud alibaba的功能特性

  4. spring cloud alibaba的工具

  5. spring cloud alibaba的未来规划

1. Spring Cloud Alibaba(SCA)的定义:

Spring Cloud Alibaba旨在为微服务开发提供一站式解决方案。该项目包括开发分布式应用程序和服务所需的组件,以便开发人员可以使用Spring Cloud编程模型轻松开发分布式应用程序。

经过了多个双十一的考验,对业务来说非常可靠的微服务开发框架。

2. SCA的发展历史:

  • 2008 年,阿里巴巴开始内部使用 Dubbo。
  • 2009 年初,发布 1.0 版本。
  • 2010 年初,发布 2.0 版本。
  • 2011 年 10 月,阿里巴巴宣布开源,版本为 2.0.7。
  • 2012 年 3 月,发布 2.1.0 版本。
  • 2013 年 3 月,发布 2.4.10 版本。
  • 2014 年 10 月,发布 2.3.11 版本,之后版本停滞。
  • 2014 年 10 月,当当网 Fork 了 Dubbo 版本,命名为 Dubbox-2.8.0,并支持 HTTP REST 协议。
  • 2016 年 1 月,Spring Cloud发布第一个版本。
  • 2017 年 9 月,阿里巴巴重启维护,重点升级所依赖 JDK 及组件版本,发布 2.5.4/5 版本。
  • 2017 年 10 月,发布 2.5.6 版本。
  • 2017 年 11 月,发布 2.5.7 版本,后期集成 Spring Boot。
  • 2018年10月31日, Spring Cloud Alibaba正式入驻Spring Cloud官方孵化器并发布了第一个预览版本。
  • 2018年12月12日Spring Cloud Netflix宣布大部分组件进入维护模式,意味着这些组件不再开发新功能,生态渐渐消失。
  • 2019年7月24日,Spring官方社区宣布Spring Cloud Alibaba正式从Spring Cloud Incubator孵化器毕业,成为了Spring社区的正式项目

阿里云内部都在推广Spring Cloud Alibaba,和云原生的结合比较多。

2.1 Spring Cloud 各厂商项目活跃度排名:

GCP: Google Cloud Platform

2.2 SCA的发布情况:

star:收藏

watch:关注

fork:参与,可以提PR

3. SCA的功能特性:

首先我们来看看SCA的组成框架:

SCA静态框架

SCA动态框架

3.1 Spring Cloud Alibaba的组成:

  • Sentinel(哨兵)流控制和服务降级:支持WebServlet,WebFlux,OpenFeign,RestTemplate,Dubbo访问限制和降级流的功能。它可以在运行时通过控制台实时修改流量限制和降级规则,并且还支持监控限制和降级指标。
  • Nacos服务注册和发现:可以注册服务,客户可以使用Spring托管的bean,自动集成功能去发现实例。
  • Nacos分布式配置:支持分布式系统中的外部配置,配置更改时自动刷新。
  • RPC服务:扩展Spring Cloud客户端RestTemplate和OpenFeign以支持调用Dubbo RPC服务。
  • 事件驱动:支持构建与共享消息系统连接的高度可扩展的事件驱动微服务。
  • Seata分布式事务:支持高性能且易于使用的分布式事务解决方案。
  • OSS阿里云对象存储:大规模,安全,低成本,高度可靠的云存储服务。支持随时随地在任何应用程序中存储和访问任何类型的数据。
  • 阿里云SchedulerX:准确,高度可靠,高可用性的计划作业调度服务,响应时间在几秒钟之内。
  • 阿里云短信SMS:阿里云短信服务覆盖全球,可提供便捷,高效,智能的通信功能,帮助企业快速联系客户。

3.2 Spring Cloud系列各厂商组件比对:

3.3 SCA的组件详细介绍:

3.3.1 DUBBO

Dubbo负责人在2017年(时隔3年后重启维护dubbo时的发言:)

阿里内部使用 HSF,原因业务属性规模有关。 这里就不得不提到目前的一些文章在谈到微服务的时候总是拿 Spring Cloud 和 Dubbo 来对比,需要强调的是 Dubbo 未来的定位并不是要成为一个微服务的全面解决方案,而是专注在 RPC 领域,成为微服务生态体系中的一个重要组件。至于大家关注的微服务化衍生出的服务治理需求,我们会在 Dubbo 积极适配开源解决方案,甚至启动独立的开源项目予以支持。 受众主要来自国内各友商以及个人开发者,希望将来能够将用户拓展到全球,代表国人在 RPC 领域与 gRPC(基于 HTTP 2.0)、Finagle 等竞争。

如果说SCA的组件之间有一个优先级,那么dubbo rpc服务调用一定是SCA的灵魂组件。我们从spring cloud alibaba在停维3年之后重启时的发言可以看出:dubbo作为分布式微服务框架中的远程服务调用方案,可以算是最核心模块之一。

服务调用目前主要有2种,一个是基于RPC,一个是基于Restful API的。Spring Cloud 官方、Spring Cloud Netflix提供的服务调用是Feign和OpenFeign,基于Restful API的;而dubbo rpc是基于RPC的。

RPC和Restful API的对比:

RPC 主要用于公司内部的服务调用,性能消耗低,传输效率高,实现复杂。

HTTP 主要用于对外的异构环境,浏览器接口调用,App 接口调用,第三方接口调用等。

RPC 使用场景(大型的网站,内部子系统较多、接口非常多的情况下适合使用 RPC):

  • 长链接。不必每次通信都要像 HTTP 一样去 3 次握手,减少了网络开销。
  • 注册发布机制。RPC 框架一般都有注册中心,有丰富的监控管理、发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。
  • 安全性,没有暴露资源操作。
  • 微服务支持。就是最近流行的服务化架构、服务化治理,RPC 框架是一个强力的支撑。

dubbo要求服务调用者和提供者之间的接口和版本完全一致,更新是连带的,所以接口维护起来比较麻烦,不利于升级发版。但是rest协议相对来说是轻量级的,就是接口的变动不会造成很大的改变,所以更加灵活。但是灵活的代价是支持 REST 服务调用,可能因为接口定义过轻,导致定义文档与实际实现不一致导致服务集成时的问题(可以使用统一文档和版本管理解决,比如 Swagger)。

3.3.2 Nacos服务注册与发现+分布式配置

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理服务管理平台。服务是nacos的头等公民,nacos支持几乎所有类型的服务,例如dubbo、gRPC、Spring Cloud Restful服务或kubernetes服务。

Nacos提供四个主要功能。

  • 服务发现和服务运行状况检查

Nacos使服务易于注册自己并通过DNS或HTTP接口发现其他服务。Nacos还提供服务的实时运行状况检查,以防止向不正常的主机或服务实例发送请求。

  • 动态配置管理

动态配置服务使您可以在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新部署应用程序和服务的需求,这使配置更改更加有效和敏捷。

  • 动态DNS服务

Nacos支持加权路由,使您可以更轻松地在数据中心内的生产环境中实施中间层负载平衡,灵活的路由策略,流控制和简单的DNS解析服务。它可以帮助您轻松实现基于DNS的服务发现,并防止应用程序耦合到特定于供应商的服务发现API。

  • 服务和元数据管理

Nacos提供了易于使用的服务仪表板,可帮助您管理服务元数据,配置,kubernetes DNS,服务运行状况和指标统计信息。

3.3.3 流控制与服务降级Sentinel(哨兵)

Sentinel根据QPS响应时间系统负载来决定如何控制流量、执行断路规则系统保护

随着分布式系统变得越来越流行,服务之间的可靠性变得比以往任何时候都更加重要。Sentinel以“流”为切入点,并在流控制,流量整型,链路中断,系统自适应保护等多个领域工作,以确保微服务的可靠性和弹性。

Sentinel已在阿里巴巴中广泛使用,并且在过去的10年中涵盖了双十一购物节中几乎所有的核心场景,例如“Second Kill”需要将突发流量限制为满足系统容量,消息削峰填谷。

要使用Sentinel,只需要完成2个步骤:

(1) 定义资源

@SentinelResource 资源定义标签

Sentinel通过和Spring Cloud、Spring Boot、gRPC等的框架的集成,它们所提供的服务、方法、代码片段就是我们的资源。

(2) 配置规则

flow control 流控规则

字段描述默认值
resource资源名称
count阈值
grade流量控制指标(QPS或并发线程数)QPS
limitApp参考指定的调用者默认
strategy通过资源本身或其他资源(refResource)或条目(refResource)资源本身
controlBehavior流量整形控制行为(直接拒绝,排队,启动缓慢)直接拒绝

degrade 降级规则

字段描述默认值
resource资源名称
count阈值
grade断路策略(慢请求比率/错误比率/错误计数)慢请求比率
timeWindow断路恢复超时(单位秒)
minRequestAmount断路器可以计算比率或总数(从1.7.0开始)之前所需的最小呼叫次数(每个滑动窗口时段)5
statIntervalMs滑动窗口期(自1.8.0开始)1000
slowRatioThreshold慢速比率阈值,仅适用于慢速比率策略(自1.8.0开始)

system protection 系统保护规则

字段描述默认值
highestSystemLoad最高系统负载,负载1的阈值-1(无效)
avgRt平均响应时间-1(无效)
maxThread并发线程数-1(无效)

authority rules 权限规则

Sentinel与传统的hystrix相比,没有了线程池的影响,是信号量隔离,更加轻量化

Sentinel的生态地标

阿里云应用高可用服务架构图

AHAS流量防护是开源框架Sentinel的商业化产品,是阿里巴巴双十一技术体系中的核心组件,他在Sentinel的基础上,支持更多的业务功能。

核心能力

功能描述AHAS流量防护开源Sentinel
基础的流控降级、系统保护功能支持支持
慢SQL识别与熔断支持不支持
缓存防护 (Redis、Memcached)支持不支持
全自动托管、高可用的集群流控服务支持不支持
托管的Service Mesh集群流控支持不支持
渐进式熔断降级策略支持不支持
K8s自动弹性支持不支持
PHP应用高可用防护支持不支持

3.3.4 Seata分布式事务

支持高性能易于使用分布式事务解决方案,简单的可扩展自治事务架构。

分为3个部分:

事务协调器(TC):维护全局和分支事务的状态,驱动全局提交或回滚。

事务管理器(TM):定义全局事务的范围:开始全局事务,提交或回滚全局事务。

资源管理器(RM):管理分支事务处理的资源,与TC进行通信以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

Seata管理的分布式事务的典型生命周期:

  1. TM要求TC开始新的全局交易。TC生成代表全局交易的XID。
  2. XID通过微服务的调用链传播。
  3. RM将本地事务注册为XID到TC的相应全局事务的分支。
  4. TM要求TC提交或回退XID的相应全局事务。
  5. TC驱动XID的相应全局事务下的所有分支事务,以完成分支提交或回滚。

3.3.5 事件驱动rocketmq

支持构建与共享消息系统连接的高度可扩展的事件驱动微服务。

基于发布/订阅模式的分布式消息队列,具有异步、解耦、削峰的功能特点。目前阿里云的ONS服务就是基于rocketmq,应用非常广泛。

3.3.6 OSS阿里云对象存储

大规模,安全,低成本,高度可靠的云存储服务。支持随时随地在任何应用程序中存储和访问任何类型的数据。阿里巴巴商用的对象存储中间件,应用十分广泛。

3.3.7 阿里云SchedulerX

准确,高度可靠,高可用性的计划作业调度服务,响应时间在几秒钟之内。阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务

3.3.8 阿里云短信SMS

阿里云短信服务覆盖全球,可提供便捷,高效,智能的通信功能,帮助企业快速联系客户。

是广大企业客户快速触达手机用户所优选使用的通信能力。

调用API或用群发助手,即可发送验证码、通知类和营销短信;

国内验证短信秒级触达,到达率99%;

国际/港澳台短信覆盖200多个国家和地区,安全稳定,广受出海企业选用。

目前使用的商家:

4. SCA的工具

Spring Cloud Alibaba的bootstrap站点:start.aliyun.com,其中主要有2工具:**java工程脚手架**、**沙箱动手实验室**。

内部标语:

马上安装Alibaba Cloud Toolkit,减少重复性工作,释放开发者创造力。

4.1 Java工程脚手架

4.2 沙箱动手实验室

4.2.1 沙箱实验室的几个demo场景,可以直接在阿里云创建免费资源并自动部署:

4.2.2 也可以通过java工程脚手架创建自己的demo项目,然后通过沙箱实验室进行自动部署:

环境介绍

该环境是一套独立的运行容器。只需要通过浏览器即可与容器交互。 本环境提供命令行文件浏览器两种交互方式,可以选择习惯的使用方式。 通过这些工具,可以查看、修改、编译、运行自定义的 java 代码。

一些限制:

  • 本环境只有1小时的使用时间,到期环境自动释放;
  • 由于环境本身服务需要使用一些端口,所以请注意避免端口冲突,尤其是:80、8080、8090
  • 修改端口的配置,一般都在 application.properties 文件中,请根据自己选择的组件修改对应配置项
  • 本环境已经内置了很多主流语言包括:Java、Go、Python、Nodejs、PHP、Ruby;以及很多主要的工具环境,包括:git、maven。

沙箱使用界面截图:

img

部署服务端应用过程截图:

由于资源编排栈的问题,这个demo无法在ROS中运行。

4.2.3 SCA脚手架——Cloud Toolkit

此外,插件Cloud Toolkit 还提供了大量云原生开发过程中的提效工具,还包括一些常用的功能,比如:

  • 本地 IDE 内项目一键部署到任意远程服务器
  • 本地 IDE 内项目一键部署到任意 Kubernetes
  • 本地 IDE 内项目一键打包并推送 Docker 镜像到阿里云镜像仓库
  • 本地 IDE 内项目一键部署到阿里云ECS、EDAS(企业级分布式应用服务)、SAE(Serverless 应用引擎) 、Web+、小程序云和ACK(容器服务Kubernetes)
  • 内置 Terminal 终端
  • 文件上传器
  • 查看远程服务器运行时日志
  • 阿里云小程序开发工具
  • 阿里云函数计算开发工具
  • 内置 SQL 执行器
  • Apache Dubbo 和 Spring Cloud 框架项目模板&代码生成
  • 远程 Java 程序运行时诊断工具
  • 微服务远程调试

点击了解产品详情:cn.aliyun.com/product/clo…

目前来看Cloud Toolkit支持的IDE有:

IntelliJ、Visual Studio Code、Eclipse、PyCharm

一键部署的性能提升

5. SCA的未来规划

这张图是SCA 2020 MeetUp 杭州站的spring cloud alibaba的技术专家对于它的未来规划。

5.1 分为3个阶段:

(1)稳定性提升:保证稳定是第一要务;存量issue尽快处理;

(2)跟进官方:Spring Cloud & Spring Boot 新版本跟进;解决新版本兼容性问题;

(3)新特性Dubbo网关分布式追踪Function Compute编程生态

来聊一聊SCA的新特性规划,分为3个方面:Dubbo网关,分布式追踪,Function Compute编程生态。

5.2 为什么SCA要在这3个方面发力呢?

Dubbo网关

首先,网关是SCA目前没有,但是对于微服务开发来说非常重要的一个组件。对标的竞品是Spring Cloud 官网的 Gateway,以及Spring Cloud Netflix的Zuul网关,还有开源的Kong网关。

那什么是网关呢?

网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关对收到的信息要重新打包,以适应目的系统的需求。同时,网关也可以提供过滤和安全功能。大多数网关运行在OSI 7层协议的顶层--应用层

打个比方:

你要找小明,但是你不知道小明的联系方式。于是你通过询问老师,老师是DNS(域名解析系统)。简单来讲,你家小区的看门大爷就是你的网关

小不点:李大爷,我想找班主任查一下小明的电话号码行吗?

李大爷:好,你等着。(接着李大爷给你的班主任挂了一个电话,问清楚了小明的电话)问到了,他家的号码是211.99.99.99

小不点:太好了!李大爷,我想找小明,你再帮我联系一下小明吧。

李大爷:没问题。(接着李大爷向电话局发出了请求接通小明家电话的请求,最后一关当然是被转接到了小明家那个院子的王大爷那里,然后王大爷把电话给转到小明家)

就这样你和小明取得了联系。

网关还可以进行相应的限流、API转发、API统一管理等功能。

而SCA就缺这个网关的功能,他们要搞一套dubbo网关来弥补这个缺口。

分布式追踪

分布式追踪就是我们常说的链路追踪

现在越来越多的应用迁移到基于微服务的云原生的架构之上,微服务架构很强大,但是同时也带来了很多的挑战,尤其是如何对应用进行调试,如何监控多个服务间的调用关系和状态。如何有效的对微服务架构进行有效的监控成为微服务架构运维成功的关键。用软件架构的语言来说就是要增强微服务架构的可观测性(Observability)。

订单系统的服务之间的调用顺序

微服务的监控主要包含以下三个方面:

  • 通过收集日志,对系统和各个服务的运行状态进行监控
  • 通过收集量度(Metrics),对系统和各个服务的性能进行监控
  • 通过分布式追踪,追踪服务请求是如何在各个分布的组件中进行处理的细节

函数式计算

函数计算是事件驱动全托管计算服务。使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码。函数计算为您准备好计算资源,弹性地、可靠地运行任务,并提供日志查询、性能监控和报警等功能。

借助函数计算,您可以快速构建任何类型的应用和服务,并且只需为任务实际消耗的资源付费。

函数式计算是serverless架构的一种实现方式。那么什么是serverless?

Serverless的架构演进图