微服务架构基础(Spring Boot+Spring Cloud+Docker)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-27 18:28:01

点击下载

作者:黑马程序员

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

微服务架构基础(Spring Boot+Spring Cloud+Docker)

微服务架构基础(Spring Boot+Spring Cloud+Docker)试读:

前言

FOREWORD

为什么要学习本书

最近两年,微服务一词逐渐地进入了技术人员的视野,并已成为当下最火的技术名词之一。这里的微服务并不是指某一个技术或者某个服务,而是一种理念。通过此理念的使用,逐渐地发展出了一种流行的架构——微服务架构。

微服务架构是指由一系列职责单一的细粒度服务构成的分布式网状结构,其基本思想在于围绕着业务领域创建应用,这些应用可独立地进行开发和管理。简单来说,微服务架构的目的就是有效拆分应用,实现敏捷开发和部署。

微服务架构适合有一定的扩展复杂度,且有很大用户增量预期的应用。通常来说,比较适合新兴的互联网公司项目或有升级需求的传统企业应用。随着技术的不断发展,各种企业对微服务架构的使用需求将越来越多。

虽然使用微服务架构技术的市场需求在不断增加,但掌握相关技术的人员却很少。尤其当前市面上的相关资料、书籍并不多,且讲解Spring Boot+Spring Cloud+Docker技术的资料更是少之又少,这也在一定程度上制约了微服务架构技术的发展。

为了帮助更多的技术人员了解并掌握微服务架构技术的使用,本书以通俗易懂的语言、典型翔实的案例,对微服务架构技术的使用进行详细讲解。对于想快速学习微服务技术的人员,以及对Spring Boot、Spring Cloud和Docker有兴趣的人员来说,本书将是您很好的选择。如何使用本书

本书适用于具有一定Java Web框架(如Spring框架)、Maven工具和Linux系统使用基础的技术人员,以及对微服务感兴趣的业务人员学习。对于想深入学习的非技术人员,建议先掌握Java框架技术、Maven工具以及Linux系统的使用。

本书在Spring Boot + Spring Cloud + Docker的基础上,详细讲解了微服务架构技术使用的相关知识。在编写时,作者力求将一些非常复杂、难以理解的思想和问题简单化,使读者能够轻松、快速地掌握这些知识点。

本书共10章,每章的内容如下。

·第1章讲解微服务及其相关的技术。主要包括微服务和微服务架构的概念、产生背景、微服务架构的优势与不足、如何搭建微服务架构,以及如何选择微服务架构技术。通过本章的学习,读者将对微服务及其相关概念有一定的了解,并熟识常用的微服务架构技术。

·第2章对Spring Boot的由来、特点、使用要求、入门程序以及工作机制进行详细讲解。通过本章的学习,读者可以体会到Spring Boot框架的方便和高效,并能了解Spring Boot的执行过程。

·第 3 章讲解如何使用 Spring Boot 与其他技术进行集成开发,内容包括 Spring Boot 与MyBatis框架的集成、与Redis的集成,以及与ActiveMQ的集成。通过本章的学习,读者将熟悉如何在实际开发中应用Spring Boot。

·第4章讲解微服务架构中的服务发现以及客户端负载均衡。服务发现是通过Spring Cloud Eureka实现的,而客户端负载均衡是通过Spring Cloud Ribbon实现的。

·第5章讲解微服务架构中的服务容错保护、API网关服务,以及分布式配置管理的使用知识,其中服务容错保护使用的是Spring Cloud Hystrix,API网关服务使用的是Spring Cloud Zuul,分布式配置管理使用的是Spring Cloud Config。学习完本章后,结合前面所学知识,读者将可以搭建一个比较完整的微服务架构。

·第6章讲解Docker入门的一些基础知识,内容包括Docker的概念和特点、安装要求和安装方式,以及运行机制。通过本章的学习,读者可以对Docker的概念及其体系架构有一个初步的了解,并能够掌握在Ubuntu系统上安装Docker的几种方式。

·第7章讲解Docker的基本使用及镜像管理的一些知识,内容涉及Dockerfile文件、Docker客户端的常用指令等。通过本章的学习,读者可以掌握Docker的基本使用,同时能够掌握Docker中的镜像管理。

·第8章讲解Docker中的网络与数据管理知识,内容包括Docker的默认网络和自定义网络管理、Docker Swarm 的集群、Docker 的数据存储,以及 Volumes 数据卷的管理。通过本章的学习,读者可以对Docker中的网络、数据管理以及Docker Swarm的基本知识有一定的了解,同时能够掌握Docker中自定义的网络管理和Volumes数据卷管理的具体使用方法。

·第9章讲解微服务项目的整合以及接口测试的相关知识,内容包括使用微服务架构搭建的一个商城管理系统,以及接口可视化工具Swagger-UI的使用。通过本章的学习,读者可以对微服务项目的使用有进一步的认识,熟悉Spring Boot和Spring Cloud相关组件的整合开发,同时还可以掌握接口测试工具Swagger-UI的简单使用。

