Spring Cloud实战
上QQ阅读APP看书,第一时间看更新

1.1 Spring Boot、Spring Cloud与微服务架构

和传统的Spring MVC框架相比,通过使用基于Spring Boot的开发模式,我们可以简化搭建框架时配置文件的数量,从而提升系统的可维护性。而且在Spring Boot框架里,我们还能更方便地引入Spring Cloud的诸如安全和负载均衡方面的组件。可以这样说,Spring Boot架构是微服务的基础,在这个架构里,我们可以引入Spring Cloud的诸多组件,从而搭建基于微服务的系统。

搞明白这3个相关概念的关系后,我们能知道在微服务方面“该学什么”以及“该怎么学”,否则大家可能无法把微服务的知识点有效地整合成知识体系。

1.1.1 通过和传统架构的对比了解微服务的优势

从图1.1中,我们能看到一个传统的在线购物网站的基本架构。

图1.1 传统在线购物网站的基本架构

用户在前端页面上的操作,会被转化成一个个发向后端各模块的请求,当对应的模块处理请求时会和数据库交互。比如用户在前端页面输入关键字搜索商品,这个请求会被定位到“产品服务”模块里,该模块会和数据库交互,找到合适的商品结果后返回。

在实际项目里,为了应付高并发的访问请求(大家可以想象一下双十一的场景),往往会做分布式部署,如图1.2所示。在这种框架里,从前端页面里发到后端的大量请求会被负载均衡服务器(比如Nginx或Ribbon)分发到不同的服务器处理,而在每个服务器里,都会有一套如图1.1所示的服务模块。如果再有必要,还可以把数据库做成集群,用多台数据库服务器分担高并发的压力。

图1.2 基于分布式的在线购物网站的架构

从实际效果上来看,如果采用图1.2的分布式架构,用多台业务处理服务器和数据库服务器,确实能满足高并发的需求。不过根据实践经验,上述架构一般会存在如下问题。


· 第一,各功能模块之间的调用关系会比较复杂,用专业的话来说就是耦合度比较高,一个模块的修改往往会影响到其他多个模块,也就是说代码比较难维护。

· 第二,由于在具体的每台机器上是集中式部署,因此稳定性不强,往往一个问题会导致整个系统崩溃。即使采用基于分布式的主从冗余等措施,这个问题也无法得到根本解决。

· 第三,可扩展性不强。假设当前的并发量是每秒100次请求,目前用2台服务器即可,当业务量上升后,每秒的并发量上升到1000次后,就需要再扩展服务器了,这时很不便利。


和上述架构相比,微服务(Microservice)的体系结构如图1.3所示。

图1.3 微服务架构

从图1.3我们能看到,微服务模块之间一般会通过Restful格式的请求通信,换句话说,模块间的耦合度比较低,这样就很便于在任何模块里变更业务需求。

而且,每个模块都具有自己的数据库,也就是说,每个模块都能独立运行,整个系统的扩展性比较强,比如能用比较小的代价来扩展新的功能模块。

1.1.2 Spring Boot、Spring Cloud和微服务三者的关系

微服务是体系架构,或者说是模块的组织形式,说得再通俗点,如果我们用“微服务架构”的方式组装业务模块,那么整个系统就能具有如上文所述的“高扩展性”和“模块间低耦合度”的特性。

注意,微服务是一个抽象的概念,它有不同的实现方式,而基于Spring Boot的Spring Cloud是当前比较流行的一种实现微服务的方式。

由于Spring具备IOC的特性,因此通过Spring开发出来的模块,它们之间的耦合度非常低,这同微服务的要求非常相似。在之前Spring版本的基础上,Pivotal团队提供了一套全新的Spring Boot框架。

在这套框架里,开发者可以嵌入Web服务器,比如Tomcat,无须像之前那样把项目文件打包(假设打包成War文件)并部署到Web服务器上,而且Spring Boot还具备自动配置的功能,更为便利的是,通过定义配置文件,开发者还能“自动监控健康”基于Spring Boot框架模块的各项运行时的性能指标。总之,大家可以这样理解,Spring Boot是之前Spring框架的升级版,通过之后基于代码的叙述,我们更能详细地体会到Spring Boot框架的优势。

我们可以通过Spring Boot在单台机器上搭建实现业务功能的模块,但事实上实现高并发的网站项目一般有“负载均衡”“路由代理”“消息服务”和“流量过高断路”等需求,而这些需求能很好地通过Spring Cloud这套框架提供的组件得到解决。

讲完三者的含义后,我们就能清晰地理顺这三者的关系了。


· 第一,微服务架构能给项目带来便于扩展和维护的优势,从而能给公司带来实惠,这也是微服务比较热门的原因。(有好处了别人才会用。)

· 第二,通过Spring Boot能开发微服务“单机版”的功能模块。即使是单机版的,由于在其中能嵌入Web服务器(当然还有其他升级点),因此和传统的Spring架构相比,也能给开发人员带来实际的便利。

· 第三,通过基于Spring Cloud框架的实现“负载均衡”等功能的组件,我们能有效地把各“单机版”的功能模块整合到一起组成架构。在这套架构里,我们不仅能得到微服务架构所带来的好处,由于引入了Spring Cloud组件,因此我们更能满足“高并发访问量”的需求。

1.1.3 基于Netflix OSS的Spring Cloud的常用组件

提到Spring Cloud,我们就不得不先提一下Netflix。这家公司组织成立了一个开源社区,名为Netflix Open Source Software Center(Netflix OSS)。经过很多大神级别的开发者共同努力,这个社区推出了架构,Spring Cloud就是其中之一。

大家也可以这样理解,Spring Cloud是各种支持分布式微服务的组件的集合,通过配套使用其中的各项组件,开发者能以“微服务”的方式构建基于分布式部署的系统。在表1.1里,我们能看到Spring Cloud中的常用组件。

表1.1 Spring Cloud常用组件归纳表

表1.1讲述的一些组件,比如Ribbon或Hystrix不只是能被用在微服务领域,在其他的高并发场景下也能用到。由此我们能体会到,上述组件构成了能搭建基于Spring Cloud微服务的全家桶,开发者能根据实际需求选用其中的一个或多个组件。