初学:springboot

SpringBoot

一、基本概念

1.1、SpringBoot基本概念

  • 作用:Spring Boot是开发者和Spring 本身框架的中间层,帮助开发者统筹管理应用的配置提供基于实际开发中常见配置的默认处理,简化开发、运维

  • 优势:简化开发过程中引入或启动相关Spring 功能的配置。是开发者降低框架关注,着重业务代码

  • 应用:Spring Boot的精简理念又使其成为Java微服务开发的首选,Spring Boot其实就是为了微服务而生的Java web框架。Spring Boot已经在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。


1.2、微服务的基本概念

1.2.1、微服务

概念:是一种架构风格。将复杂软件应用分为多个微服务组成,系统中的各个微服务可以被独立部署,各个微服务之间是松耦合的,每个微服务仅仅关注于完成自己的任务。

特点:1) 多个微服务构建复杂的系统;2)每个服务可以独立部署;3)低耦合,高内聚

  • 内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内元素彼此之间结合的紧密程度的度量。

  • 耦合性:又称块间联系。指软件系统各模块之间相互紧密联系程度的一种度量。

  • 功能内聚:内聚性等级最高的为功能内聚,判断一个模块是否功能内聚,一般从模块名称就能看出。如果模块名称只有一个动词和一个特定的目标(单数名词),一般来说就是功能内聚。功能内聚模块的一个重要特点是:他是一个“暗盒”,对于该模块的调用者来说,只需要知道这个模块能做什么,而不需要知道这个模块是如何做的。

  • 非直接耦合:耦合度最弱,模块独立性最强。两个模块之间没有直接关系,之间的联系完全是通过主模块控制和调用来实现的。

优点:测试方便;利于团队协作和系统迭代;可伸缩性与可靠性强;跨语言程度会更加灵活。

缺点:运维成本过高,部署数量较多;接口兼容多版本;分布式系统的复杂性;分布式事务。

1.2.2、微服务设计原则

四大原则:

  • AKF分拆原则;

  • 前端后端分离原则;

  • 无状态服务;

  • RestFul的通行风格;

1)AKF分拆原则

AKF拓展立方

AKF扩展立方体(Scalability Cube):每个轴线描述扩展性的一个维度,他们分别是产品、流程和团队。

X轴 —— 代表无差别的克隆服务和数据,工作可以很均匀的分散在不同的服务实例上(微服务一般理解就是这个);

Y轴 —— 关注应用中职责的划分,比如数据类型,交易执行类型的划分;

Z轴 —— 关注服务和数据的优先级划分,如分地域划分;

...(内容较深,未完待续)

 

2)前后端分离原则

前后端分离的原则,简单的来讲就是前端和后端代码的分离,我们推荐的模式是最好采用物理分离的办法部署,进一步促使更加彻底的分离。Jsp的模板技术,融合了HTML和Java的代码,如果继续直接使用服务器端模板技术,如jsp把java,js,html,css都堆到一个页面中,稍微有点复杂一点的页面就没有办法维护了。

优势:

  • 利于优化:前后端技术分离,可以由各自的专家来对各自的领域进行优化,这样前端用户体验优化效果更好。

  • 利于维护:分离模式下,前后端交互界面更清晰,就剩下接口模型,后端的接口简介明了,更容易维护。

  • 不同前端可以共用相同的后台:前端多渠道集成场景更容易实现,后端服务器无需变更,采用统一的数据和模型,可以支持多个前端,例如微信H5前端,PC前端,Android前端,IOS前端。

 

3)无状态服务

状态与状态服务:如果一个数据需要被多个服务共享,才能完成一笔交易,那么和这个数据被称为状态。进而依赖这个状态的数据的服务被称为是状态服务,反之称为无状态服务。状态服务依赖缓存数据,无状态服务自己独立。

无状态服务原则:并不是说在微服务里就不允许存在状态,表达的真实意思是要把所有状态的业务服务改变为无状态的计算类服务,那么状态数据也就是相应的迁移到对应的有状态数据服务中。将状态迁移至状态服务中,这样状态服务就相对独立,对数据的操作也不影响其它服务。

