分布式中间件技术实战:Java版(txt+pdf+epub+mobi电子书下载)

作者:钟林森

出版社:机械工业出版社

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

分布式中间件技术实战:Java版

分布式中间件技术实战:Java版试读:

前言

为什么要写这本书

互联网、移动互联网时代的到来,不仅给企业业务的扩展带来了巨大的挑战,同时也在某种层面上给开发者带来了重大机遇。这一机遇主要是由具有高并发、高可用、高扩展等功能特性的分布式系统架构带来的。然而,分布式系统架构的构建其实是一个相当复杂的过程,在这个过程中毫无疑问是需要有一系列的功能组件加以支撑的。其中,最为典型的当属“中间件”,它在构建分布式系统架构的过程中起到了至关重要的作用。因此,想要进军分布式系统架构领域,学习并实战分布式中间件的相关知识,以及掌握其在实际典型业务场景中的使用,都是很有必要的。

目前,国内图书市场上关于Java中间件的图书不少,但是真正从初学者的角度,基于实际项目,通过各种典型业务模块和案例来指导读者提高开发水平的图书却很少。本书便是以实战为主,配合必要的理论知识,介绍了几款比较流行的分布式中间件,包括其理论层面的知识要点及在实际业务场景中的实战过程,让读者几乎可以从零开始一步一个脚印地学习Java企业级应用开发的各种常用中间件,从而提高实际开发水平和项目实战能力。本书有何特色1.详解Java企业级应用构建所涉及的常用中间件

本书主要介绍了Java企业级应用构建所涉及的各种常见中间件,包括Redis、RabbitMQ、ZooKeeper和Redisson等,不仅介绍了其理论要点,还介绍了其功能组件底层基础架构的执行过程。2.基于Spring Boot微服务框架作为实战中间件的奠基

本书采用了目前比较流行的Spring Boot微框架作为实战中间件的奠基,在整合中间件的相关依赖并实践其相关功能组件时,还介绍了Spring Boot、Spring MVC、MyBatis、Redis、RabbitMQ、ZooKeeper、Redisson和MySQL等热门技术。3.详解实际生产环境中的各种典型应用案例,实用性强

本书不仅以大量图文相结合的方式介绍了相关中间件的理论知识,而且还重点介绍了实际生产环境中各种中间件的典型应用场景,并给出了实现代码,有很强的实用性。而且这些中间件之间也相互独立,开发人员可以作为手册随时查阅和参考。4.案例典型,有较高的应用价值

本书在介绍完每个中间件的理论要点后,都会介绍一个典型的业务场景,甚至以实际的应用系统作为实战案例。这些案例来源于作者所开发的实际项目,具有较高的应用价值和参考性。而且这些案例分别使用不同的中间件实现,便于读者融会贯通地理解书中所讲解的相关理论知识。本书内容及知识体系第1篇 开发工具准备

本篇包括第1、2章,主要介绍了分布式系统架构的演进历程,并详细介绍了分布式中间件的重要性,重点介绍了常见中间件的功能特性、作用及其典型应用场景。除此之外,本篇还介绍了如何基于Spring Boot微服务框架搭建微服务项目,并系统地介绍了各种相关的开发工具。第2篇 开发实战

本篇包括第3~9章,是全书的核心,介绍了目前在构建分布式系统架构中经常使用的典型分布式中间件,包括缓存中间件Redis、消息中间件RabbitMQ、统一协调管理中间件ZooKeeper、综合中间件Redisson等。本篇在介绍完每个中间件的相关理论要点后,都给出了相应中间件在实际应用场景和业务模块中的实战案例,以充分巩固和加深读者对每个中间件的理解,从而提高实际的项目开发水平。第3篇 总结

本篇包括第10章,对全书内容做了总结,并对核心篇章,特别是对实际应用系统的设计、开发与实战等章节做了重点回顾,并对读者使用书中提供的样例代码提出了几点建议。配套资源获取方式

本书涉及的源代码文件及开发工具等配套资源需要读者自行下载。请在华章公司的网站www.hzbook.com上搜索到本书,然后单击“资料下载”按钮,即可在本书页面上找到“配书资源”下载链接,单击该链接即可下载。另外,读者也可以从Git仓库中下载这些资料,网址为https://gitee.com/steadyjack/middleware.git。适合阅读本书的读者

·需要全面学习分布式中间件技术的人员;

·Java和Java Web开发程序员;

·Java EE开发工程师;

·希望提高项目开发水平的开发人员;

·希望巩固和提升开发水平的系统架构师;

·需要一本案头必备查询手册的人员;

·相关专业的高校学生和社会培训学员。阅读本书的建议

·读者需要有一定的Java编程基础和Spring Boot微服务框架使用经验;

·有Java EE框架使用经验的读者可以根据实际情况有重点地选择阅读各个中间件及其案例;

