Spring Boot
Spring Boot概述
一、微服务概述
1、微服务
- 微服务(Microservices)是一种软件架构风格。
- 微服务是以专注单一责任与功能的小型功能区块 (Small Building Blocks)为基础;利用模块化的方式组合出复杂的大型应用程序;各功能区块使用与语言无关 (Language-Independent/Language agnostic)的API集相互通信。
- 2014年,Martin Fowler 与 James Lewis 共同提出了微服务的概念,定义了微服务是以开发一组小型服务的方式来开发一个独立的应用系统的。 
  - 其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API这样轻量的机制来相互通信。
- 这些微服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。
- 这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。
- 这些微服务我们仅做最低限度的集中管理。
 
2、单体应用
(1)单体应用
- 一个单块应用系统 是以一个 单个 单元的方式来构建的。
- 企业应用系统经常包含三个主要部分:客户端用户界面、数据库和服务端应用系统。 
  - 这里的服务端应用系统就是一个单体的应用,新构建部署一个新版本的服务端应用系统。
 
- 。针对单体应用,当访问量变大时,通常采用负载均衡,横向扩展的方式将多个单体应用部署到多个服务器上访问。
(2)单体应用缺点
- 软件变更受到了很大的限制,应用系统的一个很小的部分的一处变更,也需要将整个单块应用系统进行重新构建和部署。
- 不能根据用户需求部署应用系统中的功能模块,只能扩展部署整个应用系统。
3、单一应用和微服务对比

4、微服务应用搭建

搭建一个微服务,运维和部署变得非常复杂,Spring提供了一套解决方案
-  Spring Boot:快速搭建单个服务。 
-  Spring Cloud:是一系列有序框架的集合,其主要的设施有 - 发现与注册
- 配置中心
- 消息总线
- 负载均衡
- 断路器
- 数据监控等
 通过Spring Boot的方式,可以实现一键启动,和部署。 
-  Spring cloud data flow:为基于微服务的分布式流处理和批处理数据通道提供了一系列模型和最佳实践 

二、Spring Boot简介
- Spring Boot是由Pivotal团队提供的全新框架。
- 目的:用来简化新Spring应用的初始搭建以及开发过程
- Spring Boot默认配置了很多框架的使用方式,就像maven整合了所有的jar包,Spring-Boot整合了其他相关联框架。
三、Spring Boot的优势
- 快速构建项目。
- 对主流开发框架的无配置集成。
- 项目可独立运行,无须外部依赖Servlet容器。
- 提供运行时的应用监控。
- 极大的提高了开发、部署效率。
- 与云计算的天然集成。
四、Spring Boot的核心功能介绍
- 独立运行Spring项目 
  - Spring Boot可以以jar包形式独立运行,运行一个Spring Boot项目只需要通过java -jar xx.jar来运行。
 
- 内嵌servlet容器 
  - Spring Boot可以选择内嵌Tomcat、jetty或者Undertow,这样我们无须以war包形式部署项目。
 
- 提供starter简化Maven配置 
  - spring提供了一系列的start pom来简化Maven的依赖加载,,例如,当你使用了spring-boot-starter-web,会自动加入依赖包。
 
- 自动装配Spring 
  - Spring Boot会根据在类路径中的jar包、类,为jar包里面的类自动配置Bean,这样会极大地减少我们要使用的配置。
- Spring Boot只考虑大多数的开发场景,并不是所有的场景,若在实际开发中我们需要配置Bean,而Spring Boot没有提供支持,则可以自定义自动配置。
 
- 准生产的应用监控 
  - Spring Boot提供基于http ssh telnet对运行时的项目进行监控。
 
- 无代码生产和xml配置 
  - Spring Boot不是借助与代码生成来实现的,而是通过条件注解来实现的,这是Spring4.x提供的新特性。
 
Spring Boot入门
一、创建SpringBoot模块
1、第一步

2、第二步
- type:是maven
- javaVersion:8

3、第三步
- SpringBoot Version:是与上一步的JavaVersion对应,2.7.11,最低版本。

- 第一次创建的时间很长,是因为要下载相应的资源
二、入门项目测试
1、项目结构

2、编写测试代码
(1)导入依赖,pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!--依赖父亲maven-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.etime</groupId>
    <artifactId>day0423</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>day0423</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!--在SpringBoot在引入web,由启动器 (starter) 完成-->
        <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>
        <!--引入Lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
    </dependencies>
    <!--构建插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