·第10章讲解有关微服务部署的相关知识,内容涉及Docker Comopse编排工具、微服务与Docker的整合、微服务手动部署,以及使用Jenkins完成微服务的自动化部署等内容。通过本章的学习,读者可以掌握微服务与Docker的整合,同时能够掌握如何使用Jenkins完成微服务项目的自动化集成和部署。

在学习过程中,读者一定要亲自实践书中的案例代码,如果不能完全理解书中所讲的知识点,可以登录博学谷平台,通过平台中的教学视频进行辅助学习。另外,如果读者在理解知识点的过程中遇到困难,建议不要纠结于某个地方,可以先往后学习。通常来讲,随着对后面知识的不断深入了解,前面看不懂的知识点一般就能理解了。如果读者在动手练习的过程中遇到问题,建议多思考,理清思路,认真分析问题发生的原因,并在问题解决后多总结。

本书采用基础知识+案例相结合的编写方式,通过基础知识的讲解与案例的巩固,可以使读者快速地掌握技能点。致谢

本书的编写和整理工作由传智播客教育科技股份有限公司完成,其中主要的参与人员有吕春林、陈欢、韩永蒙、石荣新、杜宏、梁桐、王友军、冯佳等。全体人员在近一年的编写过程中,付出了很多辛勤的汗水,在此一并表示衷心的感谢。意见反馈

尽管我们尽了最大的努力,但书中难免会有不妥之处,欢迎各界专家和读者朋友们来函给予宝贵意见,我们将不胜感激。您在阅读本书时,如发现任何问题或不认同之处,可以通过电子邮件(itcast_book@vip.sina.com)与我们取得联系。传智播客.黑马程序员2017年12月4日于北京第1章认识微服务架构学习目标

● 了解微服务和微服务架构的概念

● 熟悉微服务架构的优点与不足

● 了解微服务架构的技术选型

微服务(Microservice)概念的提出已经有很长一段时间了,但在最近几年才开始频繁地出现。虽然现在很多公司都开始采用微服务及其架构来满足实际需求,但这种方式并没有普及,很多开发人员还只停留在听说过“微服务”或“微服务架构”这些词上。那么为什么需要微服务架构?什么是微服务架构?又如何去构建微服务架构呢?本章将针对这些问题进行一一讲解。1.1 为什么需要微服务架构

任何一个新事物或者新技术的出现,必然有其出现的原因,微服务架构也不例外。随着互联网技术的发展,传统的应用架构已满足不了实际需求,微服务架构就随之产生。那么传统应用架构到底出了什么问题呢?又如何解决?接下来的两个小节中,我们将从传统单体架构的问题开始,对为什么需要微服务架构进行详细讲解。1.1.1 传统单体应用架构的问题

通常我们所使用的传统单体应用架构都是模块化的设计逻辑,程序在编写完成后会被打包并部署为一个具体的应用,而应用的格式则依赖于相应的应用语言和框架。例如,在网上商城系统中,Java Web工程通常会被打成WAR包部署在Web服务器上,而普通Java工程会以JAR包的形式包含在WAR包中,如图1-1所示。图1-1 早期单体架构

图 1-1 中的这种应用开发风格很常见,它易于开发和调试,并且易于部署。在用户量不多时,此种架构方式完全可以满足需求,但随着用户人数的增加,一台机器已经满足不了系统的负载,此时我们就会考虑系统的水平扩展。通常情况下,我们只需要增加服务器的数量,并将打包好的应用拷贝到不同服务器(如 Tomcat),然后通过负载均衡器(如 Apache、Nginx)就可以轻松实现应用的水平扩展,如图1-2所示。图1-2 传统单体应用架构

在早期,单体架构的这种扩展方式可以很好地满足使用需求,但随着时间的推移,这种方式就会产生很多问题,具体表现如下。1.应用复杂度增加,更新、维护困难

一个简单的应用会随着时间的推移而逐渐变大。一旦应用变得庞大而又复杂,开发团队将会面临很多问题,其中最主要的问题就是这个应用太复杂,以至于任何单个开发者都很难进行二次开发或维护。2.易造成系统资源浪费

虽然使用负载均衡的方式可以对项目中的服务容量进行水平扩展,但由于传统单体架构的代码中只有一个包含所有功能的 WAR 包,所以在对服务容量扩容时,只能选择重复地部署这个WAR 包来扩展服务能力,而不仅仅是扩展了所需的服务。这样就会导致其他不需要扩展的服务也进行了相应的扩展,但这些扩展是不需要的,因此这种方式会极大地浪费资源。3.影响开发效率

