SpringBoot系列一基础入门

一、Spring能做什么

Spring官方

SpringBoot官方文档

Spring5有重大升级和jdk8的新特性,使得SpringBoot2在SpringBoot1内容上有很大的不同

Spring5引入了响应式编程,jdk8接口的可以拥有默认实现(即接口被default修饰的方法可以不被重写),会让原先的适配器模式显得有些多余

SpringBoot的优点

  • Create stand-alone Spring applications

    • 创建独立Spring应用
  • Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)

    • 内嵌web服务器
  • 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

SpringBoot缺点

  • 人称版本帝,迭代快,需要时刻关注变化
  • 封装太深,内部原理复杂,不容易精通

二、时代背景

2.1 微服务概念

James Lewis and Martin Fowler (2014) 提出微服务完整概念。https://martinfowler.com/microservices/

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交互

  • 服务围绕业务功能拆分

  • 可以由全自动部署机制独立部署

  • 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术

2.2 分布式概念

  • 远程调用(RPC,一般使用http进行服务交互)

  • 服务发现(就是看哪些服务是可用的)

  • 负载均衡(让更多服务器平稳均衡的接入到应用中)

  • 服务容错(各种错误情况下的,需要有对应的处理方式)

  • 配置管理(配置中心,修改配置中心的配置让服务们自己同步)

  • 服务监控(多个服务以及云平台的资源消耗和健康状况)

  • 链路追踪(一个复杂的业务流程可能需要连续调用多个微服务,我们需要记录一个完整业务逻辑涉及的每一个微服务的运行状态,再通过可视化链路图展现,帮助软件工程师在系统出错时分析解决问题,常见的解决方案有Zipkin,SkyWalking)

  • 日志管理(微服务架构默认将应用日志分散保存在每一个微服务节点上,当系统进行用户行为分析、数据统计时必须收集所有节点日志数据,非常不方便。这时候我们需要一个独立的日志平台,收集所有节点的日志数据并可方便对其进行汇总分析,然后进行可视化展示,常见的解决方案有ELK(Elasticsearch+Logstash+Kibana),EFK(Elasticsearch+Fluentd+Kibana))

  • 任务调度(配置任务的触发方式)

  • ......

2.3 云原生概念

云原生(Cloud Native)

  • 服务自愈(其中一个服务出现错误怎么复原)

  • 弹性伸缩(根据不同的性能需求增加或减少服务器)

  • 服务隔离(同一台服务器中不同服务之间不相互影响)

  • 自动化部署(能自动将应用部署到云上)

  • 灰度发布(应用在多台服务器运行,先把应用部署在其中一两台上看运行效果,没有问题了再慢慢全部升级)

  • 流量治理(根据服务器性能分配流量)

  • ……

三、如何学习SpringBoot

3.1 官方文档架构

最新版本查看

Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。

Beta:也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出。

RC:(Release Candidate) 顾名思义么 ! 用在软件上就是候选版本。系统平台上就是发行候选版本。RC版不会再加入新的功能了,主要着重于除错。

GA:General Availability,正式发布的版本,在国外都是用GA来说明release版本的。

3.2 SpringBoot新特性

查看版本新特性;

https://github.com/spring-projects/spring-boot/wiki#release-notes

四、SpringBoot入门

4.1 HelloWorld

在开始前确认环境,java8,maven3.5+,idea中确认一下maven安装的是自己的目录,而不是idea默认的。

4.1.1 创建maven工程

创建一个普通的maven项目

4.1.2 引入依赖

pom文件中引入springboot父项目

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.6</version>
</parent>

引入web场景启动器,里面包含了springmvc等

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

4.1.3 创建主程序

创建MyApplication主程序类

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

注意:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
等价于
@SpringBootApplication

4.1.4 编写业务

创建HelloController类

@RestController
public class HelloController {

    @RequestMapping("/hello")
    String home() {
        return "Hello World!";
    }
}

注意:

@ResponseBody
@Controller
等价于
@RestController

4.1.5 测试

idea三种方式运行主程序

网页直接访问localhost:8080/hello,返回结果如下

4.1.6 简化配置

从上面的测试我们可以看到,SpringBoot启动后,默认端口是8080,我们可以添加一个总的配置文件来修改这个端口,在resources中新增一个application.properties文件,添加

server.port = 9090

重新启动主程序类,访问localhost:9090/hello,结果也返回了Hello World!,这个application中配置哪些东西,可以在官方文档中的配置属性

https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties.server

4.1.7 简化部署

SpringBoot项目默认打包方式jar的方式,首先引入springboot-mvn打包插件

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

然后在mvn中clean,再package,就可以发现target下多了一个jar包,直接通过java -jar命令就可以运行

注意:

cmd命令有个很坑的地方,启动之后,如果你点击一下窗口,项目就停止,以前很多项目tomcat项目拿startup启动的,深受其害,所以一般需要去除快速编辑功能

4.2 依赖管理

SpringBoot依赖管理通过我们引用的SpringBoot父项目启动器

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.6</version>
</parent>

而他的父项目是

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.5.6</version>
</parent>

dependencies中包含了SpringBoot2.5.6中所有默认的依赖

所以我们无需关注版本号,自动版本仲裁

1、引入依赖默认都可以不写版本
2、引入非版本仲裁的jar,要写版本号。

如果想要替换SpringBoot中默认版本,对应上dependencies中值,然后写上自己版本号

<properties>
    <mysql.version>5.1.43</mysql.version>
</properties>

4.3 自动配置

出了上面提到的,SpringBoot还自动帮我们引入了很多其他的配置

  • 自动配置了Tomcat,比如我们修改tomcat的端口
  • 自动配好Web常见功能,如:字符编码问题
  • 默认的包结构
    • 另外在以往Spring项目中都是需要配置包扫描的,SpringBoot已经默认帮我们做了,默认是主程序类所属包下的所有包及其子包当然我们也可以修改默认配置,两种方式
@SpringBootApplication(scanBasePackages="com.wuqiongda")
等同于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.wuqiongda")
  • 各种配置拥有默认值

    • 默认配置最终都是映射到某个类上,如:MultipartProperties
    • 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
  • 按需加载所有自动配置项

    • 非常多的starter
    • 引入了哪些场景这个场景的自动配置才会开启
    • SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面
  • ……

上面提到了很多次自动配置,SpringBoot是到底如何自动配置的,后面的章节会讲到。