
下图表示了服务架构从单体应用逐渐转变为微服务应用的过程

业务的所有功能实现都打包在一个 war 包或者 jar 包中,这种方式就称为单体架构。
以大家都很熟悉的电商系统为例,电商系统包括:用户管理、商品管理、订单管理、支付管理、库存管理、物流管理等等,项目早期我们会把这些模块都写在一个 web 项目中,然后统一部署到一个 web 服务器中。

这种架构开发简单,部署简单,一个项目就包含了所有的功能,省去了多个项目之间的交互和调用消耗。直接部署在一个服务器即可。
当网站的用户量越来越大,需求也会越来越多,流量也会越来越大,服务可能就会面临以下问题:
可以从两个方面进行优化

以单体结构规模的项目为单位进行垂直划分。也就是将一个大项目拆分成一个个单体结构项目。项目和项目之间相对比较独立,接口多为数据同步功能。
集群和分布式
比如: 一个饭店只有一个厨师,这个厨师负责备菜、洗菜、切菜、炒菜。 随着这个饭店的生意越来越好,这个厨师忙不过来了,饭店又请了一个厨师,新厨师和老厨师做一样的事情,也是备菜、洗菜、切菜、炒菜,所以这两个厨师的关系就是集群。 为了让厨师专心炒菜,饭店又请了一个配菜师,负责备菜、洗菜、切菜,所以厨师和配菜师的关系就是分布式。 后来一个配菜师也忙不过来了,又请了一个配菜师,这两个配菜师的关系就是集群。

集群和分布式区别和联系
从上面可以看出,按照业务进行拆分后,会有一些重复的功能开发,比如订单系统,对于电商平台和支付系统来说都会涉及到。
在分布式架构下,当部署的服务越来越多,重复的代码就会越来越多,服务的调用关系也会越来越复杂。
所以我们可以把一些通用的,会被多个上层服务调用的共享业务,提取成独立的基础服务,组成一个个微小的服务,这就是微服务。

简单来说,微服务就是很小的服务。小到一个服务只对应一个单一的功能,只做一件事。这个服务可以单独部署运行。
微服务之间可以采用
REST和RPC协议进行通信。
从这个角度来看,微服务架构是分布式架构的一种拓展,这种架构模式下它拆分粒度更小,服务更独立。可以理解为:微服务是一种经过良好架构设计的分布式架构方案。
分布式架构 & 微服务架构
分布式架构侧重于压力的分散,强调的是服务的分散化。微服务侧重于能力的分散,更强调服务的专业化和精细分工。从实践的角度来看,微服务架构通常是分布式服务架构,反之则未必成立。所以,选择微服务通常意味着需要解决分布式架构的各种难题。
随着产品的复杂性和流量的增加,技术架构也在不断的发生变化。不论是早期的单体架构,还是现在广泛使用的微服务架构,都是为了更好的服务产品,解决问题。
微服务架构带来好处的同时,也面临着一些挑战,从单体服务转向微服务意味着管理更加复杂。下面从优势和挑战两个方面分析一下微服务架构。
优势:
挑战:
比如企业员工管理: 员工少的时候,一个员工可能各方面的工作都要会,但是员工之间的协同工作会少一点,员工管理也会相对简单。 随着企业的发展,事情越来越多,一个员工的能力有限,就需要招聘更多的人,这时候就涉及到员工的管理了。 员工越多,员工的管理就越复杂,服务也是类似。
那么选择微服务架构的话,以上这些问题都需要我们解决,是自己研发还是选择市场上比较成熟的技术拿来用呢?
全球的互联网公司都在积极尝试自己的微服务落地方案。在 Java 领域,最引人注目的就是 Spring Cloud 了!
Spring Cloud 提供了一些可以让开发人员快速构建分布式服务的工具,比如配置管理、服务发现、熔断、智能路由等,它们可以在任何分布式环境中很好的工作。
简单来说,Spring Cloud 就是分布式微服务架构的一站式解决方案,是微服务架构落地的多种技术的集合。
比如:
Spring Cloud 并不是 Spring 团队研发的框架,它只是把一些比较优秀的解决微服务架构中常见问题的开源框架基于 Spring Cloud 规范进行了整合,并基于 Spring Boot 的风格,对这些组件进行封装,屏蔽掉了复杂的配置和实现原理,为开发者提供了开箱即用的微服务开发体验。
这些开源技术的框架是由各个公司来维护的。Spring Cloud 就是这些微服务的大管家。
Spring Cloud 是一个由很多子项目组成的庞大项目,这些子项目由各个公司来维护的,所以发布阶段也是不同的。
为了管理主项目和子项目的依赖关系,以及为了避免和子项目版本的冲突,主项目版本命名并没有采用和子项目数字版本化的形式,而是采用了英文名称。
这个英文版本名称也比较有趣,Spring Cloud 采用了英国伦敦地铁站的名称来命名,并由地铁站名称字母 A-Z 依次类推的形式来发布迭代版本。
但英文版本号太复杂了,从 Hoxton 版本之后,Spring Cloud 的版本就变成了 2020.0.0 这样的日期版本号了
Spring Cloud 与 Spring Boot 的关系
Spring Cloud 中的所有子项目都依赖 Spring Boot,所以 Spring Boot 和 Spring Cloud 的版本之间也存在一定的对应关系:

如果一个 Spring Boot 项目,希望在这个项目中添加 Spring Cloud 的一些组件,那么就需要根据当前项目的 Spring Boot 版本,选择 Spring Cloud 的版本。
在 Spring Cloud 的规范下,有很多实现,其中最为出名的是:
Spring Cloud Netflix 是 Netflix OSS(Netflix Open Source Software)在 Spring Cloud 规范下的实现。
包含的组件及其主要功能大致如下:
在很长的一段时间里,Spring Cloud 一度被泛指 Spring Cloud Netflix。Spring Cloud 一直以来把 Netflix OSS 套件作为其官方默认的一站式解决方案。然而,Netflix 公司在 2018 年前后宣布其核心组件 Hystrix、Ribbon、Zuul 等均进入维护状态,Spring Cloud 也被迫宣布删除这些维护模块。
spring-cloud-netflix 并没有从 Spring Cloud 的依赖中完全删除,只是从 2020.0 版本起,他只管理 Eureka。
Spring Cloud Netflix 在很多公司都有大规模使用,一旦停止更新,短期看影响不大,但长期显然是不合适的,所以 Spring Cloud 官方也提供了一些替换建议,如下所示:
Netflix | 推荐替代品 | 说明 |
|---|---|---|
Hystrix | Resilience4j | Hystrix 也推荐大家使用 Resilience4j 代替自己 |
Hystrix Dashboard/Turbine | Micrometer+Monitoring System | 说白了,监控这件事交给更专业的组件去做 |
Ribbon | Spring Cloud Loadbalancer | 忍不住了,Spring 终究亲自出手 |
Zuul1 | Spring Cloud Gateway | 忍不住了,Spring 终究亲自出手 |
Archaius1 | Spring Boot 外部化配置+Spring Cloud 配置 | 比 Netflix 实现的更好、更强大 |
Spring Cloud Alibaba 是阿里巴巴集团下的开源组件和云产品在 Spring Cloud 规范下的实现。
虽然 Spring Cloud Alibaba 目前并不是 Spring Cloud 官方推荐的默认方案,但是 Spring Cloud Alibaba 是阿里中间件团队主导的一个新生项目,正处于高速迭代中。甚至在 Alibaba 的开源组件还没有织入 Spring Cloud 生态之前,就已经在各大公司广泛使用了。
官方网站:Spring Cloud Alibaba 是什么 | Spring Cloud Alibaba
如果说 Spring Cloud Netflix 是 Spring Cloud 的第一代实现,那么 Spring Cloud Alibaba 也可以看做是 Spring Cloud 的第二代实现,主要由 Nacos、Sentinel、Seata 等组件组成。

Spring Cloud Alibaba 吸收了 Spring Cloud Netflix 微服务框架的核心架构思想,并进行了高性能改进。自 Spring Cloud Netflix 进入停更维护后,Spring Cloud Alibaba 逐渐代替它成为主流的微服务框架。
Spring Cloud 实现对比:
Spring Cloud 官方 | Spring Cloud Netflix | Spring Cloud Alibaba | |
|---|---|---|---|
服务注册/发现 | Eureka | Eureka | Nacos |
服务调用 | OpenFeign | Feign | Dubbo |
配置中心 | Spring Cloud Config | Archaius | Nacos |
服务网关 | Spring Cloud Gateway | Zuul | Spring Cloud Gateway |
负载均衡 | Spring Cloud LoadBalance | Ribbon | Dubbo |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。