当一个应用越大时,启动时间就会越长。开发和调试的过程中,如果有很大一部分时间都要在等待中度过,那么必然会对开发效率有极大的影响。4.应用可靠性低

传统单体应用架构在运行时的可靠性比较低,当所有模块都运行在一个进程中时,如果任何一个模块中出现了一个Bug,可能会导致整个进程崩溃,从而影响到整个应用。5.不利于技术的更新

传统单体应用架构一旦选定使用某些技术,则后期的开发和扩展将在这些技术的基础上实现。如果需要更改某种技术,则可能需要将整个应用全部重新开发,这种成本是非常大的。

当然,传统单体应用架构的问题还不只这些,但出现这些问题的根本原因可以说就是由于传统单体架构中一个WAR包内包含了系统的所有服务功能所导致的。随着业务变得越来越多,问题也就越来越多。1.1.2 如何解决传统应用架构的问题

针对传统单体架构的问题,大部分企业通过SOA(Service-Oriented Architecture,面向服务的架构)来解决上述问题。SOA 的思路是把应用中相近的功能聚合到一起,以服务的形式提供出去,因此基于SOA架构的应用可以理解为一批服务的组合。

同样以网上商城为例,一个简单的SOA系统如图1-3所示。图1-3 SOA系统

从图1-3中可以看出,SOA将原来的单体架构按照功能细分为不同的子系统,然后再由各个子系统依赖服务中间件(这里指企业服务总线Enterprise Service Bus,简称ESB)来调用所需服务。

使用SOA可以将系统切分成多个组件服务,这种通过多个组件服务来完成请求的方式有很多好处,具体如下。

·把项目拆分成若干个子项目,不同的团队可以负责不同的子项目,从而提高开发效率。

·把模块拆分,使用接口通信,降低了模块之间的耦合度。

·为企业的现有资源带来了更好的重用性。

·能够在最新的和现有的应用之上创建应用。

·能够使客户或服务消费者免予服务实现的改变所带来的影响。

·能够升级单个服务或服务消费者而无需重写整个应用,也无需保留已经不再适用于新需求的现有系统。

虽然使用SOA解决了单体架构中的问题,但多数情况下,SOA中相互独立的服务仍然会部署在同一个运行环境中(类似于一个Tomcat实例下,运行了很多web应用)。和单体架构类似,随着业务功能的增多,SOA 的服务会变得越来越复杂。本质上看,单体架构的问题并没有因为使用SOA而变得更好。

针对单体架构和SOA的问题,许多公司(如Amazon、eBay和NetFlix)通过采用微处理结构模式解决了系统架构中的问题。其思路不是开发一个巨大的单体式的应用,而是将应用分解为小的、互相连接的微服务。随着微服务的使用,微服务架构的思想也随之产生。1.2 微服务架构是什么1.2.1 微服务架构的概念

微服务架构是一种架构风格和架构思想,它倡导我们在传统软件应用架构的基础上,将系统业务按照功能拆分为更加细粒度的服务,所拆分的每一个服务都是一个独立的应用,这些应用对外提供公共的API,可以独立承担对外服务的职责,通过此种思想方式所开发的软件服务实体就是“微服务”,而围绕着微服务思想构建的一系列体系结构(包括开发、测试、部署等),我们可以将它称之为“微服务架构”。

根据微服务架构的定义,将传统单体架构拆分为微服务架构的方式,如图1-4所示。

从图 1-4 中可以看出,微服务架构已将传统单体架构中的订单服务、商品服务和用户服务拆分为了独立的服务,其中的每一个服务都是一个独立的应用,可以访问自己的数据库,这些服务对外提供公共的API,并且服务之间可以相互调用。注意微服务和微服务架构是两个不同的概念。微服务强调的是服务的大小,它关注的是某一个点,而微服务架构是一种架构思想,需要从整体上对软件系统进行全面的考虑。图1-4 传统单体架构拆分为微服务架构1.2.2 微服务架构的优点

与传统单体应用架构相比,微服务架构有很多优点,具体表现如下。1.复杂度可控

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

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

微服务架构下,技术的选型是多样化的。每个团队都可以根据自身服务的需求和行业发展的现状,自由选择最适合的技术。由于每个微服务相对简单,当需要对技术进行升级时,所面临的风险较低,甚至完全重构一个微服务也是可行并容易的。4.易于容错

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

单个服务应用也可以实现横向扩展,这种扩展可以通过将整个应用完整地复制到不同的节点中实现。当应用的不同组件在扩展需求上存在差异时,微服务架构便体现出其灵活性,因为每个服务可以根据实际需求独立进行扩展。6.功能特定

每个微服务都有自己的业务逻辑和适配器,并且一个微服务一般只完成某个特定的功能,例如商品服务只管理商品、客户服务只管理客户等。这样开发人员可以完全地专注于某一个特定功能的开发,而不用过多地考虑其他,从而提高开发效率。除此之外,微服务架构还有很多其他优势,由于篇幅有限,这里就不一一列举了,但从微服务架构的优势可以看出,使用微服务可以很好地解决传统单体架构中的问题。1.2.3 微服务架构的不足

