互联网早期,一般的网站应用流量较小,只需一个应用,将所有功能代码都部署在一起就可以,这样可以减少开发、部署和维护的成本。比如说一个电商系统,里面会包含很多用户管理、商品管理、订单管理、物流管理等等很多模块,我们会把它们做成一个web项目,然后部署到一台tomcat服务器上。对于项目初期用户量不大的情况,这样的架构足以支撑业务的正常运行。
优点:
缺点:
随着用户量越来越大,网站的访问量不断增大,导致后端服务器的负载越来越高。用户量大了,产品需要满足不同用户的需求来留住用户,使得业务场景越来越多并且越来越复杂。
可以从两个方面进行优化:
优点:
缺点:
SOA(Service-Oriented Architecture),也就是面向服务的架构。在SOA中,会采用ESB(企业服务总线)来作为系统和服务之间的通信桥梁,ESB本身还提供服务地址的管理、不同系统之间的协议转化和数据格式转化等。调用端不需要关心目标服务的位置,从而使得服务之间的交互是动态的,这样做的好处是实现了服务的调用者和服务的提供者之间的高度解耦。
总的来说,SOA主要解决的问题是:
优点:
缺点:
微服务架构在某种程度上是面向服务的架构SOA继续发展的下一步,它更加强调服务的"彻底拆分"。面向服务(SOA)和微服务本质上都是服务化思想的一种体现。如果SOA是面向服务开发思想的雏形,那么微服务就是针对可重用业务服务的更进一步优化,我们可以把SOA看成微服务的超集,也就是多个微服务可以组成一个SOA服务。伴随着服务粒度的细化,会导致原本10个服务可能拆分成了100个微服务,一旦服务规模扩大就意味着服务的构建、发布、运维的复杂度也会成倍增加,所以实施微服务的前提是软件交付链路及基础设施的成熟化。
由于SOA和微服务两者的关注点不一样,造成了这两者有非常大的区别:
微服务架构就是将每个具体的业务服务构成可独立运行的微服务,每个微服务只关注某个特定的功能,服务之间采用轻量级通信机制REST API进行通信。
优点:
缺点:
微服务架构不是银弹,它并不能解决所有的架构问题。在拥抱微服务架构的过程中,我们经常会遇到数据库的拆分、API交互、大量的微服务开发和维护、运维等问题。即便成功实现了微服务的主体,也还是会面临下面这样一些挑战。
微服务架构主要的目的是实现业务服务的解耦。随着公司业务的高速发展,微服务组件会越来越多,导致服务与服务之间的调用关系越来越复杂。同时,服务与服务之间的远程通信也会因为网络通信问题的存在变得更加复杂,比如需要考虑重试、容错、降级等情况。那么这个时候就需要进行服务治理,将服务之间的依赖转化为服务对服务中心的依赖。除此之外,还需要考虑:
这些都需要对应的技术来实现,我们是自己研发还是选择市场上比较成熟的技术拿来就用呢?如果市场上有多种相同的解决方案,应该如何做好技术选型?
业内比较主流的微服务解决方案进行分析,主要包括:
Spring Cloud提供了一些可以让开发者快速构建微服务应用的工具,比如配置管理、服务发现、熔断、智能路由等,这些服务可以在任何分布式环境下很好地工作。Spring Cloud主要致力于解决如下问题:
需要注意的是,Spring Cloud并不是Spring团队全新研发的框架,它只是把一些比较优秀的解决微服务架构中常见问题的开源框架基于Spring Cloud规范进行了整合,通过Spring Boot这个框架进行再次封装后屏蔽掉了复杂的配置,给开发者提供良好的开箱即用的微服务开发体验。不难看出,Spring Cloud其实就是一套规范,而Spring Cloud Netflix、Spring Cloud Alibaba才是Spring Cloud规范的实现。
功能 | Spring Cloud 官方 | Spring Cloud Alibaba | Spring Cloud Netflix | 其他 |
---|---|---|---|---|
概述 | 已闭源,不推荐 | |||
注册中心 | - | Nacos Discovery | Eureka | ZooKeeper Consul ApiServer-k8s |
配置中心 | Config | Nacos Config | Archaius | Apollo-携程 ZooKeeper Consul ConfigMap-k8s |
网关路由 | Gateway | Doubbo Servlet | Zuul | Nginx Dubbo PROXY |
rpc 调用 | OpenFeign RestTempate | Dubbo RPC | Feign | gRPC、RestTemplate、thrift-脸书 |
熔断降级 | - | Sentinel | Hystrix | |
客户端负载均衡 | - | Dubbo LB | Ribbon | |
链路跟踪 | - | - | - | SkyWalking-吴晟 Zipkin-推特 |
分布式消息 | RabbitMQ | RocketMQ | - | Consul Binder |
分布式事务 | - | Seata | - | |
Sidecar | Spring Cloud Netflix Sidecar | Spring Cloud Alibaba Sidecar | - |
Alibaba的开源组件在服务治理上和处理高并发的能力上有天然的优势,毕竟这些组件都经历过数次双11的考验,也在各大互联网公司大规模应用过。所以,相比Spring Cloud Netflix来说,Spring Cloud Alibaba在服务治理这块的能力更适合于国内的技术场景,同时,Spring Cloud Alibaba在功能上不仅完全覆盖了Spring Cloud Netflix原生特性,而且还提供了更加稳定和成熟的实现。
参考地址:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
选择版本为:Spring Cloud Alibaba 2022.0.0.0。
组件版本关系:
构建Maven项目的父pom:
<parent>
<!-- SpringBoot版本 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<!-- jdk版本为17 -->
<java.version>17</java.version>
<spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
<spring-cloud.version>2022.0.0</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>