架构

目前市面上的软件主要可分为两种:

BS:(Browser/Server,浏览器/服务器架构模式)

CS:(Client/Server,客户端/服务器架构模式)

  • 对比

C/S架构主要特点是交互性强,具有安全访问模式,网络流量低,响应速度快,因为客户端负责大多数业务逻辑和UI演示,所以也被称为胖客户端,C/S结构的软件需要针对不同的操作系统开发不同版本的软件

随着互联网的兴起,CS架构不适合Web,最大的原因是Web应用程序的修改和升级非常迅速,而CS架构需要每个客户端逐个升级桌面App,因此,Browser/Server模式开始流行,简称BS架构

B/S架构的主要特点是分散性高、维护方便、开发简单、共享性高、总拥有成本低

  • BS架构原理

在BS架构下,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端

浏览器只需要请求服务器,获取Web页面,并把Web页面展示给用户即可

java环境安装

JDK

IDEA

Maven

Maven 是一个项目管理工具,可以对 Java 项目进行自动化的构建和依赖管理

Maven的作用可以分成三类:

项目构建:提供标准的,跨平台的自动化构建项目的方式

依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突等问题

统一开发结构:提供标准的,统一的项目开发结构

SpringBoot

Spring Boot是由Pivotal团队提供的基于Spring的全新框架,旨在简化Spring应用的初始搭建和开发过程

Spring Boot是所有基于Spring开发项目的起点

Spring Boot就是尽可能地简化应用开发的门槛,让应用开发、测试、部署变得更加简单

特点

遵循“约定优于配置”的原则,只需要很少的配置或使用默认的配置

能够使用内嵌的Tomcat、Jetty服务器,不需要部署war文件

提供定制化的启动器Starters,简化Maven配置,开箱即用

纯Java配置,没有代码生成,也不需要XML配置

提供了生产级的服务监控方案,如安全监控、应用监控、健康检测等

开发环境热部署

在实际的项目开发调试过程中会频繁地修改后台类文件,导致需要重新编译、重新启动,整个过程非常麻烦,影响开发效率

Spring Boot提供了spring-boot-devtools组件,使得无须手动重启SpringBoot应用即可重新编译、启动项目,大大缩短编译启动的时间

devtools会监听classpath下的文件变动,触发Restart类加载器重新加载该类,从而实现类文件和属性文件的热部署

并不是所有的更改都需要重启应用(如静态资源、视图模板),可以通过设置spring.devtools.restart.exclude属性来指定一些文件或目录的修改不用重启应用

Web

Spring Boot将传统Web开发的mvc、json、tomcat等框架整合,提供了spring-boot-starter-web组件,简化了Web应用配置

创建SpringBoot项目勾选Spring Web选项后,会自动将spring-boot-starter- web组件加入到项目中

spring-boot-starter-web启动器主要包括web、webmvc、json、tomcat等基础依赖组件,作用是提供Web开发场景所需的所有底层依赖

webmvc为Web开发的基础框架,json为JSON数据解析组件,tomcat为自带的容器依赖

控制器

Spring Boot提供了@Controller和@RestController两种注解来标识此类负责接收和处理HTTP请求

如果请求的是页面和数据,使用@Controller注解即可;如果只是请求数据,则可以使用@RestController注解

因为现在一般是前后端分离的项目,所以使用@RestController注解

路由映射

@RequestMapping注解主要负责URL的路由映射。它可以添加在Controller类或者具体的方法上

如果添加在Controller类上,则这个Controller中的所有路由映射都将会加上此映射规则,如果添加在方法上,则只对当前方法生效

@RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则。常用的属性参数如下:

value: 请求URL的路径,支持URL模板、正则表达式

method: HTTP请求方法

consumes: 请求的媒体类型(Content-Type),如application/json

produces: 响应的媒体类型

params,headers: 请求的参数及请求头的值

URL映射

@RequestMapping注解主要负责URL的路由映射。它可以添加在Controller类或者具体的方法上

如果添加在Controller类上,则这个Controller中的所有路由映射都将会加上此映射规则,如果添加在方法上,则只对当前方法生效

@RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则。常用的属性参数如下:

value: 请求URL的路径,支持URL模板、正则表达式

method: HTTP请求方法

consumes: 请求的媒体类型(Content-Type),如application/json

produces: 响应的媒体类型

params,headers: 请求的参数及请求头的值

静态资源访问

使用IDEA创建Spring Boot项目,会默认创建出classpath:/static/目录,静态资源一般放在这个目录下即可

如果默认的静态资源过滤策略不能满足开发需求,也可以自定义静态资源过滤策略

在application.properties中直接定义过滤规则和静态资源位置