微服务架构除了有上面所讲的各种优点外,还存在着一些不足,这些不足的具体表现如下。1.开发人员必须处理创建分布式系统的复杂性

·开发工具(或IDE)是面向构建传统的单体应用程序的,不为开发分布式应用程序提供全面功能上的支持。

·测试更加困难。在微服务架构中,服务数量众多,每个服务都是独立的业务单元,服务主要通过接口进行交互,如何保证依赖的正常,是测试面临的主要挑战。

·开发人员必须实现服务间的通信机制。

·实现用例跨多个服务时,需要面对使用分布式事务管理的困难。

·实现跨多个服务的用例,需要团队之间进行仔细的协调。2.部署的复杂性

在部署和管理时,由许多不同服务类型组成的系统的操作比较复杂,这将要求开发、测试及运维人员有相应的技术水平。3.增加内存消耗

微服务架构用多个服务实例取代了 1 个单体应用程序实例,如果每个服务都运行在自己的JVM中,那么有多少个服务实例,就会有多少个实例在运行时的内存开销。1.2.4 微服务架构与SOA的区别

通过前 3个小节的学习,相信读者对微服务架构已经有了一定的了解。在学完后,细心的读者可能会有这样一个疑问,微服务架构与SOA都是对单体架构的拆分,那么它们有什么不同呢?

下面通过一个表格对两者的区别进行对比,如表1-1所示。表1-1 微服务架构与SOA的区别1.3 如何构建微服务架构

了解了微服务架构的概念、优点与不足后,相信很多人对微服务架构都会产生这样一些疑问,例如我要何时使用微服务架构?又如何将应用程序分解为微服务?分解后,要如何去搭建微服务架构?同时,在微服务架构中,因为会涉及多个组件,那么这些组件又可以使用什么技术来实现呢?接下来的几个小节中,我们将对这些问题进行详细地讲解。1.3.1 微服务的拆分

对于一般的公司而言,实践微服务有非常大的技术挑战,所以并不是所有的公司都适合将单体架构拆分成微服务架构。一般来说,微服务架构比较适合未来有一定的扩展复杂度,且有很大用户增量预期的应用,例如一些新兴的互联网公司应用。这些公司在创业初期,不可能买大量的或很贵的机器,但是又必须考虑应对成功后巨量的用户问题,这时微服务架构就成了最好的选择。除此之外,对于那些项目规模较大、业务复杂度较高,且需要长期跟进的项目,也适合考虑使用微服务架构。

在决定使用微服务架构后,所面临的另一个问题就是如何将系统拆分为微服务。对于微服务的拆分,可以参考如下几点建议。

·通过业务功能分解并定义与业务功能相对应的服务。

·将域驱动设计分解为多个子域。

·按照动词或用例分解,并定义负责特定操作的服务,例如一个负责完成订单的航运服务。

·通过定义一个对给定类型的实体或资源的所有操作负责的服务来分解名词或资源,例如一个负责管理用户账户的账户服务。

由于每个公司项目的实际情况不同,所以微服务的拆分在实际操作时,会涉及到很多不同的细节问题,这里就不一一描述了,但总体来说,项目在拆分时按照上述几点建议即可。1.3.2 微服务架构的组件

在正式学习如何搭建微服务架构之前,我们先来了解一下微服务架构中涉及的一些常见组件名称及其作用。

·服务注册中心:注册系统中所有服务的地方。

·服务注册:服务提供方将自己调用地址注册到服务注册中心,让服务调用方能够方便地找到自己。

·服务发现:服务调用方从服务注册中心找到自己需要调用服务的地址。

·负载均衡:服务提供方一般以多实例的形式提供服务,使用负载均衡能够让服务调用方连接到合适的服务节点。

·服务容错:通过断路器(也称熔断器)等一系列的服务保护机制,保证服务调用者在调用异常服务时快速地返回结果,避免大量的同步等待。

·服务网关:也称为API网关,是服务调用的唯一入口,可以在这个组件中实现用户鉴权、动态路由、灰度发布、负载限流等功能。

·分布式配置中心:将本地化的配置信息(properties、yml、yaml 等)注册到配置中心,实现程序包在开发、测试、生产环境的无差别性,方便程序包的迁移。

除此之外,读者在学习时,可能还会在一些参考资料中看到服务的健康检查、日志处理等组件内容。由于使用上面所描述的组件即可实现微服务架构的快速入门,所以本书中并未对这些额外的组件进行讲解,有兴趣的读者可自行学习。1.3.3 微服务架构的搭建

