Appearance
第1章 SpringCloud概述 🚀
本章要点
- 传统应用的问题
- 微服务与SpringCloud
- 学习方面的准备工作
1.1 传统的应用 🚀
本章将会简述SpringCloud的功能,描述什么是SpringCloud,它能为我们带来什么,为后面学习该框架的知识打下理论基础。
1.1.1 单体应用 🚀
在此之前,笔者所在公司开发Java程序,大都使用Struts、Spring、Hibernate(MyBatis)等技术框架,每一个项目都会发布一个单体应用。例如开发一个进销存系统,将会开发一个war包部署到Tomcat中,每一次需要开发新的模块或添加新功能时,都会在原来的基础上不断地添加。若干年后,这个war包不断膨胀,程序员在进行调试时,服务器也可能需要启动半天,维护这个系统的效率极为低下。这样一个war包,涵盖了库存、销售、会员、报表等模块,如图1-1所示。
这样的单体应用隐患非常多,任何一个bug都有可能导致整个系统岩机。笔者印象最深的是,曾经有一个客户在高峰期导出一张销售明细报表(数据量较大),最终造成整个系统瘫痪,前台的销售人员无法售卖。维护这样一个系统,不仅效率极低,而且充满风险,项目组的各个成员惶惶不可终日,我们需要本质上的改变。
1.1.2 架构演进 🚀
针对以上所说的单体应用的问题,我们参考SOA架构,将各个模块划分为独立的服务模块(war),并且使用了数据库的读写分离,架构如图1-2所示。
各个模块之间会存在相互调用的依赖关系,例如销售模块会调用会员模块的接口,为了减少各个模块之间的藕合,我们加入了企业服务总线CESB),各模块与ESB之间的架构如图1-3所示。
加入ESB后,各个模块将服务发布到ESB中,它们与ESB之间使用SOAP协议进行通信。图1-2与图1-3所示的架构实现后,整个系统的性能有了明显提升,各个模块的相合度也降低了。运行了一段时间后,又出现了新的问题,由于销售终端数量的增多,销售模块明显超过其承受能力,为了保证销售前端的正常运行,我们使用了Nginx做负载均衡,请见图1-4。
随着销售模块的增多,带来了许多问题。例如管理这些模块,对于运维工程师来说,这是一项艰巨的任务,一旦销售模块有所修改,他们将通宵达旦进行升级。另外,企业服务总钱也有可能成为性能的瓶颈,虽然目前仍未出现该问题,但我们需要未雨绸缪。
1.1.3 架构要求 🚀
从前面的架构演进可知,应用中的每一个点都有可能成为系统的问题点。随着互联网应用的普及,在大数据、高井发的环境下,系统架构需要面对更为严苛的挑战,我们需要一套新的架构,它起码应能满足以下要求。
- 高性能:这是应用程序的基本要求。
- 独立性:其中一个模块出现bug或者其他问题,不可以影响其他模块或者整个应用。
- 容易扩展:应用中的每一个节点都可以根据实际需要进行扩展。
- 便于管理:对于各个模块的资源,可以轻松进行管理、升级,减少维护成本。
- 状态监控与警报:对整个应用程序进行监控,当某一个节点出现问题时,能及时发出警报。
为了能解决遇到的问题、达到以上的架构要求,我们开始研究SpringCloud。
1.2 微服务与SpringCloud 🚀
1.2.1 什么是微服务 🚀
微服务一词来自Martin Fowler的Microservices一文,微服务是一种架构风格,将单体应用划分为小型的服务单元,微服务之间使用Http的API进行资源访问与操作。
在对单体应用的划分上,微服务与前面的SOA架构有点类似,但是SOA架构侧重于将每个单体应用的服务集成到ESB上,而微服务做得更加彻底,强调将整个模块变成服务组件,微服务对模块的划分粒度可能会更细。以我们前面的销售、会员模块为例,在SOA架构中,只需将相应的服务发布到ESB容器就可以了,而在微服务架构中,这两个模块本身,将会变为一个或多个服务组件。SOA架构与微服务架构,请参见图1-5与图1-6。
在微服务的架构上,Martin Fowler的文章肯定了Netflix的贡献,接下来,我们了解一下Netflix OSS。
1.2.2 关于Netflix OSS 🚀
Netflix是一个互联网影片提供商,在几年前,Netflix公司成立了自己的开源中心,名称为Netflix Open Source Software Center,简称Netflix OSS。这个开源组织专注于大数据、云计算方面的技术,提供了多个开源框架,这些框架包括大数据工具、构建工具、基于云平台的服务工具等。Netflix所提供的这些框架,很好地遵循了微服务所推崇的理念,实现了去中心化的服务管理、服务容错等机制。
1.2.3 SpringCloud与Netflix 🚀
SpringCloud并不是一个具体的框架,大家可以把它理解为一个工具箱,它提供的各类工具,可以帮助我们快速构建分布式系统。
SpringCloud的各个项目基于SpringBoot,将Netflix的多个框架进行封装,并且通过自动配置的方式将这些框架绑定到Spring的环境中,从而简化了这些框架的使用。由于SpringBoot的简便,使得我们在使用SpringCloud时,很容易将Netflix各个框架整合进项目中。SpringCloud下的SpringCloudNetflix模块,主要封装了Netflix的以下项目。
- Eureka:基于REST服务的分布式中间件,主要用于服务管理。
- Hystrix:容错框架,通过添加延迟阈值以及容错的逻辑,帮助我们控制分布式系统间组件的交互。
- Feign:一个REST客户端,目的是为了简化WebService客户端的开发。
- Ribbon:负载均衡框架,在微服务集群中为各个客户端的通信提供支持,它主要实现中间层应用程序的负载均衡。
- Zuul:为微服务集群提供代理、过滤、路由等功能。
1.2.4 SpringCloud的主要模块 🚀
除了SpringCloud Netflix模块外,SpringCloud还包括以下几个重要的模块。
- SpringCloudConfig:为分布式系统提供了配置服务器和配置客户端,通过对它们的配置,可以很好地管理集群中的配置文件。
- SpringCloudSleuth:服务跟踪框架,可以与Zipkin、ApacheHTrace和ELK等数据分析、服务跟踪系统进行整合,为服务跟踪、解决问题提供了便利。
- SpringCloudStream:用于构建消息驱动微服务的框架,该框架在SpringBoot的基础上,整合了SpringIntegration来连接消息代理中间件。
- SpringCloudBus:连接RabbitMQ、Kafka等消息代理的集群消息总线。
1.3学习方面的准备工作 🚀
1.3.1下载本书的软件及源码 🚀
读者可以到www.broadview.com.cn的“下载资源”处下载本书各章示例的源代码及涉及的一些软件。
读者也可发邮件与笔者联系,邮箱地址为 yangenxiong@163.com ;也可以直接访问笔者博客直接交流,https://my.oschina.net/JavaLaw
1.3.2导入本书的案例 🚀
在Eclipse中,选择导入己存在的Maven项目,再选择codes下的具体目录即可。由于每个案例都会包含多个Maven项目,因此建议以小节为单位导入。
在导入案例前,请先按照第2章的介绍把开发环境搭建好。
1.4本章小结 🚀
本章的1.1节,对传统的单体应用、SOA架构做了一个简单的总结,在此过程中分析了我们所遇到的问题。
在1.2节,简单介绍了微服务与SpringCloud。
接下来,我们正式开始讲述SpringCloud的知识点。