SpringBoot入门

一、微服务发展进程

1、微服务含义

是一种架构风格,将业务拆分成模块,部署在不同的主机上提供结构,提供服务,通过http的方式通信.

2、发展历程

①、单体应用程序

将一个应用的所有应用服务都封在一个应用中,无论什么系统,都把数据库访问,web访问,

各个功能放在一个war包内

SpringBoot入门

好处:

Ⅰ、架构简单,项目开发成本低.
Ⅱ、所有项目模块部署到一起,对于小型项目来说,维护方便. 

缺点:

Ⅰ、所有模块耦合在一起,虽然对于小型项目来说,维护方便.但是,对于大型项目来说,却是不易开发和维护的.
Ⅱ、项目的各模块之前过于耦合,如果一旦有一个模块出现问题,则整个项目将不可用.
Ⅲ、无法针对某个具体模块来提升性能.
Ⅳ、无法对项目进行水平扩展.

②、垂直应用架构

随着企业业务的不断发展,发现单节点的单体应用不足以支撑业务的发展,于是企业会将单体应用部署多份,分别放在不同的服务器上。

但是,此时会发现不是所有的模块都会有比较大的访问量.如果想针对项目中的某些模块进行优化和性能提升,此时对于单体应用来说,是做不到的。

垂直应用架构,就是将原来一个项目应用进行拆分,将其拆分为互不想干的几个应用,以此来提升系统的整体性能

SpringBoot入门

 我们将单体应用架构拆分为垂直应用架构之后,一旦访问量变大,我们只需要针对访问量大的业务增加服务器节点即可,无需针对整个项目增加服务器节点了

好处:

Ⅰ、系统进行了拆分,可根据不同系统的访问情况,有针对性的进行优化.
Ⅱ、能够实现应用的水平扩展.
Ⅲ、各系统能够分担整体访问的流量,解决了并发问题.
Ⅳ、一个系统发生了故障,不应用其他系统的运行情况,提高了整体的容错率

缺点:

Ⅰ、拆分后的各系统之间相对比较独立,无法进行互相调用.
Ⅱ、各系统难免存在重叠的业务,会存在重复开发的业务,后期维护比较困难.

③、分布式架构

我们将系统演变为垂直应用架构之后,当垂直应用越来越多,重复编写的业务代码就会越来越多.

此时,我们需要将重复的代码抽象出来,形成统一的服务供其他系统或者业务模块来进行调用,系统就会演变为分布式架构.

在分布式架构中,我们会将系统整体拆分为服务层和表现层.服务层封装了具体的业务逻辑供表现层调用,表现层则负责处理与页面的交互操作.

SpringBoot入门

 好处:

Ⅰ、将重复的业务代码抽象出来,形成公共的访问服务,提高了代码的复用性.
Ⅱ、可以有针对性的对系统和服务进行性能优化,以提升整体的访问性能.

缺点:

Ⅰ、系统之间的耦合度变高,调用关系变得复杂,难以维护.
Ⅱ、系统之间交互需要远程通信,接口发开增加工作量

集群与分布式区别:

垂直拆分(分布式): 就是多个子系统互相协作才能完成整个业务流程,系统之间需要进行通信.

水平扩展(集群): 就是同一个工程部署到多台服务器上

④、SOA架构

在分布式架构下,当部署的服务越来越多,重复的代码就会越来越多,对于容量的评估,小服务资源的浪费等问题比较严重。

此时,我们就需要增加一个统一的调度中心来对集群进行实时管理.此时,系统就会演变为SOA(面向服务)的架构

SpringBoot入门

 好处:

Ⅰ、使用注册中心解决了各个服务之间的服务依赖和调用关系的自动注册与发现.

缺点:

Ⅰ、服务之间的依赖与调用关系复杂,测试部署的困难比较大.

⑤、微服务架构

随着业务的发展,我们在SOA架构的基础上进一步扩展,将其彻底拆分为微服务架构.

在微服务架构下,我们将一个大的项目拆分为一个个小的可以独立部署的微服务,每个微服务都有自己的数据库

SpringBoot入门

 好处:

Ⅰ、服务彻底拆分,各服务独立打包、独立部署和独立升级.
Ⅱ、每个微服务负责的业务比较清晰,利于后期扩展和维护.
Ⅲ、微服务之间可以采用REST和RPC协议进行通信.

缺点:

Ⅰ、涉及到各服务的容错性问题.
Ⅱ、涉及到数据的一致性问题.
Ⅲ、涉及到分布式事务问题.