通过前两个小节的学习,我们已经了解了如何将传统业务拆分为微服务,并熟悉了微服务架构中所涉及的组件。为了使读者在整体上对微服务架构有一个认识,下面我们通过一张图来讲解如何搭建一个微服务架构,如图1-5所示。图1-5 如何搭建微服务架构

在图1-5中,部署了一系列的微服务,每个微服务都会访问自己的数据库(Database)。当这些微服务启动时,会将其信息注册到服务注册中心(Service Registry),在客户端发送请求时,请求首先会被API网关(API GateWay)拦截,API网关会读取请求数据,并从注册中心获取对应的服务信息,然后API网关会根据服务信息调用所需的微服务。小提示图 1-5 中展示的只是一个简单的微服务架构,然而要判断一个架构是否是微服务架构,还需要满足以下几点要求。·根据业务模块划分服务种类。·每个服务可独立部署且相互隔离。·通过轻量级API调用服务。·服务需保证良好的高可用性。只有满足以上几点要求的架构,才能称之为微服务架构,所以在搭建微服务架构时,一定要注意这些问题。1.3.4 微服务架构的技术选型

在微服务架构中,不同的组件(包括微服务实例、注册中心和API网关等组件)需要根据不同的情况来选取相应的技术,那么我们可以使用哪些技术呢?本小节将对微服务架构中各个组件可使用的技术,以及本书所选用的技术进行简单介绍。1.微服务实例的开发

微服务的开发可以选用的框架技术有 Spring 团队的 Spring Boot、Jboss 公司的 WildFly Swarm和Java EE官方的微服务框架KumuluzEE等。2.服务的注册与发现

架构中服务的注册与发现功能,可以使用的技术有 Spring Cloud Eureka、Apache Zookeeper、Consul、Etcd和Dubbo等,它们都是用于服务注册和发现的技术。3.负载均衡

负载均衡可以使用的技术有Spring Cloud Ribbon和Dubbo等。4.服务容错

服务容错的技术可以选用Hystrix,在Spring Cloud的子项目中包含Spring Cloud Hystrix。5.API网关

架构中的API网关服务,可以使用的技术有Spring Cloud Zuul、Spring Reactor、Netty或NodeJS等。6.分布式配置中心

分布式配置中心可以使用Spring Cloud Config。7.调试

微服务应用的测试工作可以使用Swagger。Swagger是当前最受欢迎的REST API文档生成工具之一,它提供了强大的页面测试功能来调试每个RESTful API。8.部署

微服务的官方文档中推荐使用Docker来打包和部署微服务。由于Docker是一个开源的应用容器引擎,具有可移植性强、启动速度快等特点,所以适合跑一些轻量的应用。9.持续集成

为了实现服务的自动化部署,我们可以通过 Jenkins 搭建自动化部署系统,并使用 Docker进行容器化封装。

在上面的技术选型中,从微服务注册与发现、负载均衡、容错、API网关和分布式配置中心组件的可选技术内,我们都看到了Spring Cloud的身影。实际上,Spring Cloud的子项目中,已经提供了构建微服务所需的所有解决方案。

为了方便读者学习,并能快速地掌握微服务架构的使用,本书将使用 Spring Boot+Spring Cloud+Docker技术来实现微服务架构。书中的主要技术选型如图1-6所示。图1-6 微服务架构的主要技术选型

从图1-6中可以看出,我们会使用Spring Boot实现微服务实例的开发,使用Spring Cloud Eureka来实现服务的注册与发现,使用Spring Cloud Hystrix的断路器功能来实现服务容错,使用Spring Cloud Ribbon实现服务间的负载均衡,使用Spring Cloud Zuul实现服务网关,使用Spring Cloud Config作为分布式配置中心,使用Swagger对微服务进行测试,并使用Jenkins的持续集成功能来实现自动化部署。

微服务架构中各个组件的技术选型有很多,对于已经实施过微服务并且项目自成体系的公司来说,Spring Cloud可能并没有太大的吸引力,但对于还未实施微服务或项目没有自成体系的公司来说,Spring Cloud将是一个非常好的选择。小提示除了Spring Cloud之外,Dubbo也是目前国内比较流行的分布式服务框架,它们都具备分布式服务治理相关的功能,都能够提供服务注册、发现、路由和负载均衡的能力。相比之下,Spring Cloud提供了更加完整的一套企业级分布式云应用的解决方案,包含了微服务组件中的方方面面,并能够结合Spring Boot、Docker实现快速开发的目的,而Dubbo只有Spring Cloud的一部分功能。由于二者具体的实现方式不同,因此并没有好坏之分。企业在选用时,需根据自身情况选择。

需要注意的是,本书中只是针对Java中微服务技术进行的选型,其他开发语言也有着自己的微服务技术栈,在选用时,同样需要依据实际情况慎重考虑。1.4 本章小结

