版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章
认识微服务架构《微服务架构基础(SpringBoot+SpringCloud+Docker)(第2版)》学习目标/Target了解系统架构的演变,能够简述单体应用架构、垂直应用架构、SOA的特点了解并能够简述微服务架构的特点熟悉微服务架构中与服务治理相关的常见概念,能够简述微服务架构中的服务注册与发现、服务调用、负载均衡、API网关、服务容错和链路追踪等概念了解微服务架构的常见相关技术,能够简述搭建微服务系统的常见技术章节概述/Summary随着社会进步和科技发展,人们对应用程序的需求不断增加。面对日益复杂的业务需求,如何降低业务之间的耦合性、快速部署项目、轻松且持续改进项目是应用程序急需解决的问题。为了解决这些问题,微服务架构应运而生,本章将引领读者深入认识微服务架构。目录/Contents1.11.2系统架构的演变微服务架构的特点1.3服务架构中与服务治理相关的常见概念1.4微服务架构的常见相关技术系统架构的演变1.11.1系统架构的演变先定一个小目标!
先定一个小目标!了解系统架构的演变,能够简述单体应用架构、垂直应用架构、SOA的特点1.1系统架构的演变系统架构是指一个系统的组织结构或设计,其定义了系统的组件、模块、接口等,在系统中起到指导和约束的作用。随着互联网的飞速发展和技术的日益演进,系统架构也在不断演变。从最初的单体应用架构,到如今广受欢迎的微服务架构,系统架构一直在探求创新,以提高系统的可扩展性、可维护性和可用性,以应对业务需求和用户体验的不断变化。下将对系统架构的演变进行讲解。1.1系统架构的演变单体应用架构指的是将所有服务或者功能都封装在一个应用中的架构,即应用程序所有业务场景的表示层、业务逻辑层和数据访问层都在一个工程中进行开发、部署和运行。在单体应用架构中,应用程序的各个模块通过方法调用或共享内存等方式进行通信,通常共享相同的数据库,应用程序的逻辑和数据都集中在一起。单体应用架构1.1系统架构的演变1.1系统架构的演变优点项目架构简单,技术结构单一,周期短,前期用人成本低。缺点代码可读性、可维护性和可扩展性下降。系统性能扩展只能通过扩展集群结点。应用中的任何一个bug都有可能导致整个系统宕机。1.1系统架构的演变垂直应用架构是一种将应用程序按照业务逻辑或模块进行分解和设计的架构,它将单体应用拆分成若干个独立的小应用,每个小应用单独部署到不同的服务器上,以提升效率。垂直应用架构1.1系统架构的演变1.1系统架构的演变优点拆分成多个应用,分别部署到不同的服务器,减轻服务器压力。对独立的Web应用可以单独进行优化,方便水平扩展,提高容错率。缺点系统之间相互独立,无法直接进行相互调用。不同的系统可能存在重复的开发任务,出现数据冗余、代码冗余、功能冗余等问题。1.1系统架构的演变SOA(Service-OrientedArchitecture,面向服务的体系结构)是一个组件模型,基于SOA可以将系统不同功能单元拆分成独立的服务,这些服务之间通过定义良好的接口和契约进行联系,可以根据需求通过网络对松散耦合的粗粒度应用组件(服务)进行分布式部署、组合和使用,从而更加灵活、高效地实现服务的设计、开发、部署和管理。SOA1.1系统架构的演变1.1系统架构的演变优点基于SOA的应用各个服务之间的耦合度较低,可读性及可维护性比较好。缺点抽取服务的粒度较大,服务提供方与调用方接口耦合度较高,调用关系错综复杂。1.1系统架构的演变微服务架构是当前较为流行的系统架构之一,它提倡将一个大型、复杂的应用系统拆分成多个独立的小型服务,每个服务都可以独立构建、部署、运行、扩展和维护。服务之间通过轻量级的通信机制协同工作,最终组成一个完整的应用系统。微服务架构在某种程度上是面向服务的架构SOA继续发展的下一步,微服务架构更加强调服务的彻底拆分。微服务架构1.1系统架构的演变1.1系统架构的演变优点通过服务的原子化拆分,每个服务可以独立打包、部署和升级,小团队的交付周期将缩短,运维成本也将大幅度下降。缺点对技术成本高,需要解决系统的容错、分布式事务等问题。如果微服务过多,会造成服务管理成本提高,不利于系统维护,服务拆分粒度过细也会导致系统变得凌乱。微服务架构的特点1.21.2微服务架构的特点先定一个小目标!
先定一个小目标!了解并能够简述微服务架构的特点1.2微服务架构的特点微服务架构能够成为目前主流的架构之一,主要得益于它如下的特点。复杂度可控每个服务专注于特定的业务功能,每个服务的代码库更小,复杂度更低,更容易进行维护。便于部署和维护由于每个模块只关注自身的功能,修改时只需要关注相关模块。技术选型灵活允许开发人员根据项目业务需求和团队特点,选择不同的编程语言和工具进行开发和部署。易于扩展扩展新功能只需要新建一个对应的独立数据库和新的模块,不需要在现有模块上进行修改。容错性高故障会被隔离在单个服务中,其他服务可以继续正常运行,不会受到故障的影响。微服务架构中与服务治理相关的常见概念1.31.3微服务架构中与服务治理相关的常见概念先定一个小目标!
先定一个小目标!熟悉微服务架构中与服务治理相关的常见概念,能够简述微服务架构中的服务注册与发现、服务调用、负载均衡、API网关、服务容错和链路追踪等概念1.3微服务架构中与服务治理相关的常见概念微服务架构的主要目的是实现服务的解耦。随着系统业务的日趋复杂,使得服务之间的调用关系变得越来越复杂。同时,服务之间的远程通信也会因为存在网络通信问题而变得更加复杂。针对这种情况,需要在微服务架构中进行服务治理,以简化服务之间的通信关系,提高整体系统的可靠性和稳定性。1.3微服务架构中与服务治理相关的常见概念服务注册中心:微服务架构中的一个独立组件,它动态地维护着所有可用服务实例的地址、最新状态等信息,并提供服务注册、服务发现、健康检查、负载均衡等功能。服务注册:指服务将自身的关键信息(如服务名称、地址、版本等)注册到服务注册中心,是微服务架构中实现服务发现和服务之间通信的基础。服务发现:指服务实例在需要与其他服务通信时,通过服务注册中心动态地找到对应服务的信息,并通过这些信息请求所提供的服务。1.服务注册与发现1.3微服务架构中与服务治理相关的常见概念目前主流的远程调用技术包括基于HTTP的RESTful接口和基于TCP的RPC机制。REST(RepresentationalStateTransfer,表述性状态转移)是一种基于HTTP调用的标准化格式,可以通过标准的HTTP方法进行调用,有良好的查错机制,尤其适合在跨域调用时使用。RESTful是指遵循REST风格的Web服务,可以使得客户端和服务器之间的交互更加简单、直观。RPC(RemoteProcedureCalls,远程过程调用)协议是一种进程间通信方式,可以让远程服务调用像调用本地服务一样简单和透明。2.服务调用1.3微服务架构中与服务治理相关的常见概念负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分配到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。在微服务架构中,因为服务之间的负载大小可能不同,如果不通过合理的分配负载到各个服务实例中,能导致某些服务实例过载而引发服务性能下降、错误率增加、连锁故障等问题,甚至可能引起整个系统的崩溃。3.负载均衡1.3微服务架构中与服务治理相关的常见概念微服务架构中不同的服务一般会有不同的网络地址,随着业务的新增,系统中的服务日趋增多,外部客户端调用不同微服务的接口可能会面临以下问题。客户端需要调用多个不同的网络地址,增加难度。在某些场景下,可能存在跨域请求问题。每个微服务都需要单独进行身份认证。4.API网关1.3微服务架构中与服务治理相关的常见概念API网关的基本功能包括统一接入、安全防护、协议适配、流量管控、长短链接支持和容错能力等,它可以将所有API调用统一接入到API网关层,由API网关统一接入和输出,各个API服务提供团队就可以专注于自己的业务逻辑处理。4.API网关1.3微服务架构中与服务治理相关的常见概念1.3微服务架构中与服务治理相关的常见概念在微服务架构中,一个请求往往需要调用多个服务,若其中的某个服务不可用,在没有做服务容错的情况下,有可能会导致一连串服务不可用,从而引发服务雪崩现象,而服务容错就是确保系统在出现服务故障时,能够具备自我修复和自我保护的能力。可采用多种技术手段,如重试机制、熔断机制、限流机制、降级机制等来实现服务容错,以确保系统具备高可用性和稳定性。5.服务容错1.3微服务架构中与服务治理相关的常见概念在微服务架构中,由于服务之间的相互调用和依赖关系十分复杂,一旦出现故障或异常,排查问题可能非常困难。通过链路追踪,可以对服务调用链进行跟踪和监测,以快速定位和解决潜在的问题,提高服务的运行效率和可靠性。6.链路追踪微服务架构的常见相关技术1.41.4
微服务架构的常见相关技术先定一个小目标!
先定一个小目标!了解微服务架构的常见相关技术,能够简述搭建微服务系统的常见技术1.4
微服务架构的常见相关技术想要真正地搭建一个微服务架构的项目,则需要采用具体的技术。随着微服务逐渐的流行,很多公司相继推出了微服务架构的相关技术,其中常见的技术如下。1.服务开发框架为了快速搭建微服务架构的项目,可以使用服务开发框架,常见的服务开发框架有SpringBoot和Dropwizard等。2.服务注册与发现为了实现服务之间的通信和发现,可以使用服务注册与发现机制。常见的服务注册与发现技术包括SpringCloudEureka、Consul、SpringCloudAlibabaNacos等。3.负载均衡为了将负载均匀分配到多个服务实例,提高系统的稳定性和可靠性,可以使用负载均衡技术,常见的负载均衡技术有SpringCloudRibbon、SpringCloudLoadBalancer和Dubbo等。1.4
微服务架构的常见相关技术4.服务容错为了提高系统的可用性和容错能力,可以使用服务容错技术,常见的服务容错技术有Sentinel、Hystrix和Resilience4j等。5.API网关为了将所有服务接口进行统一管理,并实现统一的路由和访问控制,可以使用API网关,常见的API网关技术包括SpringCloudGateway、Kong等。6.分布式配置中心为了集中管理微服务架构中的配置,减少配置修改的时间和风险,可以是需要分布式配置中心,常见的分布式配置中心有SpringCloudConfig、Apollo和SpringCloudAlibabaNacos等。
1.4
微服务架构的常见相关技术7.分布式链路追踪为了准确追踪微服务架构中请求在多个微服务之间传递时的路由路径、潜在的性能和耗时等问题,可以使用分布式链路追踪技术,常见的分布式链路追踪技术有Zipkin、SkyWalking和SpringCloudSleuth等。8.分布式事务管理为了在分布式环境下解决数据一致性的问题,可以使用分布式事务管理,常见的分布式事务解决方案有Seata。9.部署在微服务的官方文档中,推荐使用Docker来打包和部署微服务。Docker是一个开源的应用容器引擎,它允许开发者将应用及其依赖项打包成标准化的可移植容器,然后发布到主流的操作系统中。1.4
微服务架构的常见相关技术10.持续集成持续集成通过自动化构建、测试和部署流程,确保每次代码更改都能快速集成到主分支中,并及时进行验证,减少了集成过程中可能出现的冲突和问题,提高了开发效率。Jenkins是一个当前广泛使用的持续集成工具,它为实现持续集成提供了强大的支持。本章小结本章主要介绍了微服务架构。首先讲解了系统架构的演变;然后讲解了微服务架构的特点;接着讲解了微服务架构中与服务治理相关的常见概念;最后讲解了微服务架构的常见相关技术。通过本章的学习,读者可以对微服务架构有初步认识,为后续学习微服务架构奠定基础。本章小结第2章SpringBoot开发入门《微服务架构基础(SpringBoot+SpringCloud+Docker)(第2版)》学习目标/Target了解SpringBoot概述,能够简述SpringBoot诞生的背景了解并能够简述SpringBoot的特性熟悉SpringBoot原理,能够简述SpringBoot起步依赖、自动配置和执行流程的原理学习目标/Target掌握SpringBoot入门案例,能够使用SpringInitializr方式和Maven方式构建SpringBoot项目掌握在全局配置文件中配置数据的方法,能够在perties配置文件和application.yml配置文件中正确配置数据掌握配置绑定方式,能够通过@Value注解和@ConfigurationProperties注解绑定配置文件中的信息章节概述/SummarySpring框架中的IoC容器可以对组件进行管理,但是为了管理容器中的组件,使用Spring搭建JavaEE应用程序时往往需要进行大量的配置或注解工作,这些工作都属于项目的基础搭建工作,通常与业务功能无关,不熟悉搭建过程的人员在配置时很容易出错。为了简化Spring应用的搭建和配置过程,SpringBoot应运而生。SpringBoot是一个基于Spring的全新开源框架,它可以简化Spring应用的初始搭建和配置过程,使用更加简单,功能更加丰富。本章将从SpringBoot开发入门入手,带领大家正式进入SpringBoot框架的学习。目录/Contents2.12.2SpringBoot概述SpringBoot入门案例2.3SpringBoot原理解析2.4SpringBoot配置SpringBoot概述2.12.1.1
SpringBoot简介先定一个小目标!
先定一个小目标!了解SpringBoot概述,能够简述SpringBoot诞生的背景2.1.1
SpringBoot简介在SpringBoot框架出现之前,JavaEE最常用的框架是Spring。Spring是轻量级的Java开源框架,旨在简化Java企业级开发。Spring框架是轻量级的,但它的配置是重量级的。早期版本的Spring专注于XML配置,开发一个程序需要配置各种XML配置文件。在Spring中使用注解开发逐渐称为了主流。SpringSpring4.x基本可以脱离XML配置文件进行项目开发。2.1.1
SpringBoot简介Pivotal团队在原有Spring框架的基础上通过注解的方式进一步简化了Spring框架的使用,并在2014年4月正式推出了基于Spring框架的全新框架—SpringBoot。2.1.1
SpringBoot简介提升Spring开发者体验的工具SpringBoot并不是替代Spring框架的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。构建Spring项目SpringBoot框架本身并不提供Spring框架的核心特性以及扩展功能,它只是使构建Spring应用变得简单。开箱即用SpringBoot集成了大量常用的第三方库配置,使用SpringBoot开发程序时,几乎是开箱即用。约定优于配置开发过程中大量使用约定优于配置的思想来摆脱Spring框架中各种复杂的手动配置。SpringBoot2.1.1
SpringBoot简介随着近几年微服务开发的需求增长和火爆,如何快速、简便地构建一个准生产环境的Spring应用成为摆在开发者面前的难题,SpringBoot框架的出现恰好完美解决了这些问题,同时内部还简化了许多常用的第三方库配置,使微服务开发更加便利,这也间接体现了SpringBoot框架的优势和学习SpringBoot的必要性。2.1.2
SpringBoot的特性先定一个小目标!
先定一个小目标!了解并能够简述SpringBoot的特性2.1.2
SpringBoot的特性4.提供大量的自动化配置类。6.基本无须额外生成配置代码和XML配置文件。5.提供生产就绪功能。1.可快速构建独立的Spring应用。3.提供固化的“启动器依赖,简化构建配置。2.内嵌Tomcat、Jetty和Undertow等Web容器,无须将项目打包成WAR文件。SpringBoot的特性SpringBoot入门案例2.22.2.1环境搭建先定一个小目标!
先定一个小目标!掌握SpringBoot入门案例环境准备,能够独立搭建SpringBoot入门案例所需要准备的环境2.2.1环境搭建本书所使用的SpringBoot版本为3.1.4。SpringBoot3.1.4依赖SpringFramework6.0.12,而运行SpringFramework6.0.12需要JDK17及以上版本进行支撑,本书选择使用本书出版时使用较为广泛并运行较为稳定的JDK17。1.JDKSpringBoot3.1.4官方声明支持的项目构建工具包括Maven和Gradle,其中Maven的版本需要3.6.3及以上版本,Gradle的版本需要7.5及以上版本。本书将采用Maven3.6.3对SpringBoot进行项目构建管理。2.项目构建工具业界较为常用有Eclipse和IntelliJIDEA,相比Eclipse而言,IntelliJIDEA的开发效率更高。在此选择IntelliJIDEAUltimate的2022.2.2版本进行项目开发。3.开发工具环境准备先定一个小目标!
先定一个小目标!掌握SpringBoot入门案例,能够使用SpringInitializr方式构建SpringBoot项目2.2.2使用SpringInitializr方式构建SpringBoot项目2.2.2使用SpringInitializr方式构建SpringBoot项目SpringInitializr是一个可以初始化SpringBoot项目的工具,使用SpringInitializr初始化的SpringBoot项目包含了SpringBoot基本的项目结构,可以项目初始化之前对项目所需要的依赖进行选择。使用SpringInitializr方式构建SpringBoot项目时,需要确保所在主机处于联网状态下,否则将构建失败。下面讲解如何在IDEA中使用SpringInitializr方式构建SpringBoot项目,并在项目中创建一个SpringMVC程序。2.2.2使用SpringInitializr方式构建SpringBoot项目1.构建SpringBoot项目启动IDEA,在IDEA欢迎界面依次选择“Project”→“NewProject”创建项目,在弹出的对话框中选择左侧“SpringInitializr”选项。ServerURL:初始化SpringBoot项目时SpringInitializr工具所在的服务器地址。Name:所创建项目的名称。Location:所创建项目在本地存放的路径。Language:所创建项目使用的开发语言。Type:所使用的项目构建工具。Group:项目的组名。Artifact:项目的名称。Packagename:包名。JDK:项目使用的JDK。Packaging:项目打包的方式。2.2.2使用SpringInitializr方式构建SpringBoot项目1.构建SpringBoot项目设置好项目的相应信息,其中项目打包方式为Jar。单击“Next”按钮,进入SpringBoot场景依赖选择界面。2.2.2使用SpringInitializr方式构建SpringBoot项目1.构建SpringBoot项目项目中想要添加SpringMVC,可以勾选Web类别下的SpringWeb,创建项目时就会添加SpringWeb的依赖。2.2.2使用SpringInitializr方式构建SpringBoot项目1.构建SpringBoot项目Chapter02Application.java:项目的启动类,在该类中可以定义启动项目的方法。static:静态资源文件夹。templates:模板页面文件夹。perties:全局配置文件。pom.xml:Maven工作的主要配置文件。2.2.2使用SpringInitializr方式构建SpringBoot项目1.构建SpringBoot项目Chapter02Application类有一个@SpringBootApplication注解,并且只有一个main()方法。其中,@SpringBootApplication注解用于标注当前类是SpringBoot的配置类,main()方法中调用SpringApplication类的run()方法来创建Spring容器,运行SpringBoot程序。2.2.2使用SpringInitializr方式构建SpringBoot项目2.编写SpringMVC控制器在项目com.itheima.chapter02包下创建名称为controller的包,在该包下创建控制器类HelloController,并在该类中编写处理请求的方法index()。2.2.2使用SpringInitializr方式构建SpringBoot项目3.运行项目运行文件Chapter02Application.java,启动程序。2.2.2使用SpringInitializr方式构建SpringBoot项目3.运行项目在浏览器上访问http://localhost:8080/first。2.2.3使用Maven方式构建SpringBoot项目先定一个小目标!
先定一个小目标!掌握SpringBoot入门案例,能够使用Maven方式构建SpringBoot项目2.2.3使用Maven方式构建SpringBoot项目使用SpringInitializr方式构建SpringBoot项目非常便捷,但是如果当前主机不能联网的话,就无法自动下载项目所需的一些依赖,从而导致这种方式无法正常使用。但是SpringBoot项目可以基于Maven构建,如果构建项目所需要使用的依赖在本地Maven仓库中已经存在,则无须联网也可以构建SpringBoot项目。下面讲解如何在IDEA中使用Maven方式构建SpringBoot项目,并在项目中创建一个SpringMVC程序。2.2.3使用Maven方式构建SpringBoot项目1.构建Maven项目启动IDEA,在IDEA欢迎界面依次选择“Project”→“NewProject”创建项目,在弹出的对话框中选择左侧“MavenArchetype”选项。2.2.3使用Maven方式构建SpringBoot项目1.构建Maven项目单击“MavenArchetype”选项左侧界面最上方的“NewProject”创建一个新的Mave项目。单击后进入“NewProject”选项对应的界面。2.2.3使用Maven方式构建SpringBoot项目1.构建Maven项目设置好创建项目的信息后,单击“Create”按钮即可创建Maven项目。Maven项目创建好之后,会默认打开项目的pom.xml文件。2.2.3使用Maven方式构建SpringBoot项目2.添加项目依赖创建一般的Maven项目时,需要手动在pom.xml文件中插入对应的依赖信息。插入项目继承的工程依赖,以及SpringWeb和测试相关的依赖。<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.4</version><relativePath/></parent>项目继承的父依赖2.2.3使用Maven方式构建SpringBoot项目2.添加项目依赖<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>SpringWeb的依赖测试相关的依赖2.2.3使用Maven方式构建SpringBoot项目默认情况下,IDEA会监视项目中pom.xml文件的变化,在pom.xml文件中导入新依赖或更新原有依赖后,IDEA会通知Maven解析这些更改,并尝试下载或更新对应的依赖,但有些情况下,依赖可能无法自动下载或更新,这时候就需要手动触发依赖的下载或更新,具体操作方法为:右键单击项目名,选择“Maven”→“Reloadproject”重新加载项目即可。小提示2.2.3使用Maven方式构建SpringBoot项目3.编写程序启动类在java文件夹下创建一个名称为com.itheima.chapter02maven的包,在该包下创建启动类Chapter02MavenApplication。4.编写SpringMVC控制器在项目com.itheima.chapter02maven包下创建名称为controller的包,在该包下创建控制器类HelloController,并在该类中编写处理请求的方法index()。2.2.3使用Maven方式构建SpringBoot项目5.运行项目运行文件Chapter02MavenApplication.java,启动程序,控制台输出的信息如下图。2.2.3使用Maven方式构建SpringBoot项目5.运行项目在浏览器中访问http://localhost:8080/first。SpringBoot原理解析2.32.3
SpringBoot原理解析通过SpringBoot入门案例的实现,相信大家能够感受到,与使用Spring整合SpringMVC进行开发时需要设置烦琐的依赖和配置信息相比,使用SpringBoot整合SpringMVC只需添加少量的依赖信息即可,开发过程也比较简洁。SpringBoot项目中可以简化依赖配置和常用工程的相关配置信息,这主要依靠它的起步依赖和自动配置。下面结合SpringBoot入门案例对SpringBoot的起步依赖、自动配置和执行流程的原理进行分析和讲解。2.3.1
起步依赖先定一个小目标!
先定一个小目标!熟悉SpringBoot起步依赖,能够简述SpringBoot起步依赖的原理2.3.1
起步依赖起步依赖本质上是一个Maven项目对象模型,该模型中定义了对其它库的传递依赖,SpringBoot提供了众多起步依赖来降低项目依赖的复杂度。在SpringBoot入门案例中,项目的pom.xml文件中主要引入了两个启动器作为当前项目的起步依赖,分别是spring-boot-starter-parent和spring-boot-starter-web。2.3.1
起步依赖1.spring-boot-starter-parent依赖spring-boot-starter-parent中定义了很多常见技术的版本信息,组合成一套最优搭配的技术版本。可以在IDEA中按住Ctrl单击spring-boot-starter-paren进入对应的源码文件中查看。2.spring-boot-starter-web依赖spring-boot-starter-web就是使用SpringMVC构建Web应用程序的启动器。不仅包含SpringMVC的依赖信息和Spring整合SpringMVCWeb开发的依赖信息,还包含了其他的一些依赖信息。2.3.1
起步依赖SpringBoot官方提供了大量的启动器,其基本都是通过“spring-boot-starter-技术名称”格式命名,通过启动器的名称通常可以知道它所提供的功能。例如,spring-boot-starter-web表示它提供Web相关的功能,spring-boot-starter-jdbc表示它提供JDBC相关的功能。名称描述spring-boot-starter-parent核心启动器,提供了一组默认的配置,这些配置涵盖了日志、YAML、Maven插件等多个方面,常被作为父依赖spring-boot-starter-logging提供Logging相关的日志功能spring-boot-starter-thymeleaf用于集成Thymeleaf模板引擎到SpringBoot应用程序中spring-boot-starter-web提供了构建Web应用程序所需的依赖项和SpringMVC自动配置,使用Tomcat作为默认的嵌入式容器spring-boot-starter-test支持常规的测试依赖,包括Junit、Hamcrest、Mockito和spring-test模块spring-boot-starter-jdbc结合JDBC和HikariCP连接池的启动器,对数据源自动装配,并提供JdbcTemplate简化数据库操作常见的SpringBoot应用程序启动器2.3.1
起步依赖名称描述spring-boot-starter-data-jpa使用SpringDataJPA与Hibernate的启动器spring-boot-starter-data-redis用于集成Redis的启动器,可以自动引入Redis相关的依赖和配置,并提供与SpringBoot集成所需的自动化配置和功能spring-boot-starter-log4j2提供Log4j2相关的日志功能spring-boot-starter-activemq使用ApacheActiveMQ实现的Java消息服务启动器spring-boot-starter-security使用SpringSecurity的启动器spring-boot-starter-dubbo提供Dubbo框架的相关功能常见的SpringBoot应用程序启动器2.3.1
起步依赖SpringBoot官方并没有为所有开发场景的技术框架都提供了启动器,例如,数据库操作框架MyBatis、阿里巴巴的Druid数据源等。为了充分利用SpringBoot框架的优势,一些第三方技术厂商主动与SpringBoot框架进行了整合,实现了各自的依赖启动器,例如,MyBatis提供的启动器mybatis-spring-boot-starter。不过在项目pom.xml文件中引入这些第三方的启动器时,需要自行配置对应的依赖版本号。2.3.1
起步依赖spring-boot-starter-parent和普通的starter都使SpringBoot项目简化了配置,但是他们两个的功能却不相同。spring-boot-starter-parent:定义了很多个常见组件或框架的依赖版本号,组合成一套最优搭配的技术版本,更便于统一管理依赖的版本,且减少了依赖的冲突。普通的starter:在坐标中定了若干个坐标,减少依赖配置的代码量。2.3.2
自动配置先定一个小目标!
先定一个小目标!熟悉SpringBoot自动配置,能够简述SpringBoot自动配置的原理2.3.2
自动配置SpringBoot采用约定优于配置的设计思想,将SpringBoot开发过程中可能会遇到的配置信息提前配置好,并写在自动配置的JAR包中。项目启动时会自动检测项目类路径下所有的依赖JAR包,将检测到的Bean注册到Spring容器中,并根据检测的依赖进行自动配置。2.3.2
自动配置@SpringBootConfiguration标注当前类是一个配置类,它是一个复合注解。1.@SpringBootConfiguration@EnableAutoConfiguration可以用于开启SpringBoot的自动配置,它也是一个复合注解。2.@EnableAutoConfiguration@ComponentScan注解是一个组件扫描器,其主要作用是扫描指定包及其子包下所有注解类文件作为Spring容器的组件使用。3.@ComponentScan@SpringBootApplication注解2.3.2
自动配置1.
@SpringBootConfiguration查看@SpringBootConfiguration的源码@SpringBootConfiguration是@Configuration的派生注解,拥有@Configuration注解的功能。@Configuration是@Component的派生注解,所以被@SpringBootApplication标注的类可以被扫描到Spring的IoC容器中。2.3.2
自动配置2.@EnableAutoConfiguration@EnableAutoConfiguration主要通过代码中的@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})实现自动配置。@AutoConfigurationPackage:主要作用是获取项目启动类所在根目录,从而指定组件扫描器扫描的包位置。@Import({AutoConfigurationImportSelector.class}:导入AutoConfigurationImportSelector类,该类中提供了一个获取自动配置的方法getAutoConfigurationEntry(),用于筛选出当前项目环境需要启动的自动配置类,从而实现当前项目运行所需的自动配置环境。查看@EnableAutoConfiguration的源码2.3.2
自动配置@AutoConfigurationPackage也是一个复合注解,其中@Import导入了AutoConfigurationPackages.Registrar类,Registrar类属于AutoConfigurationPackages类中的静态内部类,该类中提供了批量注册组件到Spring容器的方法。查看@AutoConfigurationPackage的源码2.@EnableAutoConfiguration2.3.2
自动配置(1)从SpringBoot自动配置JAR包的META-INF/spring.factories和META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中获取所有候选自动配置类。(2)根据项目pom.xml文件中加入的依赖筛选出最终符合当前项目运行环境对应的自动配置类。查看@Import({AutoConfigurationImportSelector.class})的源码2.@EnableAutoConfiguration2.3.2
自动配置3.
@ComponentScan@ComponentScan注解具体扫描的包的根路径由SpringBoot项目主程序启动类所在包位置决定,在扫描过程中由前面介绍的@AutoConfigurationPackage注解进行解析,从而得到SpringBoot项目主程序启动类所在包的具体位置。@ComponentScan(excludeFilters={@Filter(type=FilterType.CUSTOM,classes={TypeExcludeFilter.class}),@Filter(type=FilterType.CUSTOM,classes={AutoConfigurationExcludeFilter.class})})指定扫描时过滤掉不加载到Spring容器的类。在BeanFactory中查找所有类型为TypeExcludeFilter的组件,并去执行其自定义的过滤方法。用于过滤其他同时使用@Configuration和@EnableAutoConfigure的类。2.3.3
执行流程先定一个小目标!
先定一个小目标!熟悉SpringBoot执行流程,能够基于SpringBoot入门案例简述SpringBoot的执行流程2.3.3
执行流程SpringBoot入门案例启动类的main()方法中只有一行代码,使用SpringApplication类调用run()方法,执行该行代码,就启动了整个SpringBoot项目。为了进一步了解SpringBoot的启动原理,下面基于SpringBoot入门案例讲解SpringBoot的执行流程。2.3.3
执行流程查看SpringApplication调用的run()方法的源码SpringApplication的run()方法中调用了另一个重载的run()方法,被调用的重载run()方法内部执行了两个操作,分别是创建SpringApplication实例和调用run()方法。2.3.3
执行流程创建SpringApplication实例主要执行了如下操作。①
初始化资源加载器,此处将资源加载器置空。②初始化加载资源的类。③推断当前启动的项目的类型。④设置应用程序的上下文初始化器。⑤设置应用程序的事件监听器。⑥设置项目的主程序启动类。1.创建SpringApplication实例2.3.3
执行流程run()方法的核心代码执行内容。(1)创建启动上下文对象。(2)获取并启动运行监听器。(3)将应用程序参数封装为ApplicationArguments类型对象。(4)配置环境信息ConfigurableEnvironment的基础的配置信息。(5)配置需要忽略的Bean信息。(6)创建应用程序上下文对象,并设置上下文对象的应用程序启动器。(7)对应用上下文环境进行准备。(8)刷新应用程序上下文,初始化IoC容器里面的Bean。(9)调用了监听器的started()方法,通知监听器上下文启动完成。2.调用run()方法查看run()方法执行的过程SpringBoot配置2.42.4SpringBoot配置SpringBoot提供了众多默认配置,这极大提高了应用程序的开发效率。SpringBoot启动时会自动读取应用程序中全局配置文件的配置,开发者想要根据自身需求覆盖SpringBoot的默认配置,可以通过修改全局配置文件实现,并通过配置绑定将配置文件中的值与Bean中的属性进行绑定,使这些配置信息可以在应用程序中使用。下面对SpringBoot配置中的全局配置文件和配置绑定进行讲解。2.4.1全局配置文件先定一个小目标!
先定一个小目标!掌握在全局配置文件中配置数据,能够在perties配置文件和application.yml配置文件中正确配置数据2.4.1全局配置文件SpringBoot默认使用的全局配置文件有perties、application.yml和application.yaml,其中,application.yml与application.yaml文件类型相同,只是为了满足不同操作系统对文件命名的要求而使用了不同的扩展名。下面对SpringBoot配置中的全局配置文件进行讲解。2.4.1全局配置文件1.perties配置文件perties文件中可以定义SpringBoot项目的相关属性,属性可采用键值对格式进行设置,表示形式为“Key=Value”,这些相关属性可以是系统属性、环境变量、命令参数等信息,也可以是自定义的属性。address=beijingserver.port=80spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverperties文件中的属性支持多种类型,常见的有字面量、数组和集合。2.4.1全局配置文件(1)字面量类型属性字面量是指单个的不可拆分的值,例如:数字、字符串、布尔值等。在perties文件中配置字面量的属性时,直接将字面量作为Value写在键值对中即可,且默认情况下字符串是不需要使用单引号或双引号进行修饰的。address=beijingage=132.4.1全局配置文件如果需要配置的属性为对象的属性,可以通过“对象名.属性名”的方式指定属性的键。对象中可能包含多个属性,在perties文件中为对象的属性赋值时,一个属性对应一对键值对。user.username=lisiuser.age=18(1)字面量类型属性2.4.1全局配置文件(2)数组类型属性在perties文件中配置数组类型属性时,可以将数组元素的值写在一行内,元素值之间使用逗号(,)间隔,也可以在多行分别根据索引赋值。#方式一user.hobby=swim,travel,cook#方式二user.hobby[0]=swim2user.hobby[1]=travel2user.hobby[2]=cook22.4.1全局配置文件(3)集合类型属性在perties文件中也可以配置集合类型的属性,下面分别演示配置List、Set、Map的集合类型属性。#配置List集合类型属性(方式一)user.subject=Chinese,English,Math#配置List集合类型属性(方式二)user.subject[0]=Chineseuser.subject[1]=Englishuser.subject[2]=Math2.4.1全局配置文件(3)集合类型属性#配置Set集合类型属性user.salary=120,230#配置Map集合类型属性(方式一)user.order.1001=cookieuser.order.1002=cake#配置Map集合类型属性(方式二)user.order[1001]=cookieuser.order[1002]=cake2.4.1全局配置文件2.application.yml配置文件application.yml配置文件是YAML编写的文件,YAML是”YAMLAin'tMarkupLanguage“的递归缩写。YAML文件通常用于表示数据结构和配置信息,它使用缩进的方式表示层级关系,使得配置文件和数据结构的表达相对简洁和易于阅读。YAML支持的数据包括列表、键值对和字符串、数字等。YAML文件的扩展名为.yml或.yaml,编写时需要遵循如下规则。使用缩进表示层级关系。
缩进时不允许使用Tab键,只允许使用空格。缩进的空格数不重要,但同级元素必须左侧对齐。对字母大小写敏感。2.4.1全局配置文件在YAML文件中使用“Key:Value”的形式表示一对键值对,其中,Value前面有一个空格,并且该空格不能省略。在配置字面量类型属性时,直接将字面量作为Value写在键值对中即可,且默认情况下字符串是不需要使用单引号或双引号进行修饰的。address:beijingage:13(1)字面量类型属性2.4.1全局配置文件如果需要配置的属性为对象的属性,配置的方式有缩进式和行内式两种。#缩进式consumer:username:lisiage:18#行内式consumer:{username:lisi,age:18}(1)字面量类型属性2.4.1全局配置文件(2)数组类型和单列集合属性当YAML配置文件中配置的属性为数组类型或单列集合时,也可以使用缩进式写法和行内式写法。consumer:hobby:-play-readconsumer:hobby:[play,read]or缩进式行内式2.4.1全局配置文件(3)Map集合属性当YAML配置文件中配置的属性为Map集合时,可以使用缩进式写法和行内式写法。consumer:order:1001:cookie1002:cakeconsumer:order:{1001:cookie,1002:cake}or缩进式行内式多学一招默认配置文件SpringBoot项目将perties或application.yml作为项目的默认配置文件。SpringBoot项目中可以存在多个perties或application.yml,SpringBoot启动时会扫描以下5个位置的perties和application.yml文件,并将扫描到的文件作为SpringBoot的默认配置文件。
file:./config/*/
file:./config/file:./classpath:/config/
classpath:/多学一招默认配置文件SpringBoot项目将perties或application.yml作为项目的默认配置文件。Spring上述5个位置下如果存在perties和application.yml文件,在项目启动就都会被加载。加载多个perties或application.yml文件时,文件中的配置会根据文件所处的位置划分优先级,优先级规则如下。上述位置1~位置5的优先级依次降低,序号越小优先级越高。位于相同位置的perties的优先级高于application.yml,application.yml的优先级高于application.yaml。存在相同的配置内容时,高优先级的内容会覆盖低优先级的内容。存在不同的配置内容时,高优先级和低优先级的配置内容取并集。2.4.2配置绑定先定一个小目标!
先定一个小目标!掌握配置绑定方式,能够通过@Value注解和@ConfigurationProperties注解绑定配置文件中的信息2.4.2配置绑定在使用SpringBoot全局配置文件配置属性时,如果配置的属性是SpringBoot内置的属性(如服务端口server.port),那么SpringBoot会自动扫描并读取配置文件中的属性值并覆盖原有的默认属性值。如果配置的属性是用户自定义的属性,那么可以通过Java代码去读取该配置属性,并且把属性值绑定到Bean。在SpringBoot项目中可以通过@Value和@ConfigurationProperties注解绑定配置文件中的信息,下面分别对这两种配置绑定进行讲解。2.4.2配置绑定1.@Value注解@Value注解是由Spring框架提供的,SpringBoot框架从Spring框架中对@Value注解进行了默认继承,通过@Value可以将配置文件中的属性值绑定到Bean对象对应的属性。@ComponentpublicclassPerson{@Value("${person.id}")privateintid;}将配置文件中属性person.id的值动态注入到id属性2.4.2配置绑定下面通过案例演示在SpringBoot项目中使用@Value绑定全局配置文件中的属性。(1)设置配置信息。在项目的resource文件夹下创建配置文件application.yml,在该配置文件中添加属性信息。consumer:username:lisiage:23hobby:sing,readsubject:100,1502.4.2配置绑定(2)创建实体类。在chapter02-maven项目的java文件夹下创建类包com.itheima.chapter02maven.domain,并在该类包下创建一个消费者实体类Consumer,在该类上使用@Component进行标注,并在属性上使用@Value注解注入配置文件中对应属性的值。(3)创建测试类。在项目test\java目录下,创建包com.itheima.chapter02maven,在该包下创建测试类Chapter02MavenApplicationTests,在该测试类中注入Consumer对象,并新增一个测试方法进行输出测试。2.4.2配置绑定(4)测试程序效果。运行测试方法wiredTest()。2.4.2配置绑定2.@ConfigurationProperties注解Java是面向对象的语言,很多情况下,人们习惯将具有相同特性的一组数据封装到一个对象中,SpringBoot中就提供了具有这种功能的注解。SpringBoot的@ConfigurationProperties注解可以
可以将配置文件中的一组配置数据同时绑定到Bean中。下面通过案例演示在SpringBoot项目中使用@ConfigurationProperties注解绑定全局配置文件中的数据。2.4.2配置绑定(1)修改实体类属性的绑定方式。在Consumer类上使用@ConfigurationProperties注解进行标注,并且去除属性上方标注的@Value注解。@Component@ConfigurationProperties(prefix="consumer")publicclassConsumer{privateStringusername;privateintage;privateString[]hobby;privateListsubject;//……setter/getter方法,以及toString()方法}类中的属性名需要和绑定的配置文件中属性名保持一致。2.4.2配置绑定(2)新增测试方法。在文件2-3的Chapter02ApplicationTests类中,新增测试方法confTest(),在测试方法中输出Consumer对象。@TestvoidconfTest(){System.out.println(consumer);}2.4.2配置绑定(3)测试程序效果。运行测试方法confTest()。本章小结本章主要对SpringBoot开发入门知识进行了讲解。首先是SpringBoot概述,然后讲解了SpringBoot入门案例,接着结合入门案例对SpringBoot原理进行了解析,最后讲解了SpringBoot配置。通过本章的学习,希望大家可以对SpringBoot有初步认识,为后续更深入学习SpringBoot奠定基础。本章小结第3章SpringBoot应用进阶《微服务架构基础(SpringBoot+SpringCloud+Docker)(第2版)》学习目标/Target了解SpringMVC自动配置,能够简述SpringBoot整合SpringMVC提供的主要自动配置功能了解MyBatis-Plus概述,能够简述MyBatis-Plus的特性和框架结构熟悉MyBatis-Plus的基本功能,能够说出MyBatis-Plus中BaseMapper和IService的常用增删改查方法熟悉SpringSecurity的认证和授权管理,能够简述SpringSecurity的认证和授权管理的方式掌握自定义SpringMVC配置的方法,能够在SpringMVC中配置静态资源映射、视图控制器、拦截器学习目标/Target掌握SpringBoot整合MyBatis-Plus入门案例,能够独立将SpringBoot和MyBatis-Plus进行整合熟悉SpringDataRedis入门的内容,能够简述SpringDataRedis的定义,以及SpringDataRedis的常见操作掌握SpringBoot整合SpringDataRedis入门案例的内容,能够独立将SpringBoot和SpringDataRedis进行整合掌握SpringBoot整合SpringSecurity入门案例的内容,能够独立将SpringBoot和SpringSecurity进行整合,实现用户认证和授权的应用章节概述/SummarySpringBoot框架可用于快速搭建和开发企业级Java应用,在开发者社区中越来越受欢迎。然而,只掌握SpringBoot的基础知识并不能很好地满足复杂和庞大应用的需求。随着应用变得越来越复杂,开发者需要掌握SpringBoot的高级技术来应对挑战。SpringBoot的核心优势在于其自动配置和快速集成功能,本章将通过讲解SpringBoot整合SpringMVC、MyBatis-Plus、Redis和SpringSecurity,帮助读者深入学习SpringBoot的进阶应用,并掌握更多实用技巧和最佳实践,以构建可靠、高效和安全的应用程序。目录/Contents3.13.2SpringBoot整合SpringMVCSpringBoot整合MyBatis-Plus3.3SpringBoot集成Redis3.4SpringBoot整合SpringSecuritySpringBoot整合SpringMVC3.13.1
SpringBoot整合SpringMVC在大多数SpringBoot应用中,前端MVC框架仍使用SpringMVC,SpringBoot提供的spring-boot-starter-web启动器中嵌入了SpringMVC相关的依赖,为开发者提供了大量的自动配置,适用于大多数Web开发场景。除了可以使用这些自动配置功能之外,开发者还可以自定义SpringMVC配置,以更灵活地满足不同的需求。下面分别对SpringMVC自动配置和自定义SpringMVC配置进行讲解。3.1.1
SpringMVC自动配置先定一个小目标!
先定一个小目标!了解SpringMVC自动配置,能够简述SpringBoot整合SpringMVC提供的主要自动配置功能3.1.1
SpringMVC自动配置SpringBoot整合SpringMVC提供的自动配置功能主要如下所示。1.简化配置SpringBoot通过约定优于配置的理念,减少了烦琐的配置步骤。开发者只需在项目中引入相应的依赖,无须手动配置其他额外的信息,即可快速构建完善的SpringMVC应用。2.提供默认映射路径SpringBoot自动注册了DispatcherServlet,并将默认映射路径设置为“/”,无须手动指定DispatcherServlet和URL映射规则,简化了URL配置的过程。3.自动处理静态资源SpringBoot提供了自动处理静态资源的功能,只需将静态资源文件(如CSS、JavaScript、图片等)放置在特定的目录下,SpringBoot会自动处理静态资源的访问,无须额外的配置。3.1.1
SpringMVC自动配置4.自动包扫描SpringBoot自动扫描项目中的各个组件,并将它们自动注册到SpringMVC中,而无须开发者手动进行组件扫描和注册的操作。5.自动配置视图技术SpringBoot支持多种视图技术,如Thymeleaf、FreeMarker等,开发者只需添加相应的依赖,即可自动配置并使用这些视图技术,无须额外的配置。6.自动异常处理SpringBoot提供了默认的异常处理器,自动处理请求过程中产生的常见异常,提高系统的可靠性和容错性。7.RESTfulAPI支持SpringBoot对RESTfulAPI的支持非常友好,它可以自动处理序列化和反序列化JSON,可以轻松实现基于REST的接口开发。3.1.2
自定义SpringMVC配置先定一个小目标!
先定一个小目标!掌握自定义SpringMVC配置的方法,能够在SpringMVC中配置静态资源映射、视图控制器、拦截器3.1.2自定义SpringMVC配置在SpringBoot应用中使用SpringMVC时,如果希望在为SpringMVC自动配置提供相关特性的同时,增加一些自定义的SpringMVC配置,例如添加拦截器、视图控制器等,可以通过自定义WebMvcConfigurer类型的配置类来实现。下面分别对SpringMVC中的配置静态资源映射、视图控制器、拦截器的方式进行讲解。3.1.2自定义SpringMVC配置1.配置静态资源映射通常Web应用中会需要使用静态资源,例如,JavaScript文件、CSS文件和HTML文件等。单独使用SpringMVC时,导入静态资源文件后,需要配置静态资源的映射,否则无法正常访问。SpringBoot中提供了默认的静态资源映射,当访问项目中任意的静态资源时,SpringBoot会默认从以下路径中进行查找。(1)classpath:/META-INF/resources/(2)classpath:/resources/(3)classpath:/static/(4)classpath:/public/优先级从(1)至(4)依次递减,SpringBoot会先查找优先级高的文件夹,再查找优先级低的文件夹。3.1.2自定义SpringMVC配置下面演示直接访问静态资源文件夹和非静态资源文件夹中资源的效果,首先创建一个名称为chapter03-springmvc的SpringBoot项目,在项目的pom.xml文件夹中引入spring-boot-starter-web启动器。然后在项目的src/main/resources目录下创建文件夹static,接着在
src/main/resources/static和
src/main/resources目录下分别创建main.html文件和index.html文件,并在项目启动后分别在浏览器中对这两个静态资源进行访问,访问结果如下图所示。3.1.2自定义SpringMVC配置如果想在项目中访问非默认静态资源文件夹下的资源,可以自定义静态资源的映射。自定义静态资源的映射可以通过配置类和配置文件2种方式实现。(1)通过配置类实现静态资源映射通过配置类实现静态资源映射时,配置类需要实现WebMvcConfigurer接口,在重写WebMvcConfigurer接口的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026上半年贵州事业单位联考玉屏侗族自治县招聘41人备考题库有答案详解
- 初级社工考试题库及答案
- 测量理论考试试卷及答案
- 颈椎骨折选择试题及答案
- 2025-2026人教版二年级数学上期末卷
- 2025-2026五年级信息技术期末测试粤教版
- 肠道菌群与代谢病线粒体功能障碍
- 肠道-脑轴在麻醉药品依赖性评价中的意义
- 肝血管瘤临床路径变异的观察策略
- 探店汽修店卫生管理制度
- 2026 年初中英语《状语从句》专项练习与答案 (100 题)
- 2026年辽宁省盘锦市高职单招语文真题及参考答案
- 简爱插图本(英)夏洛蒂·勃朗特著宋兆霖译
- 焊接专业人才培养方案
- 第二届全国技能大赛江苏省选拔赛焊接项目评分表
- 糖尿病护士年终总结
- 第20课 《美丽的小兴安岭》 三年级语文上册同步课件(统编版)
- 糖尿病基础知识培训2
- 研学旅行概论第六章
- GB/T 22176-2023二甲戊灵乳油
- 根据信用证制作商业发票、装箱单、装船通知
评论
0/150
提交评论