根本没搞懂!你的项目为何选择SpringCloud?

来自:程序员技术圈


在开始之前我们先介绍一下几个概念,什么是微服务,它的特点是什么? Spring Cloud都做了那些事情?他们之间又有什么联系?

什么是微服务

微服务的概念源于2014年3月Martin Fowler所写的一篇文章“Microservices”。微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力

微服务架构优势

1. 复杂度可控:在将应用分解的同时,规避了原本复杂度无止境的积累。每一个微服务专注于单一功能,并通过定义良好的接口清晰表述服务边界。由于体积小、复杂度低,每个微服务可由一个小规模开发团队完全掌控,易于保持高可维护性和开发效率。

2. 独立部署:由于微服务具备独立的运行进程,所以每个微服务也可以独立部署。当某个微服务发生变更时无需编译、部署整个应用。由微服务组成的应用相当于具备一系列可并行的发布流程,使得发布更加高效,同时降低对生产环境所造成的风险,最终缩短应用交付周期。

3. 技术选型灵活:微服务架构下,技术选型是去中心化的。每个团队可以根据自身服务的需求和行业发展的现状,自由选择最适合的技术栈。由于每个微服务相对简单,故需要对技术栈进行升级时所面临的风险就较低,甚至完全重构一个微服务也是可行的。

4. 容错:当某一组件发生故障时,在单一进程的传统架构下,故障很有可能在进程内扩散,形成应用全局性的不可用。在微服务架构下,故障会被隔离在单个服务中。若设计良好,其他服务可通过重试、平稳退化等机制实现应用层面的容错。

5. 扩展:单块架构应用也可以实现横向扩展,就是将整个应用完整的复制到不同的节点。当应用的不同组件在扩展需求上存在差异时,微服务架构便体现出其灵活性,因为每个服务可以根据实际需求独立进行扩展。

什么是Spring Boot

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是Spring Boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,Spring Boot整合了所有的框架(不知道这样比喻是否合适)。

Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。 Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。Spring Boot的核心思想就是约定大于配置,多数Spring Boot应用只需要很少的Spring配置。采用Spring Boot可以大大的简化你的开发模式,所有你想集成的常用框架,它都有对应的组件支持。

什么是Spring Cloud

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。微服务是可以独立部署、水平扩展、独立访问(或者有独立的数据库)的服务单元,springcloud就是这些微服务的大管家,采用了微服务这种架构之后,项目的数量会非常多,springcloud做为大管家需要管理好这些微服务,自然需要很多小弟来帮忙。
主要的小弟有:

Spring Cloud Config、
Spring Cloud Netflix(Eureka、Hystrix、Zuul、Archaius…
Spring Cloud Bus、
Spring Cloud for Cloud Foundry、
Spring Cloud Cluster、
Spring Cloud Consul、
Spring Cloud Security、
Spring Cloud Sleuth、
Spring Cloud Data Flow、
Spring Cloud Stream、
Spring Cloud Task、
Spring Cloud Zookeeper、
Spring Cloud Connectors、
Spring Cloud Starters、
Spring Cloud CLI

每个小弟身怀独门绝技、武功高强,在这里不做详细解释,具体的可以看我另外一篇文章。

Spring Cloud都做了哪些事

以下为Spring Cloud的核心功能:

  1. 分布式/版本化配置

  2. 服务注册和发现

  3. 路由

  4. 服务和服务之间的调用

  5. 负载均衡

  6. 断路器

  7. 分布式消息传递

我们再来看一张图:


通过这张图,我们来了解一下各组件配置使用运行流程:

  1. 请求统一通过API网关(Zuul)来访问内部服务.

  2. 网关接收到请求后,从注册中心(Eureka)获取可用服务

  3. 由Ribbon进行均衡负载后,分发到后端具体实例

  4. 微服务之间通过Feign进行通信处理业务

  5. Hystrix负责处理服务超时熔断

  6. Turbine监控服务间的调用和熔断相关指标

Spring Cloud体系

介绍上图只是Spring Cloud体系的一部分,Spring Cloud共集成了19个子项目,里面都包含一个或者多个第三方的组件或者框架!

Spring Cloud 工具框架

  1. Spring Cloud Config 配置中心,利用git集中管理程序的配置。

  2. Spring Cloud Netflix 集成众多Netflix的开源软件

  3. Spring Cloud Bus 消息总线,利用分布式消息将服务和服务实例连接在一起,用于在一个集群中传播状态的变化

  4. Spring Cloud for Cloud Foundry 利用Pivotal Cloudfoundry集成你的应用程序

  5. Spring Cloud Cloud Foundry Service Broker 为建立管理云托管服务的服务代理提供了一个起点。

  6. Spring Cloud Cluster 基于Zookeeper, Redis, Hazelcast, Consul实现的领导选举和平民状态模式的抽象和实现。

  7. Spring Cloud Consul 基于Hashicorp Consul实现的服务发现和配置管理。

  8. Spring Cloud Security 在Zuul代理中为OAuth2 rest客户端和认证头转发提供负载均衡

  9. Spring Cloud Sleuth SpringCloud应用的分布式追踪系统,和Zipkin,HTrace,ELK兼容。

  10. Spring Cloud Data Flow 一个云本地程序和操作模型,组成数据微服务在一个结构化的平台上。

  11. Spring Cloud Stream 基于Redis,Rabbit,Kafka实现的消息微服务,简单声明模型用以在Spring Cloud应用中收发消息。

  12. Spring Cloud Stream App Starters 基于Spring Boot为外部系统提供spring的集成

  13. Spring Cloud Task 短生命周期的微服务,为SpringBooot应用简单声明添加功能和非功能特性。

  14. Spring Cloud Task App Starters15、Spring Cloud Zookeeper 服务发现和配置管理基于Apache Zookeeper。

  15. Spring Cloud for Amazon Web Services 快速和亚马逊网络服务集成。

  16. Spring Cloud Connectors 便于PaaS应用在各种平台上连接到后端像数据库和消息经纪服务。

  17. Spring Cloud Starters (项目已经终止并且在Angel.SR2后的版本和其他项目合并)

  18. Spring Cloud CLI 插件用Groovy快速的创建Spring Cloud组件应用。
    当然这个数量还在一直增加…

三者之间的关系

微服务是一种架构的理念,提出了微服务的设计原则,从理论为具体的技术落地提供了指导思想。Spring Boot是一套快速配置脚手架,可以基于Spring Boot快速开发单个微服务;Spring Cloud是一个基于Spring Boot实现的服务治理工具包;Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架。


SpringBoot/Cloud是微服务实践的最佳落地方案。

实战经历
遇到问题,寻找方案

2015年初的时候,因为公司业务的大量发展,我们开始对原有的业务进行拆分,新上的业务线也全部使用独立的项目来开发,项目和项目之间通过http接口进行访问。15年的业务发展非常迅速,项目数量也就相应急剧扩大,到了15底的时候项目达60多个,当项目数达到30几个的时候,其实我们就遇到了问题,经常某个项目因为扩展增加了新的IP地址,我们就需要被动的更新好几个相关的项目。服务越来越多,服务之间的调用关系也越来越复杂,有时候想画一张图来表示项目和项目之间的依赖关系,线条密密麻麻无法看清。

这个时候我们就想找一种方案,可以将我们这么多分布式的服务给管理起来,到网上进行了技术调研。我们发现有两款开源软件比较适合我们,一个是Dubbo,一个是Spring Cloud。

其实刚开始我们是走了一些弯路的。这两款框架我们当时都不熟悉,当时国内使用Spring Cloud进行开发的企业非常的少,我在网上也几乎没找到太多应用的案例。但是Dubbo当时在国内的使用还是挺普遍的,相关的资料各方面都比较完善。因此在公司扩展新业务线众筹平台的时候,技术选型就先定了Dubbo,因为也是全新的业务没有什么负担,这个项目我们大概开发了六个月投产,上线之初也遇到了一些问题,但最终还比较顺利。

在新业务线选型使用Dubbo的同时,我们也没有完全放弃Spring Cloud,我们抽出了一两名开发人员学习Spring Boot我也参与其中,为了验证Spring Boot是否可以到达实战的标准,我们在业余的时间使用Spring Boot开发了一款开源软件云收藏,经过这个项目的实战验证我们对Spring Boot就有了信心。最重要的是大家体会到使用Spring Boot的各种便利之后,就再也不想使用传统的方式来进行开发了。

但是还有一个问题,在选择了Spring Boot进行新业务开发的同时,并没有解决我们上面的那个问题,服务于服务直接调用仍然比较复杂和传统,这时候我们就开始研究Spring Cloud。因为大家在前期对Spring Boot有了足够的了解,因此学习Sprig Cloud就显得顺风顺水了。所以在使用Dubbo半年之后,我们又全面开始拥抱Spring Cloud。

推荐↓↓↓
Java编程
上一篇:一文图解 Java 源码的插入排序算法 下一篇:SpringBoot注解大全