SpringCloud Alibaba-1-系统架构演变与介绍
1. 传统单体应用架构
程序在编写完成之后会被打包并部署为一个具体的应用。Java Web项目打包成WAR包,Java项目打包成JAR包。
1.1 集群
随着用户人数的增加,一台机器可能满足不了系统的负载,此时我们就会考虑水平扩展。
什么是水平扩展:面对上述情况,我们通常会增加服务器的数量,并将打包好的应用拷贝到不同服务器,然后通过负载均衡器实现应用的水平扩展。
负载均衡器:这里指的是Nginx。Ngix是一个服务器端负载均衡,发生在服务提供者一方。请求到达服务器时,负载均衡器会根据预先设定的算法将请求分配到不同的服务器上,以达到均衡负载的目的。
缺点
// 1. 应用维护困难 随着时间推移项目逐渐变大,一旦项目变得复杂,就很难进行二次开发与维护。
// 2. 可靠性低 因为所有模块都运行在一个进程中,任何一个模块出现问题,都会导致整个进程崩溃,进而影响到整个应用。
// 3. 不能针对某个模块进行水平扩展 比如只是某个模块访问量大,不能只针对该模块进行扩展。
// 3. 不利于技术更新 如果需要更改其中某个技术栈,可能需要将整个应用重新开发。
分布式架构
分布式架构:将项目中拆分成几个系统,抽取各个系统的公共代码作为服务,每个系统直接去调用所需的服务。
优点
// 1. 解决了单体架构的 不能针对某个模块进行水平扩展的问题
缺点
// 1. 调用关系负责,维护困难。
2. SOA架构
针对分布式架构的缺点问题(服务多了,调用维护困难),企业开始通过SOA【面向服务的架构】来解决。
SOA:(SOA Service Oriented Architecture,面向服务的架构) 在分布式的基础上,提供了一个服务治理中心。
优点
// 1. 使用注册中心解决了服务间调用关系的自动调节,解决了服务调用复杂的问题。
3. 微服务架构
微服务架构:是一种架构风格和架构思想。
它倡导我们在传统单体架构的基础上,将系统按照功能拆分为更加细粒度的服务。与SOA架构很像,但它更加强调服务的"彻底拆分"。
所拆分的每一个服务都是一个独立的应用,单独部署。 这些应用对外提供API,可以独立承担对外服务的职责。
围绕着这一思想的一系列体系结构【开发,测试,部署等等】,我们就可以称它为“微服务架构”。
优点
// 1. 每个微服务可以独立部署 当某个微服务发生变更时,不需要重新部署整个项目。
// 2. 技术选型灵活 各个微服务的技术选型可以不一样,当需要对某个微服务技术做改变升级时,不需要面临对整个项目的重新开发。只需对相应的微服务做处理。
// 3. 复杂度可控 每个微服务专注单个功能,体积小,复杂度低,便于维护。
// 4. 易于容错 当某个服务发生故障时,在设计良好的情况下,其他服务一般不会被影响。
// 5. 易于扩展 单个服务可以水平扩展,比如:订单服务访问高,我可以对其多部署几个服务。
面临的问题
4. 微服务的拆分建议
- 通过业务功能分解并定义与业务功能相对应的服务。将具有相似业务功能的服务划分到同一个服务中。
- 按照动词或用例分解,并定义负责特定操作的服务。例如:一个负责完成订单的航运服务。
- 通过定义一个对给定实体或资源的所有操作负责的服务。例如:一个负责管理用户账户的账户服务。
- 要确保每个服务只负责一个业务功能,以便更容易维护和扩展。
- 服务之间需要尽可能松耦合,即服务之间不应该相互依赖或直接调用对方的内部实现。
- 可以将经常使用的组件或库抽象为独立的服务,提供给其他服务使用,以提高代码复用性和减少重复开发。
微服务架构的设计和实现具有一定的复杂性和挑战,需要深入理解架构原理和技术栈,并结合实际业务需求进行合理的划分和设计。
5. 微服务架构的常见解决方案
- ServiceComb 前身是华为云的微服务引擎云服务,是全球首个Apache微服务顶级项目。致力于帮助企业、用户和开发者将企业应用轻松微服务化上云。
- SpringCloud
- SpringCloud Alibaba
6. 微服务架构的组件
前言:开发微服务架构的项目,我们一般采用如下组件。
// 1. 微服务 开发微服务中的一个个服务 springboot
// 2. 服务注册与发现 服务提供方将自己的调用地址注册到服务注册,用于让服务调用方能够方便快速地调用自己 eureka zookeeper nacos consul nacos
// 3. 负载均衡 服务提供方以多实例的形式提供服务,使用负载均衡能让服务调用方连接到合适的服务节点。 ribbon
// 4. 服务容错 通过一系列保护机制,保证服务调用者在调用到异常服务时能快速返回结果,免得长时间等待。 hystrix sentinal
// 5. 服务网关 服务调用的唯一入口,一般用来实现用户鉴权,动态路由,负载均衡,限流等功能。 zuul gateway
// 6. 配置中心 将本地的配置信息注册到配置中心统一管理。 springcloud config nacos
// 7. 链路追踪 可以记录每个服务的调用情况,并将调用链路可视化,方便排查故障。 Zipkin SkyWalking
// 8. 消息传递 微服务架构中的服务之间需要相互通信,通常使用消息传递组件进行 异步 通信。 Kafka RabbitMQ ActiveMQ
// 9. 日志收集 用于收集和分析微服务产生的日志信息,以快速定位和解决问题。 ELK(Elasticsearch、Logstash、Kibana 三个组件组成)
// 10. 分布式事务 解决分布式场景下的事务问题。 seata rabbitMQ
7. 单体,集群,SOA,分布式,微服务的关系
单体:将一个应用程序作为单个整体来构建和部署的项目。
它简单易懂、易于开发和维护。但随着应用程序的复杂性不断增加,单体项目会变得越来越难以扩展和维护。
集群:将整个应用部署在多个服务器,然后通过nginx做负载均衡。解决单体的单点或解决单机的性能瓶颈问题
。
分布式:将一个应用程序拆分成多个独立的部分(mysql,redis,各个独立的模块功能等,部署在不同的服务器,他们通过远程连接进行调用)
,每个部分分布在不同的计算机上,也就是多个计算机组合在一起,每个计算机干不一样的事。
SOA:在分布式的基础上,增加一个服务治理中心,以达到帮我们维护各种服务之间的调用关系。
微服务:将一个应用程序拆分成多个独立的部分,每个部分分布在不同的计算机上,也就是多个计算机组合在一起,每个计算机干不一样的事。
与分布式不同的是:微服务的主要区别在于拆分粒度。微服务是更细力度的拆分。
8. SpringBoot与SpringCloud的区别
SpringBoot用于创建一个个服务。
SpringCloud是在SpringBoot的基础上构建的,它不是一个具体的技术,而是一个简化分布式系统构建的工具集。
Spring Cloud中包含多个子项目,如:Spring Cloud Netflix,Spring Cloud Config,Spring Cloud Starters等。
9. SpringCloud与Dubbo区别
Spring Cloud:本身也是基于SpringBoot开发而来,SpringCloud是一系列框架的有序集合,就是把非常流行的微服务的技术整合到一起。
dubbo:本身只是众多分布式开发中解决问题的一种方式,它主要是做服务调用,而spring cloud 是一系列框架的有序集合。
10. Spring Cloud for Alibaba
SpringCloud for alibaba官网:https://spring.io/projects/spring-cloud-alibaba
spring cloud中的几乎所有的组件都使用Netflix公司的产品【eureka,hystrix,rabbin,zuul,config...】,
然后在其基础上做了一层封装【比如推出openFeign(对feign进行了一个升级),推出了gateWay来替换zuul】,还增加了几个没什么大作用的组件,然后就推出来了。
然而Netflix公司的18年12月12日宣布的服务旗下产品进行维护,`组件Eureka,Hystrix等 已经停止更新,而其他的众多组件预计会在明年(即2020年)停止维护。如此一来,SpringCloud就要凉凉了。
所以开发者们急需其他的一些替代产品,此时spring cloud alibaba就来了,它是由阿里巴巴提供的。
Spring Cloud 这时就急了鸭,他就想与spring cloud alibaba达成合作,将Spring cloud alibaba整合到sping cloud,将其作为Spring Cloud 下的子项目。
阿里也想挂上Spring Cloud这个老大哥这个名,毕竟它已经很出名了,拥有庞大的用户群体和开发者社区。
一方面可以充分利用Spring Cloud的成熟技术和强大生态系统,另一方面也是因为它能够为Spring Cloud用户提供更加全面和完善的解决方案,满足用户在微服务治理方面的更多需求。
整合之后,依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
说说Spring Cloud Alibaba的版本号
SpringCloud的版本号是英文方式。因为springcloud是微服务的解决方案,他会有很多子项目,每个子项目都维护这自己的版本号,为了避免冲突,就使用了伦敦地铁站的名字作为版本号。以首字母作为顺序,a,b,c,d....排列。
Spring Cloud Alibaba实在SpringCloud的基础上开发的, 但是在使用Springcloud for alibaba的时候,不止要添加alibaba 的依赖,还需要添加springcloud的依赖,因为Spring Cloud Alibaba 的组件大多数都是基于 Spring Cloud 技术栈进行开发的。