过滤规则为/static/**,静态资源位置为classpath:/static/

文件上传

表单

拦截器

权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回
登录页面

性能监控:有时系统在某段时间莫名其妙很慢,可以通过拦截器在进入处理程
序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间

通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有提取Locale、Theme信息等,

只要是多个处理程序都需要的,即可使用拦截器实现

Spring Boot定义了HandlerInterceptor接口来实现自定义拦截器的功能

HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion
三种方法,通过重写这三种方法实现请求前、请求后等操作

构建 RESTful 服务

RESTful介绍

RESTful是目前流行的互联网软件服务架构设计风格

REST并不是一个标准,它更像一组客户端和服务端交互时的架构理念和设计原则,基于这种架构理念和设计原则的Web API更加简洁,更有层次

特点:

每一个URI代表一种资源

客户端使用GET、POST、PUT、DELETE四种表示操作方式的动词对服务端资源进行操作

通过操作资源的表现形式来实现服务端请求操作

资源的表现形式是JSON或者HTML

客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都包含必需的信息

构建RESTful应用接口

API

符合RESTful规范的Web API需要具备如下两个关键特性:

安全性:安全的方法被期望不会产生任何副作用,当我们使用GET操作获取资源时,不会引起资源本身的改变,也不会引起服务器状态的改变

幂等性:幂等的方法保证了重复进行一个请求和一次请求的效果相同(并不是指响应总是相同的,而是指服务器上资源的状态从第一次请求后就不再改变了),在数学上幂等性是指N次变换和一次变换相同

HTTP Method

HTTP提供了POST、GET、PUT、DELETE等操作类型对某个Web资源进行Create、Read、Update和Delete操作

一个HTTP请求除了利用URI标志目标资源之外,还需要通过HTTP Method指定针对该资源的操作类型

HTTP状态码

HTTP状态码就是服务向用户返回的状态码和提示信息,客户端的每一次请求,服务都必须给出回应,回应包括HTTP状态码和数据两部分

HTTP定义了40个标准状态码,可用于传达客户端请求的结果。状态码分为以下5个类别:

1xx:信息,通信传输协议级信息

2xx:成功,表示客户端的请求已成功接受

3xx:重定向,表示客户端必须执行一些其他操作才能完成其请求

4xx:客户端错误,此类错误状态码指向客户端

5xx:服务器错误,服务器负责这写错误状态

Spring Boot实现RESTful API

Spring Boot提供的spring-boot-starter-web组件完全支持开发RESTful API,提供了与REST操作方式(GET、POST、PUT、DELETE)对应的注解

@GetMapping:处理GET请求,获取资源

@PostMapping:处理POST请求,新增资源

@PutMapping:处理PUT请求,更新资源

@DeleteMapping:处理DELETE请求,删除资源

@PatchMapping:处理PATCH请求,用于部分更新资源

在RESTful架构中,每个网址代表一种资源,所以URI中建议不要包含动词,只包含名词即可,而且所用的名词往往与数据库的表格名对应

使用Swagger生成Web API文档

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,是非常流行的API表达工具

Swagger能够自动生成完善的RESTful API文档,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API

在Spring Boot项目中集成Swagger只需在项目中引入springfox-swagger2和springfox-swagger-ui依赖即可

启动项目访问 http://127.0.0.1:8080/swagger-ui.html ,即可打开自动生成的可视化测试页面

MybatisPlus 快速上手

ORM介绍

ORM(Object Relational Mapping,对象关系映射)是为了解决面向对象与关系数据库存在的互不匹配现象的一种技术

ORM通过使用描述对象和数据库之间映射的元数据将程序中的对象自动持久化到关系数据库中

ORM框架的本质是简化编程中操作数据库的编码

MyBatis-Plus介绍

MyBatis是一款优秀的数据持久层ORM框架,被广泛地应用于应用系统

MyBatis能够非常灵活地实现动态SQL,可以使用XML或注解来配置和映射原生信息,能够轻松地将Java的POJO(Plain Ordinary Java Object,普通的Java对象)与数据库中的表和字段进行映射关联

MyBatis-Plus是一个 MyBatis 的增强工具,在 MyBatis 的基础上做了增强,简化了开发

MyBatis-Plus CRUD操作

看官方文档即可

多表查询及分页查询

多表查询

实现复杂关系映射,可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置

分页查询

跨域认证

Session认证

互联网服务离不开用户认证:

  1. 用户向服务器发送用户名和密码

  2. 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等

  3. 服务器向用户返回一个 session_id,写入用户的 Cookie

  4. 用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器

  5. 服务器收到 session_id,找到前期保存的数据,由此得知用户的身份

session 认证的方式应用非常普遍,但也存在一些问题,扩展性不好,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session,针对此种问题一般有两种方案:

  1. 一种解决方案是session 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大

  2. 一种方案是服务器不再保存 session 数据,所有数据都保存在客户端,每次请求都发回服务器。Token认证就是这种方案的一个代表

Token认证

Token 是在服务端产生的一串字符串,是客户端访问资源接口(API)时所需要的资源凭证,流程如下:

  1. 客户端使用用户名跟密码请求登录,服务端收到请求,去验证用户名与密码

  2. 验证成功后,服务端会签发一个 token 并把这个 token 发送给客户端

  3. 客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者localStorage 里

  4. 客户端每次向服务端请求资源的时候需要带着服务端签发的 token

  5. 服务端收到请求,然后去验证客户端请求里面带着的 token ,如果验证成功,就向客户端返回请求的数据

特点:

基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放token 数据

用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库

token 完全由应用管理,所以它可以避开同源策略

JWT的使用

JSON Web Token(简称 JWT)是一个token的具体实现方式,是目前最流行的跨域认证解决方案

JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户

用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份

为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名

JWT 的由三个部分组成,依次如下:

Header(头部)

Payload(负载)

Signature(签名)

三部分最终组合为完整的字符串,中间使用 . 分隔,Header.Payload.Signature

特点:

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在localStorage

客户端每次与服务器通信,都要带上这个 JWT,可以把它放在 Cookie 里面自动发送,但是这样不能跨域

更好的做法是放在 HTTP 请求的头信息Authorization字段里面,单独发送

云服务器使用

云服务器介绍

云服务器(Elastic Compute Service, ECS)是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。其管理方式比物理服务器更简单高效

用户无需提前购买硬件,即可迅速创建或释放任意多台云服务器

特点:

ECS的最重要的特点是弹性,支持垂直和水平扩展两种能力

ECS一般提供自动宕机迁移、数据备份和回滚、系统性能报警等功能,稳定性更高

阿里云ECS的使用

地址:https://www.aliyun.com/

云服务器远程连接

使用XShell远程连接服务器

具体操作可看网上博客

云端环境配置

项目云端部署