本章主要讲解了微服务相关的内容,包括微服务和微服务架构的概念、产生背景、微服务架构的优势与不足、如何搭建微服务架构,以及如何选择微服务架构的技术。虽然微服务化是当下流行的发展趋势,但也不是所有场景都适合使用,实际的项目中,我们还需要在传统的分布式架构与微服务架构之间谨慎地选择。第2章初识Spring Boot学习目标

● 了解Spring Boot的特点与使用要求

● 掌握Spring Boot入门程序的编写

● 熟悉Spring Boot的工作机制

在第一章中,我们已经说明了本书中微服务的开发会使用 Spring Boot,那么到底什么是Spring Boot呢?使用它有什么好处?又如何使用呢?接下来本章将主要针对这些问题进行逐一讲解。2.1 Spring Boot介绍2.1.1 Spring Boot的由来和特点

Spring Boot是由Spring团队(Pivotal团队)提供的一个全新框架,其设计目的是为了简化Spring 应用的初始搭建过程和开发过程。该框架使用了特定的方式来进行配置(提供了默认的代码和注释配置),这使得开发人员不再需要定义样板化的配置,而只需非常少的配置就可以快速地开发基于Spring的应用。

Spring Boot框架有很多优点,这些优点的具体表现如下。1.可快速构建独立的Spring应用程序

Spring Boot所创建的应用程序都是独立的JAR包,而不是WAR包,即使是Web应用,也是JAR包,我们可以直接通过JAR包来运行一个Spring应用程序。如果需要,也可以将Spring Boot程序以WAR包的形式部署到服务器。2.内嵌Servlet容器,无需单独安装容器即可独立运行项目

Spring Boot项目不需要将WAR包部署到Tomcat、Jetty等Servlet容器中,而是在启动时,自动地启动一个嵌入式的Tomcat,我们可以通过application.properties配置Tomcat具体的端口号信息。3.对主流开发框架的无配置集成

Spring Boot与其他主流框架整合时,只需在pom.xml中添加相应依赖,即可直接使用该框架,无需在项目的配置文件中添加配置。4.提供开箱即用的Spring插件,简化了Maven、Gradle的配置

Spring Boot提供了大量的开箱即用的插件,开发人员只需添加一段Maven依赖配置即可使用。这些插件在Spring Boot中被称为“Starter”,每一个Starter都有自己独立的配置项。5.自动配置Spring,极大地提高了开发、部署效率

Spring Boot会根据类路径中的类和JAR包中的类自动配置Bean,而不需要手动配置。这样极大地减少了开发人员的工作内容,从而提高开发和部署的效率。6.无需任何XML配置

Spring Boot只有一个application.properties配置文件,没有其他XML配置文件。

需要注意的是,虽然Spring Boot有很多优点,但是将现有的Spring项目转换为Spring Boot项目还是有一定困难的,它更适用于全新的Spring项目。2.1.2 Spring Boot的使用要求1.使用环境

在本书编写时,Spring Boot 官方发布的最新正式版本为 1.5.6.RELEASE,因此本书就以1.5.6.RELEASE版本为例对Spring Boot进行讲解。默认情况下,该版本需要在Java 7环境和Spring框架4.3.10.RELEASE或以上版本中使用。由于Spring Boot官方推荐使用Java 8环境,所以本书使用的Java版本为Java 8。

需要注意的是,目前官方Spring Boot 1.5.x正式版本还在不断地更新中,读者在学习时,可能会发现最新正式版已不是 1.5.6,但这并不影响读者学习本书。读者只需按照书中内容学习即可,但建议学习时版本与本书保持一致。2.构建支持

使用Spring Boot 1.5.6.RELEASE版本开发时需要第三方技术的构建支持,目前已明确提供构建支持的有Maven(3.2+)、Gradle2(2.9或之后)和Gradle3。

本书使用的是Maven3.5.0版本,读者可自行选择Maven3.2以上的版本,但学习时建议与本书版本一致。3.开发工具

Spring Boot的开发工具可以使用Spring Tool Suite (STS)或IntelliJ IDEA。其中Spring Tool Suite (STS)是一个基于Eclipse的开发环境,它是为开发Spring应用程序而定制的。我们可以直接下载并使用该工具,也可以在已有Eclipse中安装STS插件。

由于开发人员通常更熟悉使用Eclipse,所以本书将使用Eclipse Neon.3 Release (4.6.3)版本配合 STS 插件进行讲解,此版本对应的 STS 插件可以通过地址 https://spring.io/tools/sts/all下载。2.2 Spring Boot入门

通过前面几个小节的学习,读者对Spring Boot的概念、特点和使用要求都已经有所了解,那么既然要使用Spring Boot进行项目的开发,我们要如何创建Spring Boot项目,以及如何在项目中编写程序呢?接下来的两个小节中,将对这两个问题进行详细地讲解。2.2.1 Spring Boot项目的快速搭建

