微服务架构
目前,微服务是非常火的架构或者说概念,也是在构建大型互联网项目时常采用的架构方式。
单体架构
单体架构,是指将开发好的项目打成war包,然后发布到tomcat等容器中的应用。
单体架构所存在的问题
- 复杂性高
整个项目包含的模块非常多、模块的边界模糊、依赖关系不清晰、代码质量参差不齐、混乱地堆砌在一起使得整个项目非常复杂。每次修改代码都心惊胆战,甚至添加一个简单的功能,或者修改一个Bug都会带来隐含的缺陷。
- 技术债务
随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且越积越多。“不坏不修”,这在软件开发中非常常见,在单体应用中这种思想更甚。已经使用的系统设计或代码难以被修改,因为应用程序中的其他模块可能会以意料之外的方式使用它。
- 部署频率低
随着代码的增多,构建和部署的时间也会增加。而在单体应用中,每次功能的变更或缺陷的修复都会导致需要重新部署整个应用。全部部署的方式耗时长、影响范围大、风险高,这使得单体应用项目上线部署的频率较低。而部署频率低又导致两次发布之间会有大量的功能变更和缺陷修复,出错概率比较高。
- 可靠性差
某个应用Bug,例如死循环、OOM等,可能会导致整个应用的崩溃。
- 扩展能力受限
单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩。例如,应用中有的模块是计算密集型的,它需要强劲的CPU;有的模块则是IO密集型的,需要更大的内存。由于这些模块部署在一起,不得不在硬件的选择上作出妥协。
- 阻碍技术创新
单体应用往往使用统一的技术凭条或方案解决所有问题,团队中的每个成员都必须使用相同的开发语言和框架,想要引入新框架或新技术平台会非常困难。
而上面这些问题的解决办法就是使用微服务架构。
什么是微服务
就目前来看,微服务本身并没有一个严格的定义,每个人对微服务的理解都不同。MartinFowler在他的博客中是这样描述微服务的。
微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。
微服务架构特征
- 每个服务可以运行在自己的进程里。
- 一系列独立运行的微服务共同构建起整个系统。
- 每个服务为独立的业务开发,一个微服务只关注某个特定功能,例如订单管理、用户管理等。
- 微服务之间通过一些轻量级的通信机制进行通信,例如通过RESTFul API进行调用。
- 可以使用不同的语言与数据存储技术。
- 全自动的部署机制。
SpringCloud简介
Spring Cloud是一个基于Spring Boot实现的微服务架构开发工具。它为微服务架构中涉及的配置管理、服务管理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。
SpringCloud
SpringCloud本身并不是一个项目,而是由众多的子项目组成的,可以说非常多。
- spring-cloud-config
SpringCloud微服务配置管理工具,支持使用git、svn等存储配置文件,并在支持客户端配置信息的刷新,加密解密配置内容等。
- spring-cloud-netflix
SpringCloud微服务核心组件,对多个NetFlix OSS开源套件进行整合。
版本说明
大多数Spring项目都是以主版本号.次版本号.增量版本号.里程版本号
的形式命名版本号的,例如Spring Framework稳定版本4.3.5.RELEASE
、里程版本5.0.0.M4
等。其中,主版本号表示项目的重大重构;次版本号表示新特性的添加和变化;增量版本号一般表示Bug修复;里程碑版本号表示某版本号的里程碑。
然而,Spring Cloud并未使用这种方式管理版本。下面来详细探讨一下Spring Cloud的版本。
Spring Cloud中有些版本的名字采用伦敦地铁站的名字,根据字母表的顺序来对应版本时间顺序,比如最早的Release版本为Angel
,第二个Release版本为Brixton
…。
经过上面的解释,不难猜出,之前所提到的Angel.SR6
、Brixton.SR5
中的SR6
、SR5
就是版本号了。
当一个版本的Spring Cloud项目发布内容积累到临界点或者一个严重bug解决可用后,就会发布一个Service Releases
版本,简称SRX版本,其中X是一个递增的数字,所以Brixton.SR5
就是Brixton的第5个Release版本。
Spring Cloud框架特点
- 约定优于配置。
- 适用于各种环境。开发、部署在PC Server或各种云环境(如阿里云、AWS等)均可。
- 隐藏了组件的复杂性,并提供声明式、无xml的配置方式。
- 开箱即用,快速启动。
- 轻量级的组件。Spring Cloud整合的组件大多比较轻量。例如Eureka、Zuul,等等。都是各自领域轻量级的实现。
- 组件丰富,功能齐全。Spring Cloud为微服务架构提供了非常完整的支持。例如,配置管理、服务发现、断路器、微服务网管等。
- 选型中立、丰富。例如,Spring Cloud支持使用Eureka、ZooKeeper或Consul实现服务发现。
- 灵活。Spring Cloud的组成部分是解耦的,开发人员可按需灵活挑选技术选型。