(2)实体类
- 学生类
package com.etime.day0423.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {
    private int sid;
    private String name;
    private String gender;
    private Date birthday;
    private String s_class;
    private String photo;
}
(3)在控制层创建StudentController.java
package com.etime.day0423.controller;
import com.etime.day0423.pojo.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/student")
public class StudentController {
    
    @GetMapping("t01")
    @ResponseBody
    public Student test01(){
        return new Student(1,"li","男",null,"111","li1.jpg");
    }
}
(4)找到Springboot01Application.java,运行主函数

(5)使用Postman测试

(6)使用@RestController注解
- @RestController = @Controller + @ResponseBody。
- @RestController:注册控制器、该控制器中所有方法有返回值,都自动转换为JSON格式(除了字符串以外)
- 若返回值是字符串,他不会转换为JSON格式,返回的就是一个字符串
package com.etime.day0423.controller;
import com.etime.day0423.pojo.Student;;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
public class StudentController {
    @GetMapping("/student/{sid}")
    public Student getUserByUid(@PathVariable("sid") int sid) {
        System.out.println("查询id为 "+sid);
        return new Student(1,"li","男",null,"111","li1.jpg");
    }
    @GetMapping("/student")
    public List<Student> getAllUser() {
        Student s1 = new Student(1,"li-1","男",null,"111","li1.jpg");
        Student s2 = new Student(2,"li-2","男",null,"112","li2.jpg");
        Student s3 = new Student(3,"li-3","男",null,"113","li3.jpg");
        List<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        return list;
    }
    @PostMapping("/student")
    public boolean addUser(Student student) {
        System.out.println(student);
        return true;
    }
 
    @PutMapping("/student")
    public boolean updateUser(Student student) {
        System.out.println("修改学生信息 :"+student);
        return false;
    }
    @DeleteMapping("/student/{id}")
    public boolean deleteUser(@PathVariable("id") int sid) {
        System.out.println("删除:"+sid);
        return true;
    }
}
Spring Boot热部署
一、Spring Boot热部署概述
1、为什么要热部署
 在实际的项目开发调试过程中会频繁地修改后台类文件,导致需要重新编译、重新启动,整个过程非常麻烦,影响开发效率。
2、热部署好处
 Spring Boot提供了spring-boot-devtools组件,使得无须手动重启SpringBoot应用即可重新编译、启动项目,大大缩短编译启动的时间。
- devtools会监听classpath下的文件变动,触发Restart类加载器重新加载该类,从而实现类文件和属性文件的热部署。
- 并不是所有的更改都需要重启应用(如静态资源、视图模板),可以通过设置spring.devtools.restart.exclude属性来指定一些文件或目录的修改不用重启应用。
二、项目配置热部署
1、导入依赖,在pom.xml中
<!--引入热部署-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>
2、在application.properties配置信息
- spring.devtools.restart.enabled 
  - true:开启热部署
- false:关闭热部署
 
- spring.devtools.restart.additional-paths 
  - 会监听classpath下的文件变动
 
- spring.devtools.restart.exclude 
  - 指定文件或目录的修改不用重启应用
 
spring.devtools.restart.enabled=true
spring.devtools.restart.additional-paths=src/main/java
spring.devtools.restart.exclude=static/**
3、在 setting 中配置

4、在Registry中配置
- 进入方式:Ctrl+Shift+Alt+/

5、测试
- 修改java包下的任意代码
Spring Boot配置文件
一、YAML
- YAML,全称:YAML Aint Markup Language),是一种标记语言。
- 通常以.yml或者.yaml为后缀的文件
- 是一种直观的能够被电脑识别的数据序列化格式,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,一种专门用来写配置文件的语言。
- 可用于如: Java,C/C++, Ruby, Python, Perl, C#, PHP等
二、使用YAML
1、将application.properties文件的后缀名改为yml
spring:
  devtools:
    restart:
      enabled: true
      additional-exclude: "src/main/java"
      exclude: "static/**"
2、再次测试
- 修改java包下的任意代码
Spring Boot静态资源
一、在static中新建文件夹,随机将一张图片放入该文件夹
1、目录结构

2、通过访问进行测试
- 静态资源放入static,SpringBoot会自动将资源加载到服务器上,重启即可。
- 注意文件夹的创建方式与创建包不同
- 注意文件夹名称与控制层的请求地址,不能重名。
  