Spring Boot 项目有多种快速搭建的方式,例如可以通过官网提供的代码生成器 Spring Initializr来构建项目,可以使用Maven来手动构建项目,还可以通过Spring Tool Suite (STS)插件来构建项目(创建的是Spring Starter Project)。

由于使用Spring Initializr来构建项目简单、快速、方便,易于初学者快速地了解Spring Boot的项目结构,所以下面以Spring Initializr创建的方式为例,讲解下Spring Boot项目的快速搭建。通过Spring官网地址https://start.spring.io/中的代码生成器Spring Initializr可以快速地生成一个Spring Boot项目。访问网址后,浏览器的显示结果如图2-1所示。

从图2-1中可以看出,通过此页面的功能可以生成一个基于Java语言和Spring Boot 1.5.6的Maven项目。在项目元数据信息(Project Metadata)框中,填写完所需数据,这些数据与创建Maven项目一致,并单击按钮【Generate Project alt + 】即可生成一个Spring Boot的基本项目。

如果需要执行更多操作,可以单击按钮下方的文字链接“Switch to the full version”,此时页面下方将展示出更多的操作信息。例如,要在生成一个简单的依赖于Web模块的Spring Boot应用,可以在页面中勾选Web模块信息,如图2-2所示。图2-1 Spring Initializr初始页面图2-2 Spring Initializr生成项目的web界面

在图2-2中,左侧的“Packaging”默认选择“Jar”,表示这个项目打包操作后会生成一个JAR包,【Generate Project alt +】按钮下方的选项表示项目可添加的依赖内容,这里选择了Web,该选项表示依赖Web模块。选择后,在页面中的右侧会显示出已选择的依赖内容。

除Web模块外,页面还提供MySQL、Redis等更多模块内容,这里就不一一展示了,读者可自行查看。为便于开发者快速定位,该页面右侧的还提供了【Search for dependencies】功能,用于精准查找和选择所需依赖。

此时单击【Generate Project alt +】按钮,浏览器会下载一个名称为“hello”的zip压缩包,解压后,将得到一个名称为“hello”的项目。使用Eclipse导入此项目后(导入的是Maven项目),就可以在项目中进行相应功能的开发。此时Eclipse中的项目结构如图2-3所示。图2-3 项目结构

从图2-3中可以看出,Spring Boot项目遵循的是传统的Maven项目布局,它的主要应用程序代码位于src/main/java目录中,如程序的引导类HelloApplication.java,我们可以直接运行该类来启动Spring Boot应用。

资源文件在src/main/resources目录中,例如用于配置应用程序和Spring Boot属性的文件application.properties。因为引入了Web模块,所以Spring Initializr在生成项目时自动生成了static和templates目录,其中static目录用于存放静态资源,如图片、CSS文件和JS文件等,而templates目录用于存放Web页面的模板文件。

测试代码在src/test/java目录中,如测试类HelloApplicationTests.java。由于此时没有测试相关的配置文件,所以并没有相应目录,如果需要编写测试配置文件,则需要放置在src/test/resources目录中。

我们对项目中的目录及其文件功能讲解完之后,为了使读者对项目中文件的具体内容有所了解,下面将对项目所生成的主要文件(HelloApplication.java,application.properties,HelloApplicationTests.java,pom.xml)的内容进行详细讲解,具体如下。1.HelloApplication.java

HelloApplication.java是程序的引导类,我们可以直接运行该类来启动Spring Boot应用,该类的代码如文件2-1所示。

文件2-1 HelloApplication.java1 package com.itheima.web;2 import org.springframework.boot.SpringApplication;3 import org.springframework.boot.autoconfigure.SpringBootApplication;4 @SpringBootApplication5 public class HelloApplication {6   public static void main(String[] args) {7     SpringApplication.run(HelloApplication.class, args);8   }9 }

在文件2-1中,@SpringBootApplication是Spring Boot的核心注解,它是一个复合注解,用于开启组件扫描和自动配置。在main()方法中,通过调用SpringApplication类的run()方法将业务委托给了Spring Boot的SpringApplication类,SpringApplication类将引导应用程序启动Spring,并相应地启动被自动配置的Tomcat服务器。只需要将 HelloApplication.class作为参数传递给run()方法,以此来通知SpringApplication谁是主要的Spring组件,并传递args数组作为参数即可。2.application.properties文件

在新创建的Spring Boot项目中,application.properties文件是一个空文件,并且是可选文件,我们可以通过该文件对Spring Boot应用的服务端口号、注册中心地址等内容进行调整。

例如将嵌入在项目中的Tomcat端口号8080修改为8081,那么就可以在配置文件中添加如下信息:

server.port=8081

需要注意的是,项目中不需要显示的配置Spring Boot加载application.properties文件的信息,只要该文件存在,就会被自动加载,Spring和应用程序代码就可以获取其中的属性信息。3.HelloApplicationTests.java

