文章目录
- 什么是SpringBoot
- 了解我们的Spring能干什么
- Spring的生态
- 为什么需要SpringBoot
- SpringBoot优点
- SpringBoot缺点
- SpringBoot的大时代背景
- 微服务
- 分布式
- 分布式的困难
- 分布式的解决
- 云原生
- 上云的困难
- SpringBoot之Helloworld
- 新添我们的maven相关的配置
- 创建一个maven项目并导入依赖
- 创建主程序
- 编写业务
- 运行和测试
- 设置配置
- 打包部署
什么是SpringBoot
了解我们的Spring能干什么
Spring的生态
覆盖了:
- web开发
- 数据访问
- 安全控制
- 分布式
- 消息服务
- 移动开发
- 批处理
- …
我们可以看出来我们的Spring的生态非常完善且强大,和它拥有IOC容器这个强大的功能,可以去整合其他框架
为什么需要SpringBoot
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.
能快速创建出生产级别的Spring应用。
Spring Boot是为了Spring框架的简易使用
众所周知 Spring 应用需要进行大量的配置,各种 XML 配置和注解配置让人眼花缭乱,且极容易出错,因此 Spring 一度被称为“配置地狱”。为了简化 Spring 应用的搭建和开发过程,Pivotal 团队在 Spring 基础上提供了一套全新的开源的框架,它就是 Spring Boot。
- 比如在我们的学习的SSM中,我们的SpringMVC配置中的DispatcherServlet,ViewResolver,开启MVC注解驱动,拦截器,文件上传器,视图控制,扫描组件,默认的Servlet,异常解析器,如果需要更多的功能,还需要更多的配置
Spring Framework 和 Spring Boot 的根本是一致的。Spring Boot 是 Spring Framework 的引导程序以简化其配置和使用。而Spring Framework 是 Spring Boot 的基础,Spring Boot 无法脱离 Spring Framework 。用户通过上层 Spring Boot 的引导来使用 Spring Framework 。
SpringBoot优点
-
Create stand-alone Spring applications
- 创建独立Spring应用
-
Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
- 内嵌web服务器 比如嵌入式的TomCat
- 比如我们之前使用Spring开发Web,还需要将我们的项目打成war包,然后放在我们本地的TomCat运行
- 内嵌web服务器 比如嵌入式的TomCat
-
Provide opinionated ‘starter’ dependencies to simplify your build configuration
- 自动starter依赖,简化构建配置 这里就解决了Spring配置地狱
- 比如我们要进行Web开发,我们需要导入对应的jar包依赖,还需要控制版本,都是不能出错,不然无法运行,如果有了springboot,我们不需要导入一大堆依赖,只需要导入一个web对应的starter,就可以帮我们自动配置web需要的东西
- 自动starter依赖,简化构建配置 这里就解决了Spring配置地狱
-
Automatically configure Spring and 3rd party libraries whenever possible
- 自动配置Spring以及第三方功能
- 比如使用Mybatis,不需要再自己配置,什么数据源类似的配置
- 自动配置Spring以及第三方功能
-
Provide production-ready features such as metrics, health checks, and externalized configuration
- 提供生产级别的监控、健康检查及外部化配置
-
Absolutely no code generation and no requirement for XML configuration
- 无代码生成、无需编写XML
-
SpringBoot是整合Spring技术栈的一站式框架
-
SpringBoot是简化Spring技术栈的快速开发脚手架
SpringBoot缺点
- 人称版本帝,迭代快,需要时刻关注变化
- 封装太深,内部原理复杂,不容易精通
SpringBoot的大时代背景
微服务
In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.——James Lewis and Martin Fowler (2014)
- 微服务是一种
架构风格
- 一个应用拆分为一组小型服务
- 每个服务运行在自己的进程内,也就是可独立部署和升级,运行到不同进程,也就是说可以放在不同的服务器
- 服务之间使用轻量级HTTP交互
- 服务围绕业务功能拆分
- 根据业务。比如我们电商系统,可以将购物车,结账分为不同的模块,商品管理等等子系统
项目的逻辑构成
请求
:请求是项目中最基本的逻辑单元,就像万事万物都由原子构成
- 举例:点超链接跳转到注册页面
功能
:一个功能包含很多个请求
举例:注册用户功能
请求1:点超链接跳转到注册页面
请求2:发送请求获取短信验证码
请求3:检查用户名是否可用
请求4:提交表单完成注册
模块
:一个模块包含很多功能
举例:用户信息管理模块
功能1:用户注册功能
功能2:用户登录功能
功能3:个人中心——账户安全功能
功能4:个人中心——账户绑定功能
功能5:个人中心——收货地址功能
功能6:个人中心——我的银行卡功能
子系统
:根据项目规模的不同,子系统这层逻辑概念可能有也可能没有。如果设置了子系统,那么子系统中也必然包含很多模块。其实庞大项目的子系统已经相当于一个项目了,甚至比小型项目整个都大。
举例:认证中心子系统
模块1:用户信息管理模块
模块2:权限管理模块
模块3:授权管理模块
模块4:权限检查模块
项目
:为了解决现实生活中的实际问题开发一个项目,这个项目就是为这个需求提供的一整套解决方案。
举例:电商项目
子系统1:认证中心子系统
子系统2:商品管理子系统
子系统3:购物车子系统
子系统4:仓储子系统
子系统5:物流子系统
子系统6:订单子系统
- 可以由全自动部署机制独立部署
- 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术
分布式
分布式的困难
-
远程调用
- 不同的子系统可能需要相互调用,比如购物车子系统需要调用仓储子系统,物理子系统,订单子系统
-
服务发现
- 可能几个主机都会有相同的子系统的功能,比如购物车子系统需要调用仓储子系统,仓储子系统在四台主机上都有,我们的购物车子系统需要哪些是可以使用的
-
负载均衡
- 可能几个主机都会有相同的子系统的功能,比如购物车子系统需要调用仓储子系统,仓储子系统在四台主机上都有,这四台主机都是可以使用的,我们的购物车子系统需要判断调用哪台主机的功能
-
服务容错
- 我们调用其他子系统失败,有可能是网络失败的原因,如果都不行,对应需要的处理方案
-
配置管理
- 因为很多一个子系统可能在很多主机都有,不可能让我们自己一个个去改,所以需要一个配置中心来让子系统自己主动修改
-
服务监控
-
链路追踪
- 出现问题,要知道是哪个地方出现了问题
-
日志管理
-
任务调度
-
…
分布式的解决
- SpringBoot + SpringCloud
云原生
原生应用如何上云。 Cloud Native
上云的困难
- 服务自愈
- 弹性伸缩
- 服务隔离
- 自动化部署
- 灰度发布
- 流量治理
- …
SpringBoot之Helloworld
有更简单的创建方式,但是为了探究原理,我们采用原始的方式
新添我们的maven相关的配置
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
- 第一个是为了让我们的maven下载速度更快
- 第二个是为了让maven环境支持jdk1.8
创建一个maven项目并导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
- 第二个是为了导入我们的web开发需要的依赖
创建主程序
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class);
}
}
- @SpringBootApplication的作用是为了标识这是一个SpringBoot应用
- SpringApplication.run(MainApplication.class)是为了让SpringBoot应用跑起来
文件/目录 路径 | 功能说明 |
---|---|
src/main/java/ | Java 源码根目录 |
src/main/resources/application.propertis | 运行时配置文件 |
src/main/resources/ | 其他运行时资源存放根目录 |
src/main/resources/static/ | 静态资源存放根目录 |
src/main/resources/templates/ | 模板资源存放根目录 |
编写业务
/**
* @author lsc
* #Description HelloWorldController
* #Date: 2023/2/10 22:43
*/
@RestController
public class HelloWorldController {
@RequestMapping("/hello")
public String handle01(){
return "Hello, Spring Boot 2!";
}
}
运行和测试
- 运行
MainApplication
类 - 浏览器输入
http://localhost:8080/hello
,将会输出Hello, Spring Boot 2!
。
设置配置
maven工程的resource文件夹中创建application.properties文件。
# 设置端口号
server.port=8888
文档中查看相关的配置
更多配置信息
打包部署
在pom.xml添加
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
在IDEA的Maven插件上点击运行 clean 、package,把helloworld工程项目的打包成jar包,
打包好的jar包被生成在helloworld工程项目的target文件夹内。
用cmd运行java -jar boot-01-helloworld-1.0-SNAPSHOT.jar
,既可以运行helloworld工程项目。将jar包直接在目标服务器执行即可。