本文作者:黄小斜
转载请务必在文章开头注明出处和作者。
上期我们讲了spring和springmvc两个框架的基础知识和学习路线,而这期内容,我们将围绕着spring全家桶展开来讨论。
大家应该都知道,按照出现的顺序,spring全家桶大概包含了spring、springmvc、springboot以及springcloud,从开胃小菜spring到满汉全席springcloud,spring全家桶可谓Java工程师的必备大餐,那么,我们不妨先来看看,spring全家桶是如何从光杆司令spring发展到如今的庞大家族的。
目前,Spring生态中包含22个主要活跃的项目。
你会发现,这些项目几乎涵盖了日常开发所有的场景,只不过你不一定会用到而已,除了spring和springmvc,springcloud和springboot之外,还有很多开源的spring生态项目持续在spring社区维护,比如springdata,用于解决spring中的统一数据方案,spring integration,顾名思义,适用于集成外部服务。
还有我们在一些项目中可能用到的spring security,通常用来解决一些安全问题,这个框架在业界用的也比较多。
除此之外,spring AMQP以及spring Kafka则是在spring框架中集成了对应的消息中间件,让消息收发在框架中更容易地被使用。
在整个Spring生态中包含了许多应用在特定场景的具体框架,如:“Spring Framework”,“Spring Security”,“Spring Boot”,“Spring Cloud”等等,其中“Spring Framework”框架是整个生态的核心基础,其他框架都需要依赖“Spring Framework”提供的基础功能,而且每个框架都有自己独立的代码仓库。
想起我第一次上手做Java项目的时候,就是在网上寻找教程,那个时候就已经看到了很多spring框架应用的项目,基本上网上入门的项目都是基于的SpringMVC,可能是ssm或者ssh。
总之,教程里会叫你写一个controller,返回简单的“hello world”,复杂点的,可能要接入数据库,使用一下mybatis,当然了,很多时候网上都能找到源码,你只要下载下来run一遍就好了,当然,前提是你已经安装好了JDK,并你会使用maven和ide,否则下载下来了你可能run不起来,各种报错。虽然这些问题对于老司机来说是不存在的,但是相信我,这对于小白来说是经常遇到的问题。
我最早写博客的时候,就是在上手做一个简单的ssm项目,当时笨手笨脚地配置好了各种东西,好不容易把整个工程跑了起来,于是高兴地记录起了实战过程,后来时间一久,再回去看当初的那几篇博客,觉得自己真是菜的抠脚。
但是这都是新手程序员需要经历的,你需要想搞懂Java基础,再去搞懂Java Web,要完全了解了Java Web,你就必须要会spring,会了spring之后,请把它相关的组件也都搞懂,特别是那些你在工作中可能要用到的。
如今我在阿里做Java,每天用的技术都是自研的中间件,这些中间件技术其实很多也是吸取了开源技术的精髓,你可以经常在它们的源代码中看到spring的影子,这就是spring生态系统强大的影响力,即使是国内一流的Java技术团队,都会花大量时间去研究和学习spring框架源码。
做Java开发的人一提起Spring,首先在脑海中浮现出的就是“IoC”,“AOP”,“Spring MVC”,“Spring Security”等等这些名词,甚至大有“无Spring不Java”的感慨。
实际上,时至今日Spring已不再是一个简单的编程框架了,从最初的“SSH框架”发展到今天,Struts和Hibernate都几乎快要从程序员视野中消失了,而Spring却发展成了一个非常庞大且完整的生态。
所以说,除非特别指明是Spring生态中的某个具体框架,否则提起“Spring”应该指的是整个Spring生态。
说句不夸张的话,Java程序员只要精通了Spring,也就掌握了Java开发的精髓。
上一期内容中我们已经介绍了spring和springmvc,这里为了内容的完整性,请允许我再赘述一遍。
Spring Framework项目是整个Spring生态的基础,包含了Spring最核心的功能,如:IoC,AOP,Spring MVC等,其他项目都需要依赖Spring Framework。
另外,还需要注意的是Spring Framework项目又包含多个子模块,如:spring-core,spring-beans,spring-context,spring-aop,spring-web,spring-webmvc等等。实际上,Spring Framework项目是一个模块化的架构,各模块之间又存在依赖关系。我们在Java Web后台项目中使用得最多的Spring MVC实际上就是模块spring-webmvc,它与其他模块的依赖关系如下所示:
显然,spring-webmvc模块依赖spring-context,spring-aop和spring-web。
spring-webmvc模块的依赖关系
我第一次是接触springboot的时候,还是在某度实习的时候,当时我们做的是私有云,使用的正是开源项目OpenStack,OpenStack本身包含很多组件,有的负责网络,有的负责存储,有的负责调度等等,所有它的整体部署方式就是分布式的,因此做微服务拆分也是很正常的。
当然,那个时候我对微服务还没有什么概念,对springboot也只有一面之缘,只知道当时我师傅告诉我说,springboot是用来作微服务的,让我看看某个springboot项目的代码,于是我一愣一愣地就去看了,结果发现,这个东西和spring好像长得也没啥区别啊,除了启动方式奇怪了点,xml配置文件少了点,好像也没啥太大的不同。
实际上,也确实如此,Spring Boot是一个开发基于Spring的脚手架项目,它简化了很多spring的和springmvc的特性,让新手更加容易地上手spring开发。
比如,它默认集成了嵌入式Tomcat,配置注解化,支持快速集成第三方开发组件(如MyBatis),大大降低了使用Spring的门槛,而且内置了许多可以直接用于生产环境的功能。
简单来看,springboot就是在springmvc外又包了一层,屏蔽了springmvc一些复杂的实现细节,以及繁琐的配置及开发流程,转而把一些约定俗成的东西做成规范,形成了所谓的springboot starter。
这种支持快速开发、快速继承的框架,显然是非常提升开发效率的,所以,它是目前用于开发微服务架构项目的不二选择。
不过这里要强调一点,springboot并不等同于微服务,它充其量只是一个应用容器而已,如果把微服务比作一张大网,那么springboot应用只是这张网中的一个个小点,而微服务还需要通过服务网关、负载均衡、注册中心等手段把这些点连接起来,并且在这张网的运行中支持服务的降级和熔断(切断到某个点的连接
值得注意的是: 许多人刚接触Spring Boot的人把它神话了,固然使用Spring Boot能快速开发一个健壮的、可直接运行的项目,但是它的核心和基础来源于Spring Framework。
对于重度依赖Spring的开发人员,应该先去吃透Spring Framework,只要真正掌握了Spring Framework中各个模块的实现原理,对于在实际开发中使用Spring Boot遇到的问题也就迎刃而解了。
不瞒您说,我到现在都没有真正意义上地接触过springcloud,原因很简单,我开发工作用的技术栈已经被阿里内部的中间件承包了,所有你在springcloud里用到的技术,在阿里内部都有对应的一套甚至是几套实现,它们有的已经开源了,有的只在内部使用,反正,在阿里你是用不到开源的技术的,即使强如springcloud的也是一样。
其实除了阿里,类似美团、京东等Java大厂,一样也会维护自己的一套自研技术栈,毕竟自己的东西自己说了算,出现问题也能第一时间修复,如果用的是开源技术,万一哪天出了bug,还得到开源社区求爷爷告奶奶,岂不是很尴尬。
虽然没有严格意义上地接触过springcloud,但是微服务这一套东西其实是换汤不换药的。
让我们来看看百度百科对于微服务和springcloud的介绍吧。
所谓的微服务是SOA架构下的最终产物,该架构的设计目标是为了肢解业务,使得服务能够独立运行。微服务设计原则:1、各司其职 2、服务高可用和可扩展性。
微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持微服务。一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。
其实这里已经说得比较明白了,微服务的作用是把以往庞大的单个应用拆分成多个组件,每个组件各司其职,比起单个大型服务,微服务的好处实在太多了,比如它们可以单独部署,单独测试,更好地支持DevOps,更有效利用机器资源,同时更容易保证扩展性和可用性。下图就是微服务架构的变迁过程。
如果还是没理解,那我就一点一点地给你解释。
1、在部署和研发效率方面,一个大型应用,部署本身就很慢,改动一点代码就要部署半天,研发迭代效率可想而知,而微服务应用本身体量就小,部署快,每个微服务可以独立开发迭代,效率自然高。
2、在使用资源和测试效率方面,一个大型应用,往往占用的资源上下限差距很大,很多时候我们不得不给他分配大量的资源,而微服务应用如今都支持容器化部署,容器化部署的最大好处就是支持资源的弹性伸缩,提高资源利用效率。而对于测试来说,一个大型应用,往往一点点改动就需要回归这个应用的代码,代价可想而知,而微服务拆分后,测试的量将大大降低。
除此之外,微服务的优点还很多,比如更容易排查问题,更容易进行扩容和伸缩,更能够避免单点的问题。
下面这张图,把我们日常的生活比作微服务,其实,我们的生活不就是由这么一个个齿轮组成的么。
当然,微服务也不全都是优点,缺点自然也是有的。
比如,微服务的拆分需要花很大代价,首先应用要拆分,原来的本地服务要变成分布式服务,而分布式服务要面临的问题比本地服务的多得多,不过幸好微服务框架已经解决了其中一些问题。
另外,微服务的拆分不仅是应用的拆分,相应的数据源也要进行拆分,这就涉及到了分布式数据库的一些解决方案,比如分库分表,比如分布式事务等等,也就是说,微服务的拆分必然引入很多分布式环境下才有的问题,包括数据一致性、网络分区等等。
那么,既然微服务拆分会带来这么多问题,那么微服务框架的研发者自然也想到了,于是它们会用各种办法来帮助开发者解决这些问题,下面就让我们来看看springcloud是怎么做的吧。
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring
Boot的开发风格做到一键启动和部署。
Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
显然,springcloud是有备而来的,微服务拆分引起的问题,它都可以一一化解。
比如,把本地服务拆分成分布式服务,springcloud提供了服务注册中心和配置中心,以及统一的服务网关,让分布式服务像本地服务一样简单易用
与此同时,消息总线、负载均衡等技术解决了分布式环境中的一些高并发问题。
除此之外,像是数据监控、熔断和限流、分布式链路追踪、集群容错等功能,都在springcloud中有对应的解决方案。
再次强调一下,springcloud才是微服务框架,而springboot只是一个快速开发web应用的脚手架,Spring Cloud的基础是Spring Boot,基于Spring Boot可以大大简化开发各微服务组件的流程。
至此,我们已经介绍完了spring全家桶的大部分内容,希望这些内容对于你日后学习spring生态技术有所帮助。
其实,spring最好的技术资源就在官方:https://spring.io/
英文好的同学不妨直接去看官方文档。
Spring Boot实战 ,丁雪丰 (译者)
Spring源码深度解析
这里我整理了一些还算不错的视频资源分享给大家,具体请在公众号【程序员黄小斜】内回复“spring”即可查看
Java技术仓库《Java程序员复习指南》
https://github.com/h2pl/Java-Tutorial
整合全网优质Java学习内容,帮助你从基础到进阶系统化复习Java
全网最热的Java面试指南,共200多页,非常实用,不管是用于复习还是准备面试都是不错的。
在公众号【Java技术江湖】回复“PDF”即可免费领取。
如果觉得本文对你有帮助的话,请你也不要吝啬你的“好看”哈,转发朋友圈就是对我最大的支持啦,你们的支持是对我最大的鼓励。
对本系列文章有什么建议和意见,也欢迎留言告诉我,期待你的回馈。