HelloApplicationTests.java是Spring Initializr提供的一个基本的集成测试类,可以基于该类为应用程序编写测试代码。该类中的实现代码如文件2-2所示。

文件2-2 HelloApplicationTests.java1 package com.itheima.web;2 import org.junit.Test;3 import org.junit.runner.RunWith;4 import org.springframework.boot.test.context.SpringBootTest;5 import org.springframework.test.context.junit4.SpringRunner;6 @RunWith(SpringRunner.class)7 @SpringBootTest8 public class HelloApplicationTests {9   @Test10   public void contextLoads() {11   }12 }

在上述代码中,@RunWith 注解表示测试运行在 Spring 测试环境中,@SpringBootTest 是Spring Boot 提供的注解,该注解通过 SpringApplication 在测试中创建应用上下文来工作。contextLoads()方法是一个空方法,虽然在方法体中没有编写任何代码,但通过此方法可以确定应用程序上下文的加载是否有问题。如果HelloApplication中定义的配置是正确的,那么就可以通过测试,否则,不能通过测试。4.pom.xml文件

pom.xml是Maven的项目文件,此文件中的信息如文件2-3所示。

文件2-3 pom.xml1 2 6   7   4.0.08   com.itheima9   hello10   0.0.1-SNAPSHOT11   jar12   hello13   Demo project for Spring Boot14   15   16     org.springframework.boot17     spring-boot-starter-parent18     1.5.6.RELEASE19     20   21   22   23     24       UTF-825     26     27       UTF-828     29     1.830   31   32   33     34       org.springframework.boot35       spring-boot-starter-web36     37     38       org.springframework.boot39       spring-boot-starter-test40       test41     42   43   44     45      46       47        org.springframework.boot48        spring-boot-maven-plugin49       50     51   52

从上述代码中可以看出,生成的pom.xml中包含Spring Boot项目的版本、依赖和插件等信息。其中,元素中的spring-boot-starter-parent是所有Spring Boot依赖包的父依赖,它提供了很多有用的默认设置,如 application.properties 的位置等。其他的依赖包只是简单地提供了开发特定类型应用的功能,如上述代码中元素中的 spring-bootstarter-web,就是我们在官网项目生成器页面中选择的Web依赖信息,该信息中包含了Tomcat、Spring MVC等内容。spring-boot-starter-test是一个通用的测试模块,该模块中包含了JUnit、Hamcrest等测试框架。

虽然在项目中只添加了几个依赖文件,但是当我们点开项目中的Maven Depenencies目录时,会发现项目需要的所有依赖包都已经在其中(包括tomcat和Spring MVC等)。实际上,现在就已经能够启动项目,只是由于没有编写程序代码,还看不到输出效果罢了。小提示Spring Boot提供的自动配置依赖模块都约定以spring-boot-starter-作为命名的前缀,并且都位于org.springframework.boot包或者命名空间下。开发者在使用和整合模块时,只需要引入对应的模块,而不需要像传统Maven项目那样添加大量的依赖包。多学一招:使用Maven构建Spring Boot项目

虽然使用官网提供的代码生成器Spring Initializr来构建项目非常简单、方便和快速,但此种方式要求必须连接Spring Initializr的网址。在上文中我们已经讲解过,除了使用官网代码生成器的方式来构建项目外,还可以使用Maven手动方式构建项目,那么要如何构建呢?

Maven手动构建方式的实现非常简单,同样以hello工程为例,构建时只需要如下3步。(1)新建一个简单的Maven工程hello,并在工程的pom.xml中添加Spring Boot的相关依赖(内容请参见文件2-3)。(2)在工程的 src/main/java 源文件夹中创建 com.itheima.web 包,并在包中创建引导类HelloApplication.java(实现代码请参见文件2-1)。(3)在src/main/resources源文件夹中创建配置文件application.properties。如果是web项目,还需要创建文件夹static和templates。

通过上面3步,一个简单的Spring Boot项目就已经搭建完成。可以看出,Spring Boot项目其实就是 Maven项目,与 Maven项目的构建方式一致。一般来说,开发人员可能会更习惯于使用Maven手动构建的方式来构建项目,初学者可以根据自身情况去选择使用何种方式来构建。由于通过STS插件的方式非常简单,只需要根据插件内容提示操作就可以完成项目的构建,因此这里就不多做讲解了,读者可自行练习使用。2.2.2 第一个Spring Boot程序

搭建完Spring Boot项目环境后,接下来本小节将在Spring Boot项目的基础上实现一个简单的应用程序。

在项目的com.itheima.web包中创建一个名称为HelloController的类,并在类中编写hello()方法,如文件2-4所示。

文件2-4 HelloController.java1 package com.itheima.web;2 import org.springframework.web.bind.annotation.Request Mapping;

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载