无状态

4)RestFul风格

本来应该是一个“无状态通信原则”,这里直接推荐一个实践优选的RestFul通信风格,因为优势明显。

优势:

  • 无状态协议HTTP,具备先天优势,扩展能力很强,例如需要安全加密,有现有的成熟解决方案HTTPS即可

  • JSON报文序列化,轻量简单,人与机器均可读,学习成本低,搜索引擎友好

  • 语言无关,各大热门语言都提供了成熟的RestFul API 框架,相对其他的一些RPC框架生态更加完整。

...(尚未深入理解,未完待续)


1.3、分布式的基本概念

 

二、SpringBoot入门


2.1、创建一个SpringBoot程序

1)在spring的官网中提供了一个快速生成springboot项目的网站

spring官网

在官网中通过:Quickstart Your Project 生成springboot项目,再导入idea开发。

2)IDEA集成了上述网站,可以直接使用idea创建springboot项目

3)创建Maven项目,自己导入依赖


2.2、SpringBoot的pom.xml

2.2.1、自动生成springboot的pom.xml 内容结构

1)用父结构来控制各种依赖的版本

<!-- 父结构 -->
<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.5.4</version>
   <relativePath/> <!-- lookup parent from repository -->
</parent>

2)java的jdk版本设置,创建springboot工程时有过选择,之后可以修改

<!-- 设置JDK的版本 -->
<properties>
<java.version>1.8</java.version>
</properties>

3)如果我们创建的是web项目,springboot会自动导入几个依赖

<dependencies>
   <!-- 引入了web的功能包: Servlet, Spring, SpringMVC -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
<!-- springboot内置了tomcat -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-tomcat</artifactId>
       <scope>provided</scope>
   </dependency>
<!-- 测试包 -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
   </dependency>
</dependencies>

由于不需要自己选择spring系列依赖的版本,由父依赖统一管理,不会出现版本冲突的状况。

2.2.2、springboot依赖管理及版本管理的原理

1)父工程

spring-boot-dependencies:核心依赖版本在父工程中!很多依赖不需要我们自己手动配置版本,springboot帮我们做好,不会出现版本冲突

<groupId>org.springframework.boot</groupId> <!-- 点击进入 -->

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-dependencies</artifactId>   <!-- 点击进入 -->
   <version>2.5.4</version>
</parent>

<jmustache.version>1.15</jmustache.version>
<johnzon.version>1.2.14</johnzon.version>
<jolokia.version>1.6.2</jolokia.version>
<jooq.version>3.14.13</jooq.version>
<json-path.version>2.5.0</json-path.version>      <!-- 发现全部是相关版本 -->
...

2)启动器

定义:Boot会将一个个项目场景做成一个个starter启动器,项目中涉及到什么场景就引入什么启动器,项目中引入这些启动器之后,和这个starter相关的依赖也会被引入。我们也可以自定义自己的场景启动器。

<!-- web的启动器 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- 点击进入后,发现会引入如下依赖 -->
<dependencies>
   <!-- 这是Spring Boot的核心启动器,包含了自动配置、日志和YAML -->
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter</artifactId>
     <version>2.5.4</version>
     <scope>compile</scope>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-json</artifactId>
     <version>2.5.4</version>
     <scope>compile</scope>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-tomcat</artifactId>
     <version>2.5.4</version>
     <scope>compile</scope>
   </dependency>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-web</artifactId>
     <version>5.3.9</version>
     <scope>compile</scope>
   </dependency>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
     <version>5.3.9</version>
     <scope>compile</scope>
   </dependency>
 </dependencies>
  • 本质是springboot的启动场景

  • 比如:spring-boot-starter-web,它会自动帮我们导入web环境所有的依赖!

  • springboot会将所有的功能场景,都变成一个个的启动器

  • 我们需要使用什么功能,就需要找到对应的启动器就可以了starter


2.3、SpringBoot的启动类