·对于每个典型应用场景的实战案例,先自己思考一下实现的思路,然后再阅读,学习效果更好;

·先对各种中间件的应用场景做必要的了解和学习,然后再结合提供的案例源代码进行应用实战,理解起来更加容易,也更加深刻。本书作者

本书由钟林森主笔编写。作为一个Java后端工程师,作者曾任职于国内某知名互联网公司,担任开发组长,并长期活跃于CSDN和51CTO学院等技术社区,写作了大量原创博客,访问量达百万人次。作者还作为CSDN学院、网易云课堂等知名教育平台的讲师,授课学员超过万人。

由于作者水平所限,加之写作时间有限,书中可能还存在错漏和不严谨之处,恳请同行专家和各位读者不吝指正。您在阅读本书时若有疑问,请发电子邮件到hzbook2017@163.com。钟林森第1篇 开发工具准备

·第1章 走进分布式中间件

·第2章 搭建微服务项目第1章 走进分布式中间件

对于“分布式系统”,大多数初学者的第一感觉是遥不可及,犹如金庸先生的武侠小说中提及的“降龙十八掌”“独孤九剑”等武林绝学一般,虽然没有亲眼见过,但也应听过其大名。

分布式系统凭借其具有高吞吐、强扩展、高并发、低延迟及灵活部署等特点,大大促进了互联网的飞速发展,给企业带来了巨大的收益。而作为分布式系统中关键的组件——分布式中间件,也起到了必不可少的作用。它是一种独立的基础系统软件或者服务程序,处于操作系统软件与用户的应用软件中间,可作为独立的软件系统运转。

随着业务的发展和用户流量的上升,对互联网系统或者服务程序则提出了新的挑战,其中,高吞吐、高并发、强扩展、灵活部署及低延迟等俨然成为急需解决的需求!为此,作为枢纽的中间件也从“集中式”发展为“分布式”,如基于Redis的分布式缓存、基于RabbitMQ的分布式消息中间件、基于Elasticsearch的分布式全文搜索引擎、基于ZooKeeper的分布式锁等。

另外,作为一名IT行业的从业人员,在普通研发工程师到系统架构师的成长之路上,分布式中间件是绕不过去的。既然绕不过去,那还不如从现在开始认真地学习分布式中间件,也当作是自己职业生涯的一个成长轨迹。

本章的主要内容有:

·分布式系统概述、发展历程、特性及常见问题。

·分布式中间件概述、常见分布式中间件及其典型应用场景介绍。1.1 分布式系统概述

虽然“分布式系统”在初学者看来是多么的遥不可及,但当你接触过并实际掌握过分布式系统相关技术要点后,会发现分布式系统其实也很简单。回望分布式系统的发展历史,其出现并非一开始就是“分布式”的,而是随着业务的发展与用户访问量的上升,使得其应势而生,由此而带动了相关技术的发展。

本节我们将一起来认识“分布式系统”这一“庞然大物”,以及由此孕育的中间件的产生与发展。1.1.1 白话分布式系统

关于“分布式系统”的定义,说直白点,可以这样理解:

·分布式系统整体上来说比较强大,其内部至少由多台计算机组成,类似于一个统一的“机器中心”一样,背后由一组独立的计算机组成。

·对于用户来说,这个“机器中心”却像是单个相关系统一样,根本感觉不到计算机集群的存在。

从程序的角度来看,程序A与程序B分别运行在两台计算机上,它们相互协作完成同一个功能。从理论上讲,这两个程序所组成的系统,就可以称作是“分布式系统”。当然,这两个程序可以是不同的程序,也可以是相同的程序。如果是相同的程序,我们又可以称之为“集群”。1.1.2 分布式系统发展历程

在分布式系统出现之前,市面上几乎所有的软件系统都是集中式的,即所谓的单机系统。软件、硬件及各种组件高度耦合组成了单机架构。在很长一段时间内,这种架构着实起到了很大的作用,给企业带来了诸多收益。随着业务的发展及用户访问量的上升,这种系统架构也随之进行了演进。以Web应用为例,主要包含以下5个历程。1.单点集中式Web应用

早期很多中小型企业的大部分项目都是基于这样的架构,如图1.1所示。图1.1 分布式系统发展历程——单点集中式Web应用

单点集中式Web应用系统架构总体上来看还是比较简单的,一般以后台管理应用为主,比如CRM和OA系统等。这种系统架构有一个很明显的特点就是数据库(比如MySQL)及应用的War包都是共同部署在同一台服务器上,文件的上传存储也是上传到本台机器上。

单点集中式Web应用系统架构的优点是适用于小型项目,发布便捷(只需要打包成War包,并进行解压即可),对于运维的工作量也比较小。其缺点在于若是该台服务器宕机了,整个应用将无法访问。2.应用与文件服务及数据库单独拆分

