Appearance
🚀 第1章 进入SCA的世界
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案,它是 Spring Cloud 组件被植入 Alibaba 元素之后的产物。利用 Spring Cloud Alibaba,可以快速搭建微服务架构并完成技术升级。中小企业如果需要快速落地业务中台和技术中台,并向数字化业务转型,那Spring Cloud Alibaba 绝对是一个“神器” 。本章带大家熟悉一些 IT 领域的基础架构理论,算是一盘“开胃菜”
🚀 1.1 了解微服务架构
应用架构经历了从单体架构、SOA 架构,到微服务架构、服务网格架构、Serverless 架构的演变。
单体架构和微服务架构是应用架构阶段中比较成熟的架构模式,下面会重点阐述单体架构和微服务架构的关系。
🚀 1.1.1 单体架构与微服务架构的区别
单体架构与微服务架构到底有什么区别,其实可以从文字上推敲一下:
单体架构重点强调“单”。所有的单体架构应用程序都采用一样的架构,业务功能强耦合在一个工程中,整体部署。(采用单体架构的应用程序被称为“单体应用程序”)
微服务架构重点强调“微”。“微”这个词在微服务架构中的含义是“简单”。微服务架构就是将复杂的“巨无霸”服务拆分为简单的服务,并分布式部署,输出完整的业务能力。(采用微服务架构的应用程序被称为“微服务应用程序”)
🚀 单体架构
采用单体架构的应用程序会耦合很多子模块,子模块相互配合才能完成特定领域的业务功能。在单体应用程序中,所有服务 API都被打包在一个 War 包中,War 包在启动后会作为一个进程运行。用户界面(比如浏览器)、数据访问层(比如 Tomcat集群)和数据存储层(比如 MySQL数据库)是紧密耦合的。通常小型团队在软件开发的早期阶段会采用单体架构。一般的单体架构如图:
通常,用户通过浏览器访问业务功能;用Apache 服务器作为前端的负载均衡器,整体后端业务被通过一个 War 包部署到 Tomcat 集群;业务功能可以整体扩展,DB 共用一个数据库(例如MySOL数据库)。
从以上的单体架构中可以看到:前台UI、用户中心服务、交易中心服务及订单中心服务被部署在一个进程中(如果前后端没有分离,则前台UI也会和后端一起部署);服务都是本地调用,不存在网络抖动的风险,在一定程度上提升了部分业务接口的性能,并且开发流程比较简单。
随着团队规模变大、业务拓新和裂变,团队会不断引入新技术,以提升业务功能的交付效率业务拓新和裂变会带来代码量的急增,单体架构也就变得很难维护,技术就成了业务发展的绊脚石。
但是单体架构也是有它的可取之处。
单体架构的优点:
- 开发单体架构应用程序通常简单。
- 所有组件都被打包成一个 War 包,非常易于部署。
- 易于扩展整个应用程序。
单体架构的缺点:
- 代码库庞大,从而增加了代码开发和维护的复杂度。
- CI/DI集成和部署复杂度高,需要专门的团队来构建和部署,
- 开发人员利用 IDE 工具开发服务的成本剧增,庞大的代码库使 IDE 变慢,从而使得构建时间增加。
- 由于单体架构不满足“高内聚,低耦合”的架构设计原则,所以导致技术架构升级和代码重构成本较高。
- 应用启动耗时多。
- 故障影响范围大。
🚀 微服务架构
在软件领域,对于微服务的概念并没有严格的定义。
我们可以将微服务定义为:一堆松散耦合的组件,它们一起工作以执行任务;这些轻量级的组件可以通过各种语言(Java、PHP或Python)完成开发,并且它们可以使用各种协议(HTTP HTTPS 或 JMS)进行通信;大多数微服务通过 REST API暴露服务,完成跨平台服务调用。
微服务架构遵循“高内聚,低耦合”的架构设计原则。
微服务的优点:
每个微服务都很小,都专注于特定领域的功能和业务需求。所以,微服务通常会和领域模型关联。
微服务可以由小型开发人员团队(通常为 2~5个开发人员)独立开发。
微服务是松散耦合的,这意味着服务的开发和部署是独立的。
可以使用不同的编程语言来开发微服务(团队可以统一技术栈,便于技术管理)
微服务提供了一种轻松灵活的方式来集成自动部署工具与持续集成工具(例如:Jenkins、Hudson、Bamboo等)。
微服务架构可以快速引进最新技术(框架、编程语言、编程实践等)
微服务架构易于根据需求进行扩展。
微服务架构流程编排非常容易。
一个组件出现故障,不会导致整个系统停机。
在开发整体解决方案时,可以多个小型团队并行开发不同的微服务任务。因此,它有助于减少开发时间。
CI/CD 非常容易。
典型的微服务架构如图所示:
微服务架构通常包含如下内容:
客户端 App 和浏览器:微服务的服务对象,即功能体验者。
负载均衡器:通常指 Nginx 和 SLB 等。
APIGateway:通常指业务网关。常规的技术栈包括 Spring Cloud Gateway和 Zuul 等。
Web 服务:通常指 RESTfu API服务。它通过后台管理系统统一配置 API的路由信息并实时地将路由信息推送到由APIGateway,APIGateway将 RESTfuIAPI通过统- 的域名暴露给 App 或者浏览器。
Web 服务与微服务通过 RPC 通信,当然也可以通过 HTTP 通信。APlGateway 也可以直接与微服务通信,比如 Spring Cloud Gateway 可同时支持 Dubbo 和 RESTfulAPI通信 。
在电商系统中有账户服务、资产服务、商城服务和订单服务等,这些服务对于微服务架构来说都只是某一个领域里的能力输出点。微服务面向的技术人员,主要包括开发人员、测试人员和运维人员。在微服务架构中,所有的服务会有独立的数据库,数据都会被物理隔离
。
微服务架构的缺点:
- 代码维护成本比单体架构较高。
- 在跨进程通信时,需要引入分布式技术栈以保证系统之间的高可用、高性能和高并发性,技术复杂度成几何数递增。
- 在采用微服务架构后,业务调用链路比单体架构更长,网络性能开销成倍增长,开发人员需要具备更强的业务理解能力和技术拓新能力。
🚀 1.1.2 分布式架构与微服务架构的区别
下面分析下分布式架构与微服务架构的区别。
🚀 分布式架构
分布式系统的组件位于不同的互联网计算机上,这些计算机通过相互传递消息进行通信和协调它们的行动指令。这些组件相互交互,以实现共同的目标。
分布式系统中的网络是由使用分布中间件连接的自治计算机组成的,这有助于分享不同的资源和能力,为用户提供单一和综合连贯的网络。
分布式系统是由自治的组件或计算机组成的。从任何用户或应用程序看来,分布式系统都是一个单一的系统。
构建分布式系统的关键之一是“如何在这些自治组件之间建立通信和协调”,这个也是分布式架构面临的最大挑战。
分布式架构通常要考虑如下因素。
(1)服务调度和编排管理。
为了应对不断增长服务实例和容器的规模带来的技术挑战,服务调度和编排管理成为分布式系统中关键的组成部分。服务调度和编排管理领域比较成熟的产品有Docker Swarm、Kubernetes、 Mesos、Marathon 等。
(2)服务注册与发现。 从几个服务到几百个,甚至上千个微服务,服务之间的调用关系越来越复杂。Consul、 ZooKeeper、Etcd、Confd、Nacos 和 Eureka 等是这个领域的一些成熟产品。这些产品大多支 持跨服务实例的 RPC 流量的负载均衡。
(3)系统状态管理和集群管理。 随着集群规模的增长,需要管理集群中机器节点的运行状态,比如每个服务的 SRV、容量规划 负载流量等。Docker Swarm Agent、Kubernetes、Mesos、Containership 等是这个领域的- 些成熟产品。Skywalking、Cat等分布式链路追踪工具,能监控集群中机器节点的运行状态。
(4)数据存储。
容器存储是临时的。这意味着,需要存储在容器生命周期之外的数据都必须存储在外部存储设备中,比如使用 Docker Volume Plugin、Flocker 和 Kubernetes Persistent volume 等。
(5)网络。
网络是分布式架构中服务性能的关键指标。服务之间通过 RPC 通信,通信肯定是要联网的。
通常开发人员和运维人员在沟通线上服务器如何部署时,总是最先确认服务之间网络的可用性、网络的带宽是多少。
网络也是分布式架构中影响服务调用可用性的重要因素。通常开发人员做性能优化,最新想到的是优化网络的 I/O 开销。
(6)容器中运行着不同的服务进程,需要管理这些进程及进程之间的访问权限。
如果多个容器在同一主机上运行,则在共享网络资源时可能需要创建安全组以进行容器隔离。
同样,如果希望容器能发现跨主机托管的服务,则需要一个简单的模型来访问这些服务。Flannel、Weaveworks 和 Calico 等是这个领域的一些产品(容器隔离技术)。
(7)监控、审核和日志。
如果有成千上万个容器在运行,则监视/审核/记录所有容器是一个棘手的问题,因为需要从每个容器中提取数据/日志进行分析。Loggly、Fluentd、日志条目、Datadog 和 ELK 堆栈等是这个领域的一些产品。
🚀 如何区分微服务架构与分布式架构
从概念理解的角度来看,分布式服务架构强调的是“服务化”及“服务的分散化”,而微服务架构则更强调“服务的专业化”和“精细分工”。
从实践的角度来看,微服务架构通常是分布式服务架构,反之则未必成立。
所以,选择微服务架构通常意味着需要解决分布式架构的各种难题。
微服务架构是目前技术团队面对互联网产品爆发式增长的最优选择,要解决的是快速迭代、高可靠和高可用等问题
。
把复杂度很高的产品拆分成一些较小的模块(每一个模块用5~9个小团队来维护),并遵循康威定律,这样可以减少沟通成本,提高协作效率,更好地实现快速迭代和弹性扩展。
🚀 1.2 构建微服务架构
🚀 1.2.1 构建微服务架构的目标
微服务可以对企业产生积极的影响,一般来说,构建微服务架构有以下四个目标。
- 降低设计、实现和维护 IT 服务的总体成本。
- 提高从服务构建、打包到部署的速度。
- 提高系统的弹性。
- 使得在微服务运行过程中,服务的状态是可度量和可观测的。
🚀 1.2.2 构建微服务架构的关键点
通常在构建微服务架构时要考虑如下关键点:
🚀 1.可伸缩性
可伸缩性是反映软件系统计算处理能力的指标,它代表了一种弹性:在系统扩展过程中,软件能够保证旺盛的生命力,通过很少的改动(甚至只是硬件设备的添置),就能实现整个系统处理能力的线性增长,实现高吞吐量、低延迟和高性能。
提升可伸缩性和纯粹的性能调优有着本质区别:
- 提升可伸缩性,是综合考量和平衡高性能、低成本和可维护性等诸多因素,讲究平滑且线性的性能提升,侧重于系统的水平伸缩,通过廉价的服务器实现分布式计算。
- 纯粹的性能调优,优化的只是单台机器的性能。
提升可伸缩性和纯粹的性能调优的共同点是:根据应用系统的特点,在吞吐量和延迟之间进行一个侧重选择。当然,水平仲缩分区会受到 CAP定理约束。
软件的可扩展性设计非常重要
,但又比较难以掌握。业界试图采用云计算或高并发语言等方式来节省开发者的精力。但无论采用什么技术,如果应用系统内部是“铁板”一块(例如严重依赖数据库),则在系统达到一定访问量时,负载都会集中到一两台数据库服务器上,这时进行分区扩展和伸缩就比较困难。正如 Hibernate 框架创建人 Gavin King 所说:关系数据库是最不可扩展的
。
🚀 2.可用性
业界通常用多少个“9”来衡量系统的可用性,用 99.99%表示一年中系统有1小时左右的不可用时间。
任何一个服务的可用性都不会是 100%,在服务运行时间里很有可能发生故障。把功能集中的单体架构拆分成多个相互独立的微服务架构,虽然可以降低一损俱损的全局故障风险,但由于微服务之间存在大量的依赖关系,随着微服务个数的增多,依赖关系也会变得越来越复杂。而且,每个微服务架构都有可能发生故障,如果不能进行故障隔离,避免故障的连锁反应,则结果可能比单体架构更糟糕。
服务可用性=(服务周期总分钟数-服务不可用分钟数)/服务周期总分数x100%
- 服务周期:一个服务周期为一个自然月。
- 服务周期总分钟数:按“服务周期内的总天数x24(h)x60(min)”计算。
- 服务不可用分钟数:如果在某一分钟内,试图与指定微服务注册中心建立连接的连续尝试均失败,则视为该分钟内该微服务不可用。在一个服务周期内,“微服务不可用分钟数之和”即“服务不可用分钟数”。
假设有 100个微服务,并且每个微服务只发生1种故障,那么总共会有 100 种不同的故障(其实每个微服务可能有不止1种故障)。
确保微服务架构的高可用性所面临的巨大挑战如下:
- 如果服务 A 发生故障,如何确保依赖服务 A的服务 B的可用性。
- 如果系统出现故障,如何将故障服务自动地隔离,如何实现故障服务的调用方的优雅降级。
🚀 3.弹性能力
开发人员越来越依赖用微服务架构将应用程序构建为一组细粒度、重点狭窄且独立的服务,每个服务均被独立开发和部署。
尽管微服务方法促进了敏捷性,但它也带来了新的挑战:这些服务必须通过网络调用在相互之间进行交互,以及与其他系统(例如Web API和数据库)进行交互,但由于网络始终有不可靠的因素,所以此类交互随时可能出现故障。
因此,基于微服务的应用程序的弹性(即从某些类型的故障中恢复并保持功能的能力)
,在很大程度上取决于该应用程序处理不可靠网络上的服务间通信的能力。
因此,基于微服务的应用程序的弹性,在很大程度上取决于您所实现的微服务通信的弹性。
🚀 4.可扩展性
可扩展性是一个系统或应用程序的属性,表示系统或应用程序可以处理更多的工作,或者很容易地进行扩展,以应对网络访问、数据处理、数据库访问和日益增长的文件系统访问需求。
可扩展性通常分为水平扩展性和垂直扩展性。
(1)水平扩展性:在系统进行扩展时,通过添加与现有节点功能相同的新节点,在所有节点之间重新分配负载(可以横向扩展或向上扩展)。
对于 SOA 系统和 Web 服务器,可以通过向负载平衡网络中添加更多的服务器来扩展以将传入的请求分布在所有服务器中。
(2)垂直扩展性:向系统中的机器节点添加处理器、内存、存储设备或网络接口来扩展,以提升系统的 TPS 处理能力,系统会垂直或向上扩展。
虚拟主机通过增加处理器的数量或主内存的数量来扩大规模,以便在同一个硬件中承载更多的虚拟服务器。
🚀 5.高内聚低耦合性
“高内聚,低耦合”是软件工程中的概念,是判断设计好坏的标准。“高内聚,低耦合”要求开发人员要面向对象进行系统设计。
🚀 6.服务治理能力
当应用从单体架构变为微服务架构后,我们需要管理更多的应用服务,服务数量可能会成倍增加。面对这样的挑战,我们必须具备服务治理能力。
🚀 7.故障隔离
微服务架构通过定义明确的服务边界来有效地隔离故障。和其他分布式系统一样,微服务架构在网络、硬件和应用层都会存在很多问题。由于服务间是互相依赖的,因此任何服务出错都会导致用户不可用。为了尽可能减少故障的影响范围,我们需要构建容错能力强的服务,通过容错来隔离故障。
微服务架构将应用逻辑拆分成若干个服务,服务之间通过网络交互。服务是通过网络被调用的而不是在进程中被调用的,这给需要在多个物理和逻辑组件间进行协作的系统带来了潜在的问题和复杂性。分布式系统越复杂,则网络特定故障发生的可能性越大。
相比于传统应用庞大的结构,微服务架构最大的一个优点是:团队能独立地设计、开发和部署各自的服务。团队能掌控各自服务的整个生命周期。这也意味着,服务之间的调用链路关系会非常长,并且会存在强依赖的调用关系。
在微服务架构中,通常服务的调用链路都是跨团队的。服务的发布和配置等会导致被调用的服务暂时不可用。因此,调用方要确保自己的服务具备隔离故障的能力。
🚀 8.通过 DevOps 持续交付
DevOps 是指,开发团队和运维团队不再是分开的两个团队,而是“你中有我,我中有你”的一个团队。
如果从字面上来理解,DevOps 只是“Dev(开发人员)+Ops(运维人员)”。但实际上它是一组过程、方法与系统的统称。
DevOps 概念在 2009 年首次被提出,发展到现在其内容也在不断丰富,有理论也有实践,包括组织文化、自动化、精益、反馈和分享等不同方面:
- 组织架构、企业文化与理念等,需要自上而下设计,用于促进开发部门、运维部门和质量保障部门之间的沟通、协作与整合。简单而言,其组织形式类似于系统分层设计。
- 自动化是指,所有的操作都不需要人工参与,全部依赖系统自动完成。比如上述的持续交付过程必须实现自动化才有可能实现快速选代。
- DevOps 的出现是因为软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发部门和运维部门必须紧密合作。
总之,DevOps 强调的是团队之间可以通过自动化工具来进行协作和沟通,以完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。
🚀 1.3 认识SCA
2018年10月31 日,Spring Cloud Alibaba 正式开源,并提交了第一个正式稳定版本0.1.0.RELEASE。Spring Cloud Alibaba 用了不到两年的时间,完成了从0到1,成为 GitHub上的明星项目。
笔者认为,除社区孜孜不倦地持续选代功能
外,最关键还是Spring Cloud Alibaba 的架构设计理念非常契合目前微服务架构生态的演进路径
。微服务架构本质上就是分布式架构,Spring Cloud Alibaba为开发分布式应用程序提供了一站式解决方案,它包含开发分布式应用程序所需的所有组件
。
🚀 功能特性
开发者只需要添加一些注释和少量配置,即可将 Spring Cloud 应用程序连接到 Spring Cloud Alibaba 的分布式解决方案,并使用 Spring Cloud Alibaba 的中间件构建分布式应用程序。
Spring Cloud Alibaba的主要功能:
- 服务注册与发现
- 分布式配置
- 消息总线
- 分布式事务
- Dubbo RPC
- 流量控制和服务降级
- 事件驱动
🚀 组件能力
Spring Cloud Alibaba 的组件功能既有免费版本,也有收费版本。组件如下:
Nacos:一个具备动态服务发现和分布式配置等功能的管理平台,主要用于构建云原生应用程序。
RocketMQ:一个高性能、高可用、高吞吐量的金融级消息中间件。Spring Cloud Alibaba将 RocketMO 定制化封装,开发人员可“开箱即用”
Dubbo:一个基于 Java 的高性能开源 RPC 框架。
Seata:一个高性能且易于使用的分布式事务解决方案,可用于微服务架构。
Sentinel:以“流”为切入点,在流量控制、并发性、容错降级和负载保护等方面提供解决方案,以保护服务的稳定性。
阿里云 OSS(阿里云对象存储服务):一种加密的安全云存储服务,可以存储、处理和访问来自世界任何地方的大量数据。
阿里云 SchedulerX:一款分布式任务调度产品,支持定期任务和在指定时间点触发任务。
阿里云 SMS:一种覆盖全球的消息服务,提供便捷、高效和智能的通信功能,可帮助企业快速联系其客户。
🚀 1.4 学习SCA的建议
在学习 Spring Cloud Alibaba 之前,需要先熱悉 Spring Boot和 Spring Cloud 的基础原理( 这里默认读者是具备 Spring Framework 项目开发能力的)。由于本书主要是针对 Spring Cloud Alibaba 的,所以下面只简单地讲解一下 Spring Boot和 Spring Cloud,如果需要深入研究,可以自行查找相关资料。
🚀 1.4.1 熟悉Spring Boot
很多 Spring 的初学者经常会因为其烦琐的配置文件而却步,特别是对于一些还没有被拆分的老项目。很难想象在增加一个新的需求,或在引入一个新的技术组件时,业务开发人员需要重复地增加多少冗余的配置文件。
在 Spring 中,如果需要开启一个新的项目,则一般是利用复制功能快速搭建出项目骨架。但是每个项目往往又存在很多差异,所以还需要手动地一个个去修改,这就增加了项目的技术复杂度。
业务开发人员不仅要关注项目的业务逻辑,还要花时间熟悉一些比较底层的技术细节。
很多技术专家和架构师会去尝试封装一些基础组件,但是这些组件很多都不能做到“开箱即用”。
Spring Boot 是一款“开箱即用”的基础服务框架,它通过 Factory 机制完成普通 POJO 对象的初始化,并将这些对象注入I0C 容器中;通过条件注解控制 Bean 对象之间的依赖关系,业务开发人员通过注解即可完成指定功能的注入。
🚀 1.4.2 熟悉Spring Cloud
Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性,巧妙地简化了分布式系统基础设施的开发流程。例如,服务发现/注册、配置中心、消息总线、负载均衡、断路器、数据监控等功能,都可以用 Spring Boot 的开发风格做到一键部署和启动。
Spring Cloud 并没有“重复制造轮子”,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 Spring Boot 风格进行再封装,屏蔽了复杂的配置和实现原理,最终给开发者提供了一套简单易懂、易部署和易维护的分布式系统开发工具包。
Spring Cloud 并不是 Spring Framework 团队全新研发的框架,它只是把一些“能解决微服务架构中常见问题的优秀开源框架”基于 Spring Boot 和 Spring Cloud 规范进行了整合,通过Spring Boot 框架进行二次封装,屏蔽了负载的 XML 文件配置,给业务开发者提供了“开箱即用的良好开发体验。
可以总结出:Spring Cloud 是一套标准的开发规范,是微服务架构的“一篮子”解决方案。
1.功能特性
Spring Cloud 具有以下特性:分布式/版本化配置、服务注册与发现、服务路由、服务负载均衡、用于服务降级的断路器、确保数据一致性的全局锁、分布式集群选举算法、分布式消息总线。
2.组件
Spring Cloud 的子项目大致可分成:
(1)对现有成熟框架 Spring Boot 的封装和抽象--这也是数量最多的子项目
(2)对一部分分布式基础能力的实现,如 Spring Cloud Stream 通过消息总线封装了 Kafka和 ActiveMQ。
对于想快速实践微服务的开发者来说,第(1)类子项目就已经足够使用了。SpringCloud 常用组件见表 1-1。
表 1-1 Spring Cloud 的组件
Spring Cloud 组件 | 功能描述 |
---|---|
spring-cloud-sleuth | 分布式链路追踪和性能监控 |
spring-cloud-config | 分布式配置服务 |
spring-cloud-aws | 支持 AWS 云 |
spring-cloud-consul | 支持微服务治理框架 Consul |
spring-cloud-gateway | 支持高性能业务网关 Gateway |
spring-cloud-security | 用来实现微服务架构中的安全认证 |
spring-cloud-openfeign | 支持 HTTP 客户端 Openfeign |
spring-cloud-netflix | 支持 Netflix 微服务治理“全家桶”,比如 Euraka |
spring-cloud-stream-binder-kafka | 支持分布式消息中间件 Kafka |
spring-cloud-dataflow | 支持数据流服务 |
spring-cloud-commons | Spring Cloud 服务治理的公共包 |
spring-cloud-circuitbreaker | 熔断和降级 |
spring-cloud-zookeeper | 支持分布式组件 ZooKeeper |
spring-cloud-bus | 分布式消息总线 |
spring-cloud-kubernetes | 支持基于 K8s 部署的应用集群管理 |
spring-cloud-task | 支持分布式定时任务 |
spring-cloud-function | 支持函数式编程 |
🚀 1.4.3 Spring Cloud Alibaba的版本演进
Spring Cloud Alibaba 的版本演进如下:
- Spring Cloud Alibaba 的第一个正式开源版本是 0.1.0.RELEASE
- 2.1.0.RELEAS 版本,引入了 Sentinel、Nacos Config、RocketMQ 及 Seata。
- 2.1.1.RELEASE 版本,在 2.1.0.RELEASE 的基础上新增了 Spring Cloud Alibaba Sidecar。
- 2.2.0.RELEASE 版本,支持Sentinel的 1.7.1 版本、Dubbo 的 2.7.4.1 版本。
- 2.2.1.RELEASE 版本,支持Nacos Client的 1.2.1版本、Seata的 1.1.0 版本、Dubbo的 2.7.6 版本。
- 2.2.2.RELEASE版本,支持Nacos Client 的1.3.2版本、Seata的 1.3.0版本、Sentinel的 1.8.0 版本、Dubbo 的 2.7.8 版本。
- 2.2.3.RELEASE 版本,支持 Nacos Client 的 1.3.3 版本。
Spring Cloud Alibaba 目前(2021年3月)最新版本为 2.2.5.RELEASE。
🚀 1.5 SCA与SpringCloud关系
Spring Cloud Alibaba与 Spring Cloud 的关系如图所示。Spring Cloud Alibaba 是Spring Cloud 的超集。
在图中,业务能力代表应用的服务,服务之间通过 HTTP 或者 Dubbo 进行通信。
在没有 Spring Cloud Alibaba 之前,如果应用使用 Spring Cloud 作为基础框架,并使用Spring Cloud 生态的服务治理能力(只支持 HTTP 或者 DNS),则其是不能兼容 Dubbo 服务的。
在 Spring Cloud Alibaba 出现后,服务可以快速地完成 HTTP 和 Dubbo 通信的适配。
Spring Cloud Alibaba 依赖 Spring Cloud,并通过二次开发让开发者使用 Spring Cloud 更加简单和灵活。开发者可以直接使用 Spring Cloud Alibaba 来替换 Spring Cloud。在 Spring Cloud Alibaba 出现后,开发者可以在应用中采用 Spring Cloud 的协议和 Dubbo 的协议混合通信。
如果业务原先采用“Spring Cloud +Eurcka/Consul”微服务体系,则可以快速切换到 Spring Cloud Alibaba 微服务体系。
如果业务还停留在单体架构,则可以几乎零成本地切换到 Spring Cloud Alibaba 微服务体系,风险很小。
如果业务应用要上阿里云,则可以直接采用 Spring Cloud Alibaba 的商业版来实现,成本非常小。
🚀 1.6 搭建基础环境
开发人员要使用 Spring Cloud Alibaba 进行开发,则必须先搭建基础环境,包括 Maven 和 Git。
🚀 1.6.1 安装Maven
Maven 是一个软件项目管理工具,它基于项目对象模型(POM)的概念。
开发团队几乎不用花多少时间就能完成工程的基础构建配置,因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。
如果有多个开发团队,则 Maven 能够在很短的时间内使得每项工作都按照标准进行。因为大部分的工程配置操作都非常简单并且可复用,所以在创建报告、检查、构建和测试自动配置时,Maven 可以让开发者的工作变得更简单。
Maven 能够帮助开发者完成以下工作:构建代码、生成代码文档、度量代码、添加依赖、添加 SCM(软件配置管理)、发布代码、分发代码、添加邮件列表。
总的来说,Maven 简化了工程的构建过程,并对其进行了标准化。它可以无缝衔接代码编译发布、文档生成、团队合作和其他任务。Maven 提高了代码功能的重用性,并且能够高效地构建生产环境的程序包。
🚀 安装 Maven
安装 Maven 很简单:只需提取存档,并将带有 mvn 命令的 bin 文件夹添加到 PATH 中即可
详细步骤如下:
(1)安装JDK,并配置环境变量。
(2)下载 Maven 的安装包,并解压缩。
(3)配置 Maven 的环境变量:
shell
# 新建环境变量
M2_HOME=C:\MyDisk\Licb\CodeUp\SD\Soft\apache-maven-3.9.9
# path追加
%M2_HOME%\bin
(4)输入“mvn -version”命令,如果出现如图 1-4 所示的界面,则表示 Maven 配置成功。
shell
C:\Users\admin>mvn -version
Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)
Maven home: C:\MyDisk\Licb\CodeUp\SD\Soft\apache-maven-3.9.9
Java version: 22.0.1, vendor: Oracle Corporation, runtime: C:\All\Soft\Java\jdk-22
Default locale: zh_CN, platform encoding: UTF-8
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
🚀 Maven 的专业术语
(1)POM
POM 代表工程对象模型
。它是使用 Maven 打包代码的一个基本组件,也是一个XML 文件。它被放在工程的根目录下,文件名为 pom.xml。
POM 包含工程和各种配置细节的信息,Maven 使用这些信息构建工程。POM 也包含目标和插件。在执行一个任务或者目标时,Maven 会查找当前目录下的POM,从中读取所需的配置信息,然后执行。
(2)构建生命周期
构建生命周期是一组“阶段”的序列(sequence ofphases),每个“阶段”定义了 POM 依赖执行的顺序。这里的“阶段”是生命周期的一部分。
(3)构建配置文件
构建配置文件是一组配置的集合,用来设置或者覆盖 Maven 构建的默认配置。可以使用构建配置文件为不同的环境(例如 Producation 和 Development 环境)定制构建过程。
在 pom.xml 中,使用“activeProfiles/profiles”元素来指定 Profile,并且可以用很多方式触发它。可以在构建 Profile 时修改 POM,并为变量设置不同的目标环境(例如,在开发、测试和产品环境中的数据库服务器的路径)。
(4)仓库
在 Maven 中,仓库是一个位置,例如目录,它可以存储所有的工程Jar 文件、Library Jar 文件、插件,以及其他由工程指定的文件。Maven的仓库有3种类型:本地(local)、中央(central)和远程(remote)。
(5)插件
Maven 实际上是一个依赖插件的框架,所有任务实际上是由插件完成的。Maven 插件通常被用来创建 Jar 文件、创建 War 文件、编译代码文件、测试代码单元、创建工程文档和创建工程报告。
(6)快照与版本
快照是一个特殊的版本(当前开发文件的一个副本)。与常规版本不同,Maven 在每一次构建时都会从远程仓库中“克隆”一份新的快照。
开发人员将每次更新的快照(例如 data-service:1.0-SNAPSHOT)发布到仓库中,以替换旧的快照。
对于版本:Maven 一旦下载了指定的版本(例如 data-service:1.0),就将不会再从仓库下载一个新的相同版本(这里指不会下载 1.0 版版本)。如果要下载新的代码,则数据服务版本需要被升级到 1.1 版本。
对于快照:每次在用户接口团队构建他们的项目时,Maven 将自动获取最新的快照(data-service:1.0-SNAPSHOT)。
🚀 1.6.2 熟悉Git
Git 是一个免费的开源分布式版本控制系统,旨在快速、高效地处理从小型项目到大型项目的所有内容。它易于学习,占用空间小,具有闪电般的快速性能。
相比 Subversion、CVS、Perforce 和 ClearCase 之类的 SCM 工具,Git 具有廉价的本地分支、方便的暂存区域和多个工作流等功能。
如果读者已经安装了 Git,则可以输入“git version”命令来验证 Git 是否可用。
shell
C:\Users\admin>git version
git version 2.43.0.windows.1