//@SpringBootApplication:标注这个类是一个springboot的应用
@SpringBootApplication
public class Springboot01HellowordApplication {
   public static void main(String[] args) {
       //将springboot应用启动
       SpringApplication.run(Springboot01HellowordApplication.class, args);
  }
}

进行注解解读:

@SpringBootApplication    //点击此注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration  //springboot的配置
@EnableAutoConfiguration  //自动配置
@ComponentScan(     //实例化扫描
   excludeFilters = {@Filter(
   type = FilterType.CUSTOM,
   classes = {TypeExcludeFilter.class}
), @Filter(
   type = FilterType.CUSTOM,
   classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {...}

 

@SpringBootConfiguration  //springboot的配置(点击进入下面)
@Configuration //spring的配置类 (点击进入下面)
public @interface SpringBootConfiguration {...}
       @Component //说明这也是spring的一个组件(点击进入下面)
       public @interface Configuration {...}

@EnableAutoConfiguration //自动配置

(内容很深,未完待续 ...)


2.4、yaml文件

2.4.1、相关概念

springboot的配置文件:用于修改 springboot 自动配置的默认值,因为 springboot 在底层都给自动好了。

配置文件名称:是固定的,有两种(或者算三种)。

  • application.properties

    • 语法结构:key = value

  • application.yml

    • 语法结构:key:空格 value

YAML文件:并不想作为一种置标语言,但是现在任然算一种简化版的置标语言。(Yet Another Markup Language)

2.4.2、yaml语法格式

#普通键值对
name: liangxin

#对象
shuaige:
name:liangxin
age:26

#行内写法
shuaige{name:liangxin,age:26}

#对象包含的引用对象(包括放进容器里面的)
shuaige:
name:liangxin
age:26
GirlFriend:
name:hanyue
age:27

#数组
pets
-cat
-dog
-pig

pets:[cat,dog,pig]

(未完待续,敬请期待...)

三、SpringBoot关于Mybatis(或plus版)的配置

3.1、依赖资源导入

<!-- 连接池 -->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid</artifactId>
   <version>1.1.6</version>
</dependency>

<!-- 引入JDBC的包 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- 引入mysql的包 -->
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.46</version>
</dependency>

<!-- 引入mybatis-plus -->
<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>2.3</version>
</dependency>

3.2、yaml配置文件

# 进行spring的配置
spring:
 #配置连接池
datasource:
  driver-class-name: com.mysql.jdbc.Driver
  url: jdbc:mysql://127.0.0.1:3306/zuoye?useUnicode=true&characterEncoding=UTF-8
  username: root
  password: 123

mybatis-plus:
 # 设置mapper包路径
type-aliases-package: com.hxzy.vuelx.dao
 # 进行日志设置
configuration:
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

 

四、SpringBoot的Web开发

4.1、静态资源处理

在spingboot中,我们可以使用以下方式处理静态资源


补充:SpringBoot的相关配置

JSR303数据校验

定义:在字段增加一层过滤器验证,保证数据的合法性。

(尝试失败...)

SpringBoot的多环境配置

配置文件的加载顺序:

  1. file:./config

  2. file:./

  3. classpath:/config/

  4. classpath:/

方式一:

创建其它的XXXX.properties文件。

例如:

  • application.properties

  • application-dev.properties

  • application-test.properties

加载配置文件时仅加载application.properties,但是我们可以选择激活某个文件。

#application.properties文件内容
#springboot的多环境配置:可以选择激活某个文件
spring.profiles.active=test         #指定激活文件

 

#application-test.properties文件内容
server.port=8081

文件命名格式是严格要求的。

方式二(推荐):

仅创建application.yml文件

server:
port: 8081
spring:
profiles:
  active: dev     #指定激活文件

---
server:
port: 8082
spring:
profiles:dev     #指定配置文件名

---
server:
port: 8083
Spring:
profiles:test
posted @ 2021-09-12 23:02  打盹的闲鱼  阅读(538)  评论(0)    收藏  举报