随着时间的推移,数据库及文件的数据量越来越多,由于服务器的容量是有限的,原有系统架构已经不足以支撑,此时需要将Web应用、数据库、文件存储服务拆分出来作为独立的服务,以此来避免存储瓶颈,如图1.2所示。图1.2 分布式系统发展历程——应用与文件及数据库服务单独拆分

应用与文件服务及数据库单独拆分这种系统架构,一个明显的特点就是三个服务独立部署,不同服务器宕机了,其他的仍然可以使用。3.引入缓存与集群,改善系统整体性能

当请求并发量上去了,而单台Web服务器(比如Tomcat)不足以支撑应用的时候,此时我们会考虑引入缓存及集群,以改善系统的整体性能,此种系统架构如图1.3所示。

·引入缓存:把大量用户的读请求引导至缓存(如Redis)中,而写操作仍然直接写到数据库DB中。这点性能上的优化,可以将数据库的一部分数据或者系统经常需要访问的数据(如热点数据)放入缓存中,减少数据库的访问压力,提高用户并发请求性能。

·引入集群:目的在于减少单台服务器的压力。可以通过部署多台Tomcat来减少单机带来的压力,常见手段是Nginx+Lvs,最终是多台应用服务器构成了负载均衡,减少了单机的负载压力(需要注意的是,对于用户的Session需要调整为使用Redis或者Spring-Session进行管理)。图1.3 分布式系统发展历程——引入缓存与集群,改善系统整体性能4.数据库读写分离,并提供反向代理及CDN加速访问服务

经过调查发现,在大多数互联网应用系统中,用户的读请求数量往往大于写请求,它们会相互竞争,在这个时候往往写操作会受到影响,导致数据库出现存储瓶颈(可以参考春节抢票高峰期12306的访问情况)。因此会对数据库采取读写分离,从而提高数据库的存储性能。

除此之外,为了加速网站的访问速度,尤其是加速静态资源的访问,会将系统的大部分静态资源存放到CDN中,并加入反向代理的配置,从而减少访问网站时直接去服务器读取静态数据。

DB的读写分离将有效地提高数据库的存储性能,而加入CDN与反向代理将加速系统的访问速度,此种系统架构如图1.4所示。图1.4 分布式系统发展历程——数据库读写分离并提供反向代理及CDN加速访问服务5.分布式文件系统与分布式数据库

经过统计与监测,发现系统对于某些表有大量的请求,此时为了减少DB的压力,我们会进行分库分表,即根据业务来拆分数据库,此种系统架构如图1.5所示。图1.5 分布式系统发展历程——分布式文件系统与分布式数据库1.1.3 分布式系统特性

回顾分布式系统的发展历程会发现,在分布式系统出现之前,软件系统都是集中式的,俗称单机系统。在很长一段时期,单机系统通过不断升级“程序”或者相关硬件,就能满足不断增长的性能需求,然而,随着互联网的飞速发展,高吞吐、高并发、低延迟逐渐成为“刚需”,单凭“生硬”地不断升级已无能为力,于是分布式系统“应需求而生”。总的来说,分布式系统具有以下5个特性:

·内聚性和透明性:分布式系统是建立在网络之上的软件系统,所以具有高度的内聚性和透明性。

·可扩展性:分布式系统可以随着业务的增长动态扩展自己的系统组件,从而提高系统整体的处理能力。通常有两种方式:其一,优化系统的性能或者升级硬件,即垂直扩展;其二,增加计算单元(如服务器等)以扩展系统的规模,即水平扩展。

·可用与可靠性:说直白点,可靠性量化的指标是给定周期内系统无故障运行的平均时间,而可用性量化的指标是给定周期内系统无故障运行的总时间;一个是“平均”时间,一个是“总”时间。

