Spring Cloud Alibaba Dubbo:服务调用
一、项目架构变化
1. 应用程序架构变迁
在过去的十数年中,互联网已经成为提供内容和服务的首要平台。因此,每个企业都需要走到线上,提供在线服务。随着互联网环境的高速发展、企业需求的不断递增,应用程序架构也在不断推演发展。从最传统的单体应用(分层开发思想),演进到分布式架构体系。而分布式架构体系也随着技术与需求的发展不断推演,从早期的RPC软件模型体系,到SOA架构、微服务架构。
2. 单体架构
单体架构就是一个项目里面包含这个项目中全部代码。一个应用程序完成全部功能的实现。
2.1 优点
部署简单、维护方便、开发成本低。
2.2 缺点
当项目规模大、用户访问频率高、并发量大、数据量大时,会大大降低程序执行效率,甚至出现服务器宕机等情况。
维护成本高、改动影响大(无论是修改1行代码,还是10行代码,都要全量替换)、部署频率低(无法快速交付客户需求)。无法满足快速扩容,弹性伸缩,无法适应云环境特性等问题。
2.3 适用场景
小型传统管理项目,小型互联网项目。
3. 分布式架构
分布式架构会把一个项目按照特定要求(多按照模块或功能)拆分成多个项目,每个项目分别部署到不同的服务器上。
3.2 优点
增大了系统可用性。减少单点故障,导致整个应用不可用。
增加重用性。因为模块化,所以重用性更高。
增加可扩展性。有新的模块增加新的项目即可。
增加每个模块的负载能力。因为每个模块都是一个项目,所以每个模块的负载能力更强。
3.3 缺点
开发成本更高。
架构更加复杂。
整体响应时间变长,一些业务需要多项目通信后给出结果。
3.4 适用场景
中大型企业管理类项目、互联网项目等。
4. 分布式架构 - SOA架构
SOA架构:Service-Oriented Architecture 面向服务架构。面向服务架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。此架构的核心在于ESB(企业服务总线 Enterprise Service Bus),ESB因过于笨重在目前新项目中已经很少使用了。
5. 分布式架构 - 微服务架构
微服务架构是分布式架构中的一种。
微服务(MicroService)的概念最早是在 2014 年由 Martin Fowler 和 James Lewis 共同提出,他们定义了微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计(微服务一个业务一个项目),以全自动方式部署,与其他服务使用特性的通讯协议(如:HTTP或RPC等)(每个项目都是一个标准的web项目)。同时,服务会使用最小规模的集中管理 (例如 Docker)技术,服务可以用不同的编程语言与数据库等。
微服务的核心在于:
- 微服务是分布式架构的一种。发展到现在微服务已经可以说是综合平台(架构以外还包含服务治理、注册中心、服务容灾等相关特性)。
- 微服务架构中每个Web项目都称为服务。
- 微服务拆分颗粒度为业务。
- 微服务中服务和服务之间使用特定协议通信(如:HTTP、PRC)。
- 微服务和Docker结合使用更方便。
5.1 微服务的特点
微服务架构的特点:针对特定服务发布,影响小,风险小,成本低;频繁发布版本,快速交付需求;低成本扩容,弹性伸缩,适应云环境等特点。微服务架构与现在企业中敏捷开发思想是匹配的,核心都是强调希望项目快速更新迭代。
在选择微服务在解决了快速响应和弹性伸缩的问题同时,它又给我们带来了如下问题:
分布式系统的复杂性;部署,测试和监控的成本问题;分布式事务和CAP的相关问题等。微服务架构相对于单体架构还需要处理很多事情。例如:分布式事务、团队合作等问题都需要明确的提前设计好。
5.2 微服务架构图
6. SOA架构和微服务架构的区别
SOA架构: 核心消息总线。消息总线过于笨重在目前项目中已经很少使用了。在SOA架构中每个项目都满足分布式要求,分别部署到不同的服务器上。
微服务服务架构:核心是把项目拆分成多个小服务,每个服务几天的时间就可以测试上线,版本迭代。在微服务架构中不要求每个服务独占一台服务器。可以结合Docker等技术把多个服务部署到一台服务器上。
7. 分布式和集群的区别
- 分布式:一种软件架构。把一个项目拆分成多个项目,每个拆分后的项目部署到不同的服务器上。
- 集群:把同一个软件部署多次,每个软件部署到不同的服务器上,让这些软件共同完成相同的事情。举例:部署Tomcat在服务器上,在Tomcat中有项目名称为Demo,在另一个服务器上也部署一个Tomcat,里面也包含Demo项目。用户访问第一个服务器和第二个服务器上项目都是一样的,在借助一些特殊工具让用户在浏览器一个地址能访问到两个项目(随机哪个,也可以按照特殊算法轮询),此时构成了Tomcat集群。我们会学习Eureka集群、Redis集群等都是把同一个软件部署多次。
如果把集群中所有软件都安装到一台服务器上,此时称为伪集群。学习期间都搭建是伪集群。
二、微服务架构常见实现框架
1. 微服务架构主流实现框架
当前市场主流的微服务实现框架就是:Spring Cloud。目前包含三大体系,分别是:
- Spring Cloud Netflix : 目前市场上使用最多的。
- Spring Cloud Alibaba:基于Dubbo的微服务架构体系实现。
- Spring 其他:为了摆脱受Netflix公司限制,逐渐推出一套组件。
三、Spring Cloud
1. SpringCloud简介
Spring Cloud是一系列框架的有序集合。它是基于Spring Boot框架提供的分布式技术实现。其有效的简化了分布式系统中各组件的开发复杂度,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司(如Netflix、Alibaba)开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。Spring Cloud可以在任何分布式环境中很好的提供服务,诸如开发者的工作电脑、服务器、云平台等。
Spring Cloud是一个顶级项目。它没有具体内容,但里面包含了很多子项目,Spring Cloud就是这些子项目的统称。 Spring Cloud包含了很多子项目,每个子项目都有对应的功能,所以Spring Cloud整体包含的功能是非常强大的。在本阶段,我们主要学习的是Spring Cloud Alibaba相关框架。
四、Spring Cloud版本号说明
1. 常见版本
常见版本号格式为: x.y.z.stage
x - 数字格式主版本号,当功能模块有较大更新或者整体架构发生变化时,主版本号会更新。
y - 数字格式次版本号,次版本表示只是局部的一些变动。
z - 数字格式修正版本号,一般是bug的修复或者是小的变动。
stage - 希腊字母版本号,也称为阶段版本号。用于标注当前版本的软件处于哪个开发阶段。常用的阶段版本包括:BASE、ALPHA、BATE、RELEASE/FINAL。
-
BASE - 设计阶段。只有相应的设计没有具体的功能实现。
-
ALPHA - 软件的初级版本。存在较多的bug。
-
BATE - 表示相对ALPHA有了很大的进步,消除了严重的bug,还存在一些潜在的bug。
-
RELEASE/FINAL - 该版本表示最终版,即正式发布版本。
开发中,使用的框架版本,最好是RELEASE版本或FINAL版本。
2. Spring Cloud版本
Spring Cloud是一个包含若干子框架的框架集合体,是一个完整的微服务框架体系,如果使用常见版本号来进行标记,容易混淆主框架版本和子框架版本标记。所以Spring Cloud使用一种全新的版本号来对主框架进行版本标记,而子框架的版本标记大多还是使用常用版本号标记的。
Spring Cloud版本格式如: 版本号命名.stage
版本号命名:早期的Spring Cloud主框架版本号是使用英国伦敦地铁站名称来进行标记的,并根据地铁站名称的首字母的英文自然升序排列来识别版本的递增。如:Angle、Brixton、Camden、Dalston、Edgware、Finchley、Greenwich 、Hoxton等。至Hoxton版本发行之后,Spring Cloud开始采用年份命名方式,如2020、2021等。
stage:阶段版本号。常用的阶段版本包括:BUILD-XXX[SNAPSHOT]、GA、PRE(M1、M2等)、RC、SR。
-
BUILD-XXX[SNAPSHOT] - 开发版本、一般是开发团队内部使用。
-
GA - 稳定版,内部开发到一定阶段了,各个模块集成后,经过全面测试发现没有问题,可对外发行了。这个时候叫GA(General Availability)。基本上可以使用了。没有严重的BUG问题,但是有未测出的BUG隐患。不推荐商业使用。
-
PRE - 里程碑版,由于GA还不属于公开发行版,里面还有些功能不完善或者bug,于是就有了milestone(里程碑版)。milestone版主要修复了一些bug。一个GA后,一般会有多个里程本版。例如 M1 M2 M3…。不推荐商业使用。
-
RC - 候选发布版,从BUILD后到GA在到M基本上系统就算定型了,这个时候系统就进入Release Candidate(候选发布版)。该阶段的软件类似于最终发行前的一个观察期,该期间只对一些发现的等级高的bug进行修复。发布RC1 RC2等版本。可以考虑RC版本。
-
SR - 正式发布版,公开正式发布。正式发布版一般也有多个发布,例如 SR1 SR2 SR3等等,一般是用来修复大bug或者优化。最好使用SR版本。至年份版本发布之后,正式发布版一般不做任何后缀标记。
要注意:Spring Cloud是基于Spring Boot,不同的Spring Cloud要使用不同的Spring Boot版本。
附:Spring Data的版本命名也是和Spring Cloud一样的,Spring Data版本也是使用字母/年份命名,其子项目使用常见版本命名方式。因为Spring Data和Spring Cloud都是一系列框架的统称。
五、Spring Cloud Alibaba简介
1. Spring Cloud Alibaba简介
Spring Cloud Alibaba 是Spring 公司下顶级项目Spring Cloud 的二级子项目。
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。该项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
2. Spring Cloud Alibaba版本简述
2018年10月31日,Spring Cloud Alibaba正式入驻Spring Cloud 官方孵化器,并在Maven中央仓库中发布第一个版本:Spring Cloud for Alibaba 0.2.0 released版本。目前可以在https://mvnrepository.com/查找到的最老版本1.5.0.RELEASE版本。最早时间为2019年8月。(https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies)
3. 依赖管理
Spring Cloud Alibaba 软件环境分为两大类:
3.1 自己部署服务器
所有软件及服务器自己进行管理提供,可以直接在项目中添加Spring Cloud依赖。推荐
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>{project-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.2 使用阿里云
如果希望使用阿里云服务。则需要导入阿里云对应的依赖。 不推荐
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>aliyun-spring-boot-dependencies</artifactId>
<version>{project-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
4. 核心组件
Spring Cloud Alibaba和 Spring Cloud Netflix 同属于Spring Cloud 下三大阵营产品之一。内部提供了一系列组件。
4.1 Spring Cloud Alibaba Nacos Discovery
Nacos是由阿里巴巴推出的用于构建云本机应用程序的易于使用的动态服务发现,配置和服务管理平台。
Nacos Discovery 是使用Nacos的服务注册与发现功能。在Spring Cloud Alibaba中常使用Nacos作为注册中心。
4.2 Spring Cloud Alibaba Nacos Config
Nacos Config 是利用Nacos作为分布式配置中心使用。
4.3 Spring Cloud Alibaba Sentinel
Sentinel是Spring Cloud Alibaba体系中提供服务限流,断路和负载保护的解决方案。已经成功的在阿里巴巴双十一活动中运行10余年。可靠性非常高。
4.4 Spring Cloud Alibaba Dubbo
Dubbo 是阿里巴巴于2011年对外提供使用的RPC框架。使用他可以实现接口发布和接口调用功能,内部还提供了负载均衡等策略。是国内使用较多的服务调用框架。
从2.7版本开始阿里巴巴把Dubbo贡献给Apache。
Spring Cloud Alibaba Dubbo是基于Dubbo-spring-boot-starter 2.7的封装,可以让Dubbo程序员几乎零成本的学习。