微服务架构 = 80%的SOA服务架构思想 + 100%的组件化架构思想 + 80%的领域建模思想

二、SpringBoont基本启动

1、SpringBoot的含义:

Spring Boot是一个广泛用来构建Java微服务的框架,它基于Spring依赖注入框架来进行工作

.Spring Boot允许开发人员使用更少的配置来构建微服务,同时框架本身能够尽可能的减少开发人员的冲突.

自动化配置,一般情况下都有默认配置
提供一组流行的starter依赖,方便开发人员使用
简化应用打包
自动化配置,一般情况下都有默认配置

2、演示

①、新建文件

 SpringBoot入门

SpringBoot入门

建议使用阿里云服务器:将java版本改成8.0的,否则与sdk版本未对应,会报错,此图未改

SpringBoot入门

 SpringBoot入门

 ②、pom依赖

此处添加依赖时无需添加版本号,此文件spring-boot-dependencies-2.4.1.pom给出了所有的

版本号

<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
 </dependency>
<!--     自动集成tomcat和ssm   -->
 <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
 </dependency>

③、controller层

写此文件必须与Springboot02Application.java同包,否则无法解析。

SpringBoot入门

package com.lv.code.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class TestController {
    @RequestMapping("/home")
    public String home(){
        return "yes";
    }

}

不需配置tomcat服务,直接使用Springboot02Application.java运行

SpringBoot入门

SpringBoot入门

三、自动配置原理与yml注入

①、比较

Ⅰ、yml(支持松散绑定,复杂数据类型)
@ConfigurationProperties() 可以通过指定 prefix 指定加载的对象的前缀
如果对象的数据不在 application.xml 中,则需要通过 @PropertySource() 指定文件加载,并且需要配
合 @Value("${xx}") 标签

Ⅱ、properties(不支持松散绑定)
与上面类似,需要配合 @Value("${xx}") 使用

可在application.properties文件中修改端口号

# 应用名称
spring.application.name=springboot02
#修改端口号
server.port=8081

 可删掉这个文件,spring推荐使用yaml文件,文件名缩写为.yml

SpringBoot入门

使用这个文件写的内容具有层级关系,更易于查看

 优先级关系:先加载 properties 再加载 yml,但是取名都必须是以application开头,后缀可yml,也可properties

1. config/application.properties(项目根目录中config目录下)
2. config/application.yml
3. application.properties(项目根目录下)
4. application.yml
5. resources/config/application.properties(项目resources目录中config目录下)
6. resources/config/application.yml
7. resources/application.properties(项目的resources目录下)
8. resources/application.yml

①、依赖注入

数据:Student

package com.lv.code.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
@Data
//无参
@NoArgsConstructor
//有参
@AllArgsConstructor
//这个类的属性由student注入,只有yml支持
@ConfigurationProperties(prefix = "student")
public class Student {

//    yml与properties都支持
    @Value("${name}")
    private String userName;
    private int userAge;
    private List<String> userAihao = new ArrayList<>();
    private Map<Integer,String> userMap=new HashMap<>();

}

将属性写入配置文件application.yml

spring:
  profiles:
    active: dev
student:
  user_name:小明
  user_age:19
  user_aihao:
    - 跳舞
    - 唱歌
    - 打游戏
  user_map: { 1: 浏览,2: kk }

在Springboot02ApplicationTests.java中注解集成Spring,并且注入数据

package com.lv.code;

import com.lv.code.pojo.Student;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;

//集成spring环境
@ExtendWith(SpringExtension.class)
@SpringBootTest
class Springboot02ApplicationTests {

    @Autowired
    private Student student;

    @Test
    void contextLoads() {
        System.out.println(student);
    }

}

报错:未影响执行,也可打开文档,导入依赖到 pom,xml

SpringBoot入门

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-configuration-processor</artifactId>

<optional>true</optional>

</dependency>

四、多环境配置

①、命名要求:

application.yaml ——》正常情况
application-dev.yaml ——》开发情况
application-test.yaml ——》测试情况

②、可以通过 spring.profiles.active=profile 来完成配置指定

spring:
profiles:
 active: test

如:

新建测试文件:application-dev.yaml

server:
  port: 8081

正常总文件就可以直接引用:application.yaml

spring:
  profiles:
    active: dev
student:
  user_name:小明

本期内容结束!~~~~~(有待提高)

上一篇:SpringMVC HandlerMethodArgumentResolver自定义参数转换器


下一篇:15个经典面试问题及回答思路,Java开发需要掌握的技术