·高性能:不管是单机系统还是分布式系统,性能始终是关键指标。不同的系统对性能的衡量指标是不同的,最常见的有“高并发”(即单位时间内处理的任务越多越好和“低延迟”(即每个任务的平均处理时间越少越好)。分布式系统的设计初衷便是利用更多的机器,实现更强大的计算和存储能力,即实现高性能。

·一致性:分布式系统为了提高可用性和可靠性,一般会引入冗余(副本)。为了保证这些节点上的状态一致,分布式系统必须解决一致性问题,其实就是在多个节点集群部署下,如何保证多个节点在给定的时间内,操作或者存储的数据只有一份。1.1.4 分布式系统常见问题

分布式系统虽然看似很强大,但是在实际的应用环境中,由于一些人为难以控制或者根本就不可控制的因素,导致系统整体上变得十分脆弱。典型的常见因素包括:1.网络并没有那么可靠

分布式系统中,节点间本质上是通过网络通信,而网络有些时候并没有那么可靠。常见的网络问题有网络延时、丢包和消息丢失等。2.节点故障无法避免

当分布式的节点数目达到一定规模后,整个系统出现故障的概率将变高。而分布式系统需要保证故障发生时,系统仍然是可用的,即在某个或者某些节点发生故障的情况下,需要将该节点所负责的计算和存储任务转移到其他节点。

总而言之,分布式系统在给互联网企业带来诸多好处之时,随之也带来了诸多挑战和不确定性,可谓是一把“双刃剑”。1.2 分布式中间件概述

作为分布式系统中必不可少的组件,分布式中间件在分布式系统的发展历程中起到了关键性的作用,特别是针对高并发、高吞吐、低延迟等普遍性的需求,在中间件层面能够得到很好的解决。

本节将介绍中间件的相关概念、常见的中间件及其常见的典型应用场景。1.2.1 白话分布式中间件

中间件是一种独立的基础系统软件或者服务程序,处于操作系统软件与用户的应用软件中间,具有很好的独立性,可作为独立的软件系统运转。

如果读者还不清楚什么是中间件,那么应该听说过Redis、RabbitMQ、ZooKeeper、Elasticsearch、Nginx中的一种吧,它们都是常用的中间件,可实现缓存、消息队列、分布式锁、全文搜索及负载均衡等功能。

而随着互联网的飞速发展,高吞吐、高并发、低延迟和负载均衡已成为普遍性的需求,因此,作为枢纽的中间件也从单点的“集中式”发展为“分布式”,如常见的基于Redis的分布式缓存、基于RabbitMQ的分布式消息中间件、基于ZooKeeper的分布式锁,以及基于Elasticsearch的全文搜索引擎等。1.2.2 常见中间件介绍

如前面所讲的,目前比较常见及常用的中间件包括Redis、Redisson、RabbitMQ、ZooKeeper、Elasticsearch、Kafka、Etcd和Nginx等。由于笔者阅历有限,本书将重点介绍Redis、Redisson、RabbitMQ及ZooKeeper这些中间件,其他的中间伴,感兴趣的读者可以在网上学习相关的技术要点。1.Redis简介

Redis是一个开源(BSD许可)的、基于内存存储、采用Key-Value(键值对)格式存储的内存数据库,支持多种数据类型,包括字符串、哈希表、列表、集合、有序集合和位图等。

本书我们将重点介绍Redis在“缓存”层面的相关技术要点,并采用典型的实际案例系统来实战Redis。2.Redisson简介

Redisson是“架设在Redis基础上的一个Java驻内存数据网络(In-Memory Data Grid)”,可以简单地理解为Redisson是Redis的一个升级版,它充分利用了Redis键值对数据库提供的一系列优势,为使用者提供了一系列具有分布式特性的常用工具类。

Redisson的出现使得原本作为协调单机多线程并发程序的工具包,获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度,同时也简化了分布式环境中程序相互之间的协作。

Redis在分布式系统应用过程中出现的问题,在Redisson这里能够得到很好的解决,比如关于分布式锁的处理,Redisson的处理方式则更为安全、稳定与高效。这在后面Redisson的实战章节中将有所介绍。3.RabbitMQ简介

RabbitMQ是一款应用相当广泛并开源的消息中间件,可用于实现消息异步分发、模块解耦、接口限流等功能。特别是在处理分布式系统高并发的业务场景时,RabbitMQ能够起到很好的作用,比如接口限流,从而降低应用服务器的压力;比如消息异步分发,从而降低系统的整体响应时间。

在后续的相关实战章节中,将会对RabbitMQ拥有的这些特性与功能进行详细介绍。4.ZooKeeper简介

ZooKeeper是一个开源的分布式应用程序协调服务,可以为分布式应用提供一致性服务,简称ZK。其提供的功能服务包括配置维护、域名服务、分布式同步等;提供的接口则包括分布式独享锁、选举、队列等。

在本书中,我们将介绍ZooKeeper的分布式锁在处理分布式系统中高并发出现的并发问题。1.3 本书核心知识要点

本书着重介绍目前比较流行的中间件及其相关技术要点。书中首先会讲解中间件的相关基础概念,让读者对其有初步的认识,之后会采用实际的典型应用案例“实战”中间件,真正地将中间件应用到实际的业务场景中,从而让读者掌握中间件的核心技术及实际应用场景!

工欲善其事,必先利其器。在“实战”本书相关技术要点之前,笔者首先会带领读者采用目前比较流行的微服务框架Spring Boot搭建企业级的微服务项目,然后一步一步地引入中间件的配置与相关依赖,从而实战相关的技术要点。“首当其冲”的中间件是分布式缓存中间件Redis。本书将会介绍Redis的相关基础概念、安装与简单用法,以代码“实战”Redis支持的各种常见数据类型,并以目前两个典型的业务场景“缓存穿透”与“缓存雪崩”,巩固读者对Redis相关知识点的理解,最后以典型的案例“抢红包设计与实战”,带领读者体验Redis在实际项目中的应用。

接着会介绍目前应用相当广泛的分布式消息中间件RabbitMQ。本书将会介绍RabbitMQ的相关基础概念、作用及常见的业务场景,认识RabbitMQ涉及的相关专用词汇,以实际代码“实战”RabbitMQ的几种消息模型,并掌握如何采用RabbitTemplate组件发送消息、采用@RabbitListener接受消息等,最后以典型的应用场景“用户操作异步写日志”实战案例,巩固RabbitMQ的相关知识点。

在某些业务场景下,需要实现“延时、延迟发送文件或者消息”等功能,此时RabbitMQ的死信队列即可搬上用场。本书将会介绍RabbitMQ死信队列的相关基础概念、作用及常见的应用场景,认识死信队列DLX、DLK和TTL等相关专用名词,并以实例实现死信队列的消息模型,最后以典型应用场景“商城平台用户支付超时”为案例进行巩固。

介绍完Redis与RabbitMQ后,本书将通过一个案例,即采用Redis和RabbitMQ的典型应用场景“商城系统高并发抢单”,介绍商城高并发抢单的整体业务流程,以及如何采用Redis和RabbitMQ的相关技术实现高并发抢单的核心业务逻辑。

在分布式系统中,“高并发”所产生的诸多问题是很常见的,其中比较典型的问题在于高并发抢占共享资源而导致并发安全的问题。为了解决这个问题,本书采用一章的篇幅介绍了分布式锁,包括其相关概念、作用与常见的应用场景,并以实际的典型应用场景“秒杀系统设计与实战”为案例驱动,以多种实现方式(数据库乐观锁/悲观锁、Redis原子操作、ZooKeeper分布式锁及Redisson分布式锁)配备实际代码实现分布式锁。“打铁需趁热”本书将用一章的篇幅介绍Redisson及其分布式锁,包括其相关基础概念和作用,以实际的应用场景“高性能点赞和评论模块设计与实战”为案例驱动,带领读者对该案例展开业务流程分析,进行数据库表设计及项目的整合搭建,最终以代码的形式实现高性能的点赞与评论功能。1.4 本书实战要求与建议“师父领进门,修行靠个人”。在笔者带领各位读者步入中间件的殿堂之后,后续的巩固提升及代码实战就得靠自己了!在这里给大家提几点实战方面的要求与建议。(1)读者须具备Java及Spring Boot方面的相关基础知识,因为本书的实战代码以微框架Spring Boot为奠基整合相关依赖,从而实现中间件的相关技术要点。(2)读者需在自己的开发机器上安装最基本的软件,如JDK(1.7或者1.8版均可)、MySQL(5.6或者5.7版均可)、Maven(3.3.x版本或者更高版本均可)等,毕竟要进入代码实战,这些可以说是最基本的要求了(笔者采用的是JDK 1.8,MySQL 5.6、Maven 3.3.9)。(3)由于本书的大部分篇章采用代码实战及实际的案例为驱动,因而强烈建议读者一定要多动手、多写代码,只有代码写多了,才能知道可能会出现的问题及如何解决这些问题,才能将所学之物转化为自己的经验。(4)最后一点是笔者总结的7个词:沉下心、坚持、多动手、多反思、多做笔记、享受代码、享受Bug。

最后,衷心地希望这本书能给你打开一扇通往系统架构师的大门!第2章 搭建微服务项目

在开始实战分布式中间件之前,我们需要准备相关的开发工具、软件及核心框架。其中,典型的开发工具包括Intellij IDEA、Navicat Premium及Postman等,开发软件包括JDK、Maven和MySQL等,核心框架则有很多。本书将采用当前比较流行的微框架Spring Boot作为核心的开发组件,一步一个脚印带领各位读者搭建微服务项目,一起“实战”分布式中间件。

本章的主要内容有:

·简述Spring Boot,包括Spring Boot的优势及特性。

·介绍微服务项目的搭建规范及搭建流程。

·基于搭建的微服务项目进行测试。2.1 Spring Boot概述

Spring Boot是由Pivotal团队提供的全新框架,是Spring家族中的一个成员,业界称为“微框架”,可用于快速开发扩展性强、微而小的项目。毋庸置疑,Spring Boot的诞生不仅给传统的企业级项目与系统架构带来了全面改进及升级的可能,同时也给Java界的程序员带来了诸多好处,可谓是Java程序员界的一大“福音”。

从本节开始,我们将一起学习Spring Boot,包括其相关概念、特性及优势,一起了解Spring Boot在开发层面给开发者带来了哪些便捷。2.1.1 什么是Spring Boot

顾名思义,Spring Boot是Spring“全家桶”中的一员,其设计目的是用来简化Spring应用中烦琐的搭建及开发过程,它只需要使用极少的配置,就可以快速得到一个正常运行的应用程序,开发人员从此不再需要定义样板化的配置!

而实际上,对于像笔者这样拥有多年Spring Boot实战经验的Java程序员而言,Spring Boot其实并不能称为“新框架”,它只是默认配置了很多常用框架的使用方式(这在后文会提及,称为“起步依赖”),就像一个Maven项目的Pom.xml整合了所有的jar包一样,Spring Boot整合了常用的、大部分的框架(包括它们的使用方式以及常用配置)。

可以说,Spring Boot的诞生给企业“快速”开发微而小的项目提供了可能,同时也给传统系统架构的改进及升级带来了诸多方便。而随着近几年互联网经济的快速发展、微服务和分布式系统架构的流行,Spring Boot的到来使得Java项目的开发变得更为简单、方便和快速,极大地提高了开发和部署效率,同时也给企业带来了诸多收益。2.1.2 Spring Boot的优势

Spring Boot作为广大Java程序员偏爱的微框架,着实给程序员的开发带来了诸多福利,特别是在改进传统Spring应用的烦琐搭建及开发上做出了巨大的贡献。概括性地讲,Spring Boot给开发者带来的便捷主要有以下几点:

·从搭建的角度看,Spring Boot可以帮助开发者快速搭建企业级应用,借助开发工具如IntelliJ IDEA,几乎只需要几个步骤就能简单地构建一个项目。

·从整合第三方框架的角度看,传统的Spring应用如果需要整合第三方框架,则需要加入大量的XML配置文件,并配置很多晦涩难懂的参数;而对于Spring Boot而言,只需要加入Spring Boot内置的针对第三方框架的“起步依赖”,即内置的jar包即可,不再需要编写大量的样板代码、注释与XML配置。

·从项目运行的角度看,Spring Boot由于内嵌了Servlet容器(如Tomcat),其搭建的项目可以直接打成jar包,并在安装有Java运行环境的机器上采用java–jar xxx.jar的命令直接运行,省去了额外安装及配置Servlet容器的步骤,可以说是非常方便。而且,Spring Boot还能对运行中的应用进行状态监控。

·从开发与部署的角度看,Spring Boot相对于Spring搭建的项目代码和配置文件更少,不再需要对第三方框架的配置而“烦恼”了。项目整体上来看也更加精简,扩展性也变得更强,对于整个团队的开发和维护来说,更大程度地节约了成本。

·由于Spring Boot是Spring家族中的一员,所以对于Spring Boot应用而言,其与Spring生态系统如Spring ORM、Spring JDBC、Spring Data、Spring Security等的集成非常方便、容易;再加上Spring Boot的设计者崇尚“习惯大于配置”的理念,使得Spring Boot应用集成主流框架及Spring生态系统时极为方便、快速,开发者可以更加专注于应用本身的业务逻辑。

总体来说,Spring Boot的出现使得项目从此不再需要诸多烦琐的XML配置及重复性的样板代码,整合第三方框架及集成Spring生态系统时变得更加简单与方便,大大提高了开发效率。2.1.3 Spring Boot的几大特性

Spring Boot的诞生着实给传统的企业级Spring应用带来了许多好处,特别是在应用的扩展及系统架构的升级上带来了强有力的帮助。概括性地讲,Spring Boot在目前应用开发中具有以下4个优势:

·编码更加简单;

·简化了配置;

·部署更加便捷;

·应用的监控变得更加简单和方便。

而Spring Boot带来的这些优势主要还是源于其“天生”具有的特性。总的来说,其具有以下几点特性:

·Spring Boot遵循“习惯优于配置”的理念,即使用Spring Boot开发项目时,我们只需要使用很少的配置,大多数使用默认配置即可。

·Spring Boot可以帮助开发者快速搭建应用,并自动整合主流框架和大部分的第三方框架,即“自动装配”。

·应用可以不需要使用XML配置,而只需要自动配置和采用Java Config配置相关组件即可。

·Spring Boot可以采用内置的Servlet容器,并采用简单的命令直接执行项目,可以不需要借助外置的容器如Tomcat而运行。

·整合大部分的第三方框架或主流框架时,只需要直接引入Spring Boot内置的Start Jar即可,这个特性称为“起步依赖”,可以很方便地进行包管理。

·Spring Boot内置了监控组件Actuator,只需要引入相应的起步依赖,就可以基于HTTP、SSH和Telnet等方式对运行中的应用进行监控。

而随着Pivotal团队对于Spring Boot的不断升级、优化,目前其版本也由1.x版本升级到了2.x版本,所拥有的特性及优势也不断增加。但是不管怎么优化、升级,笔者相信Spring Boot的几个特性会一直保留着,因为这对于开发者及企业应用系统而言都是强有力的助手,而这些特性在后续搭建微服务Spring Boot项目时将一点点地体现出来。2.2 搭建规范与搭建流程

从本节开始,我们将借助IntelliJ IDEA开发工具搭建微服务Spring Boot项目,并应用于后续章节的中间件相关技术要点的实例中。而在介绍实际生产环境中微服务项目的搭建流程之前,先来了解一下搭建微服务项目的规范。2.2.1 Spring Boot项目搭建规范

规范化的搭建微服务项目将有助于团队开发、维护及对代码的理解。对于项目的整体目录结构如果规划设计得当,将有助于管理整个应用涉及的Java对象,甚至可以通过实际的业务模块直截了当地找到项目某个具体Java对象的位置。

目前应用比较广泛的项目搭建规范主要是“基于Maven构建多模块”的方式,这种方式搭建的每个模块各司其职,负责应用的不同功能,同时每个模块采用层级依赖的方式,最终构成一个聚合型的Maven项目。如图2.1所示为搭建微服务Spring Boot多模块项目的经典模式图。图2.1 搭建微服务Spring Boot多模块项目的经典模式

图2.1中,“父模块”聚合了多个子模块,包括api、model及server模块(当然在实际项目中可以有更多的模块,而且模块的命名可以有所不同)。这3个模块的依赖层级关系为:server依赖model,model依赖api,最终构成了典型的Maven聚合型多模块项目。

每个模块的作用在图2.1中已经有所介绍,在这里就不再赘述。我们将在下一节Spring Boot多模块项目的搭建流程中体现出来。2.2.2 Spring Boot项目搭建流程

按照图2.1中介绍的微服务Spring Boot项目搭建规范图,本节我们将借助IntelliJ IDEA开发工具搭建一个多模块的Maven聚合型项目。(1)打开开发工具IntelliJ IDEA,然后选择File菜单下的New→New Project命令,即创建新项目的命令,如图2.2与图2.3所示。图2.2 Spring Boot项目搭建流程1图2.3 Spring Boot项目搭建流程2(2)单击图2.3中的Next按钮,进入Maven多模块项目的命名界面,如图2.4所示。这里笔者建议Maven坐标的命名尽量简洁、规范。图2.4 Spring Boot项目搭建流程3(3)单击Next按钮进入下一步,选择项目的存储目录。这里笔者建议存储的文件目录中不要含有中文或者其他特殊符号,如图2.5所示。图2.5 Spring Boot项目搭建流程4(4)单击Finish按钮,如果项目的存储目录是新建的,则会弹出一个对话框,询问是否创建一个新的文件目录,这里只需要单击OK按钮即可,如图2.6所示。图2.6 Spring Boot项目搭建流程5(5)进入项目的初始界面,这个pom.xml即为父模块的依赖配置文件,这里我们指定整个项目资源的编码及项目编译时采用的JDK版本,如图2.7所示。

其中,图2.7中所示的项目整体资源编码及JDK版本的配置信息如下: UTF-8 1.8 ${java.version} ${java.version}图2.7 Spring Boot项目的搭建流程6(6)开始创建各个子模块及每个子模块最基本的一些依赖配置信息。首先是创建子模块api,然后直接单击Next按钮,命名子模块为api,最终单击Finish按钮即可,具体操作如图2.8、2.9、2.10所示。图2.8 Spring Boot项目搭建流程7图2.9 Spring Boot项目搭建流程8图2.10 Spring Boot项目搭建流程9(7)最终即可成功创建子模块api,并自动初始化生成相应的配置信息。这里我们加入整个项目都将共用的依赖配置,即Lombok与Jackson解析依赖,如图2.11所示。图2.11 Spring Boot项目搭建流程10

在图2.11中,pom.xml加入的项目整体公用依赖配置信息如下: 1.16.10 2.6.5 org.projectlombok lombok ${lombok.version} com.fasterxml.jackson.core jackson-annotations ${jackson-annotations-version} compile (8)按照上面创建api子模块的步骤,同样,也可以用于创建子模块model。右击项目,选择右键快捷菜单New命令,创建子模块model,并添加api子模块及Spring-MyBatis依赖,具体操作如图2.12与图2.13所示。图2.12 Spring Boot项目搭建流程11图2.13 Spring Boot项目搭建流程12

其中,子模块model添加的依赖配置信息如下: 1.1.1 4.1.2 com.debug.middleware api ${project.parent.version} org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis-spring-boot.version} (9)按照同样的方式创建最后一个模块,即核心的server模块。可以说一个项目或者服务的大部分业务逻辑代码都将在这个模块中完成。最终新建完成的server模块如图2.14所示。图2.14 Spring Boot项目搭建流程13

