简介:
- Spring Boot来简化Spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用。
- 简化Spring应用开发的一个框架
- 整个Spring技术栈的一个大整合
- J2EE开发的一站式解决方案
特性:
Create stand-alone Spring applications
【创建独立的Spring应用程序】
Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
【直接嵌入Tomcat、Jetty或Undertow(不需要部署WAR文件)】
Provide opinionated 'starter' dependencies to simplify your build configuration
【提供固执己见的“starter”依赖项来简化构建配置】
Automatically configure Spring and 3rd party libraries whenever possible
【尽可能自动配置Spring和第三方库】
Provide production-ready features such as metrics, health checks and externalized configuration
【提供可用于生产的特性,如度量标准、健康状况检查和外部化配置】
Absolutely no code generation and no requirement for XML configuration
【完全不需要代码生成,也不需要XML配置】
微服务:
- 简而言之,微服务体系结构风格是一种将单个应用程序作为一组小服务来开发的方法,每个小服务都在自己的进程中运行,并与轻量级机制(通常是HTTP资源API)进行通信。这些服务是围绕业务功能构建的,可以通过完全自动化的部署机制独立部署。这些服务的集中管理很少,可能使用不同的编程语言编写并使用不同的数据存储技术。
- 总结:
- 现在 微服务是一种:架构风格(服务微化)
- 一个应用应该是一组小型服务,可以通过HTTP的方式进行互通
- 微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元
- 早期 单体应用:ALL IN ONE
- 优点:
- 开发测试简单(只有一个应用不牵扯到多个应用之间的互连)
- 部署简单(将整个应用打成war包部署在TomCat中)
- 水平扩展简单(当应用的负载能力不行的时候,我们把相同的应用复制很多,放在很多服务器,提高并发能力)
微服务与SOA架构对比:
SOA架构特点:
系统集成:
站在系统的角度,解决企业系统间的通信问 题,把原先散乱、无规划的系统间的网状结构,梳理成 规整、可治理的系统间星形结构,这一步往往需要引入 一些产品,比如 ESB、以及技术规范、服务管理规范; 这一步解决的核心问题是【有序】
系统的服务化:
站在功能的角度,把业务逻辑抽象成 可复用、可组装的服务,通过服务的编排实现业务的 快速再生,目的:把原先固有的业务功能转变为通用 的业务服务,实现业务逻辑的快速复用;这一步解决 的核心问题是【复用】
业务的服务化:
站在企业的角度,把企业职能抽象成 可复用、可组装的服务;把原先职能化的企业架构转变为服务化的企业架构,进一步提升企业的对外服务能力;“前面两步都是从技术层面来解决系统调用、系统功能复用的问题”。第三步,则是以业务驱动把一个业务单元封装成一项服务。这一步解决的核心问题是【高效】
微服务架构特点:
通过服务实现组件化:
开发者不再需要协调其它服务部署对本服务的影响。
按业务能力来划分服务和开发团队:
开发者可以自由选择开发技术,提供 API 服务
去中心化:
- 每个微服务有自己私有的数据库持久化业务数据
- 每个微服务只能访问自己的数据库,而不能访问其它服务的数据库
- 某些业务场景下,需要在一个事务中更新多个数据库。这种情况也不能直接访问其它微服务的数据库,而是通过对于微服务进行操作。
数据的去中心化,进一步降低了微服务之间的耦合度,不同服务可以采用不同的数据库技术(SQL、NoSQL等)。在复杂的业务场景下,如果包含多个微服务,通常在客户端或者中间层(网关)处理。- 基础设施自动化(devops、自动化部署):
- Java EE部署架构,通过展现层打包WARs,业务层划分到JARs最后部署为EAR一个大包,而微服务则打开了这个黑盒子,把应用拆分成为一个一个的单个服务,应用Docker技术,不依赖任何服务器和数据模型,是一个全栈应用,可以通过自动化方式独立部署,每个服务运行在自己的进程中,通过轻量的通讯机制联系,经常是基于HTTP资源API,这些服务基于业务能力构建,能实现集中化管理(因为服务太多啦,不集中管理就无法DevOps啦)。
- 主要区别:
功能
SOA
微服务
组件大小
大块业务逻辑
单独任务或小块业务逻辑
耦合
通常松耦合
总是松耦合
公司架构
任何类型
小型、专注于功能交叉团队
管理
着重中央管理
着重分散管理
目标
确保应用能够交互操作
执行新功能、快速拓展开发团队
- [详细参照微服务文档]:https://martinfowler.com/articles/microservices.html#MicroservicesAndSoa
SpringBoot的简单应用:
- 一个功能:浏览器发送hello请求,服务器接受请求并处理,响应Hello World字符串
- 步骤:
- 创建一个maven工程;(jar)
- 导入SpringBoot相关的依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
编写一个主程序:启动SpringBoot应用
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author Mr.Li * @version 1.0 * @Description: * @Modified By: * @date 2019/10/20 20:02 */ // @SpringBootApplication: 告诉SpringBoot来标注一个主程序类,说明这是一个SpringBoot应用 @SpringBootApplication public class HelloWorldMainApplication { public static void main(String[] args) { // Spring应用启动起来 SpringApplication.run(HelloWorldMainApplication.class , args); } }
编写相关的Controller、Service
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * @author Mr.Li * @version 1.0 * @Description: * @Modified By: * @date 2019/10/20 20:44 */ @Controller public class HelloController { //接收浏览器的hello请求 @RequestMapping("/hello") //把该方法的返回值写给浏览器 @ResponseBody public String hello(){ return "Hello World"; } }
启动测试:运行main方法【得到TomCat的端口号为8080】
直接输入 localhost:8080
输入 localhost:8080/hello
简化部署工作
导入插件
<!--这个插件,可以将应用打包成可执行的 jar包--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!-- 创建一个自动可执行的jar或war文件。它可以替换常规的artifact, 或者用一个单独的classifier附属在maven构建的生命周期中。 --> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
将得到的jar包复制粘贴到桌面,并查看属性得到包的路径
打开cmd窗口,并运行jar包
再次进行测试
分析jar包:
使用360压缩打开得到
进入BOOT-INF
进入lib
全是jar包
并且拉倒最下边会发现有TomCat的jar包
所以SpringBoot中不需要配置TomCat
进入META-INF
进入MANIFEST.MF
Hello World 探究:
- pom文件
- SpringBoot的版本仲裁中心,以后导入依赖默认是不需要写版本
- 得到父项目【Ctrl+鼠标】,用来管理SpringBoot应用里的所有版本依赖
- 没有在dependencies里面管理的依赖自然需要声明版本号
- spring-boot-starter:SpringBoot场景启动器
- 帮我们导入了web模块正常运行所依赖的组件,依赖的版本号有父项目仲裁。
- Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器
- 主程序类,主入口类
- @SpringBootApplication:SpringBoot应用标注在某个类上,说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用
- 进入@SpringBootApplication得到组合注解
- @SpringBootConfiguration:SpringBoot的配置类
- 标注在某个类上,表示这是一个SpringBoot配置类
- 进入@SpringBootConfiguration注解:
- @Configuration:配置类上来标注这个注解
- 配置类 ----- 配置文件,配置类也是容器中的一个组件,@Component
- @EnableAutoConfiguration:开启自动配置功能
- 以前我们需要配置的东西,Spring Boot帮我们自动配置,由@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效
- 进入@EnableAutoConfiguration注解:
- @AutoConfigurationPackage:自动配置包
- 进入@AutoConfigurationPackage注解
- @Import(AutoConfigurationPackages.Registrar.class): Spring的底层注解@Import,给容器中导入一个组件 ,导入的组件由AutoConfigurationPackages.Registrar.class
- 将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器
- @Import(EnableAutoConfigurationImportSelector.class) :给容器中导入组件
- EnableAutoConfigurationImportSelector:导入哪些组件的选择器
- 将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中
- 会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件
- 有了自动配置类,免去了我们手动编写配置注入功能组件等的工作
- J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar
使用Spring Initializer快速创建Spring Boot项目
IDEA:使用 Spring Initializer快速创建项目
选择模块,根据自己需要的选择
之后会有选择文件名以及路径这个直接默认就行,之后点击完成即可
运行主程序
得到结果
默认生成的SpringBoot项目
主程序已经生成好了,我们只需要我们自己的逻辑
resources文件夹中目录结构
static:保存所有的静态资源, js css images
templates:保存所有的模板页面,(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面),可以使用模板引擎(freemarker、thymeleaf)
application.properties:Spring Boot应用的配置文件,可以修改一些默认设置
例如:修改默认的端口号