其中,在server模块中加入的相关依赖包括Spring Boot依赖,日志log4j及MySQL、Druid等最基本的依赖配置。详细信息如下: middleware com.debug.middleware 1.0.1 4.0.0 server jar com.debug.middleware.server.MainApplication 1.3.3.RELEASE 1.2.0.RELEASE 5.1.37 1.0.16 19.0 org.springframework.boot spring-boot-dependencies ${spring-boot.version} pom import org.springframework.boot spring-boot-starter-log4j com.debug.middleware model ${project.parent.version} com.google.guava guava ${guava.version} mysql mysql-connector-java ${mysql.version} com.alibaba druid ${druid.version} org.springframework.boot spring-boot-starter-web ${spring-boot.version} ch.qos.logback logback-classic org.slf4j log4j-over-slf4j org.springframework.boot spring-boot-starter-test test book_middleware_${project.parent.version} org.springframework.boot spring-boot-maven-plugin ${spring-boot.version} repackage org.apache.maven.plugins maven-war-plugin 2.4 false src/main/resources true (10)至此,项目的各个模块已经初步搭建好了。其中,在server模块中指定了整个项目的启动类(也称为应用的入口)MainApplication。为了能使用Spring Boot内置容器将整个项目“跑”起来,需要对MainApplication进行“改造”。改造后的代码如下:package com.debug.middleware.server;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.builder.SpringApplicationBuilder;import org.springframework.boot.context.web.SpringBootServletInitializer;@SpringBootApplicationpublic class MainApplication extends SpringBootServletInitializer{ @Override protected SpringApplicationBuilder configure(SpringApplicationBuilderbuilder) { return super.configure(builder); } public static void main(String[] args) { SpringApplication.run(MainApplication.class,args); }}

其中,注解“@SpringBootApplication”用于表示被注解的类为整个应用的入口启动类,到时候只需要单击该类左边的运行按钮,即可将整个应用运行起来。(11)为了能将项目最终发布为完整的服务,我们为项目引入application.properties配置文件,并将其放置在server模块的resources目录下(后续应用相关的配置文件将置于此目录);同时采用Navicat Premium在本地创建一个没有任何表的数据库db_middleware,并将其相关配置信息配置在application.properties中。最终application.properties的初步配置信息如下:#profile#spring.profiles.active=productions#spring.profiles.active=local#指定应用访问的上下文及端口server.context-path=/middlewareserver.port=8087#logging日志配置logging.path=/srv/dubbo/middleware/logslogging.file=middlewarelogging.level.org.springframework = INFOlogging.level.com.fasterxml.jackson = INFOlogging.level.com.debug.middleware = DEBUG#json日期格式化spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.jackson.time-zone=GMT+8spring.datasource.initialize=falsespring.jmx.enabled=false#数据库访问配置spring.datasource.url=jdbc:mysql://localhost:3306/db_middleware?useUnicode=true&characterEncoding=utf-8spring.datasource.username=rootspring.datasource.password=linsen#MyBatis配置mybatis.config-location=classpath:mybatis-config.xmlmybatis.checkConfigLocation = truemybatis.mapper-locations=classpath:mappers/*.xml(12)在上面的application.properties配置文件中,我们引入了半ORM(对象实体映射)框架MyBatis的配置文件mybatis-config.xml,这个文件可以通过右击resources目录,然后选择New→mybatis-config命令来创建。配置内容如下:
(13)为应用引入日志配置文件log4j.properties作为整个应用的日志记录,其内容配置如下:#Console Loglog4j.rootLogger=INFO,console,debug,info,warn,errorLOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - %5p [%t] ---%c{1}: %m%n#打印日志到Consolelog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.Threshold=DEBUGlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=${LOG_PATTERN}log4j.appender.info=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.info.Threshold=INFOlog4j.appender.info.File=${LOG_PATH}/${LOG_FILE}_info.loglog4j.appender.info.DatePattern='.'yyyy-MM-ddlog4j.appender.info.layout = org.apache.log4j.PatternLayoutlog4j.appender.info.layout.ConversionPattern=${LOG_PATTERN}log4j.appender.error=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.error.Threshold=ERRORlog4j.appender.error.File=${LOG_PATH}/${LOG_FILE}_error.loglog4j.appender.error.DatePattern='.'yyyy-MM-ddlog4j.appender.error.layout = org.apache.log4j.PatternLayoutlog4j.appender.error.layout.ConversionPattern=${LOG_PATTERN}log4j.appender.debug=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.debug.Threshold=DEBUGlog4j.appender.debug.File=${LOG_PATH}/${LOG_FILE}_debug.loglog4j.appender.debug.DatePattern='.'yyyy-MM-ddlog4j.appender.debug.layout = org.apache.log4j.PatternLayoutlog4j.appender.debug.layout.ConversionPattern=${LOG_PATTERN}log4j.appender.warn=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.warn.Threshold=WARNlog4j.appender.warn.File=${LOG_PATH}/${LOG_FILE}_warn.loglog4j.appender.warn.DatePattern='.'yyyy-MM-ddlog4j.appender.warn.layout = org.apache.log4j.PatternLayoutlog4j.appender.warn.layout.ConversionPattern=${LOG_PATTERN}(14)最终server模块下resources目录的配置文件包含了3个核心文件:项目配置文件application.properties、日志配置文件log4j.properties及MyBatis配置文件mybatis-config.xml,如图2.15所示。

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

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?