Spring Boot 学习笔记

Spring Boot 学习笔记

Scroll Down

Spring Boot 概述

约定优于配置

约定优于配置(Convention Over Configuration),也称为按照约定编程,是一种软件设计模式,旨在减少软件开发人员需要做决定的数量、获得简单的好处,而又不失灵活性。

Spring Boot 体系将约定优于配置的思想展现得淋淋淋淋尽致,⼩小到配置⽂文件,中间件的默认配置,⼤大到内置容器器、⽣生态中的各种 Starters ⽆无不不遵循此设计规则。Spring Boot ⿎鼓励各软件组织⽅方创建⾃自⼰己的 Starter,创建Starter 的核⼼心组件之⼀一就是 autoconfigure 模块,也是 Starter 的核⼼心功能,在启动的时候进⾏行行⾃自动装配,属性默认化配置。

Spring Boot 约定优于配置的思想让Spring Boot 项⽬目⾮非常容易易上⼿手,让编程变的更更简单,其实编程本该很简单,简单才是编程的美。

Starters

Spring Boot Starters 基于约定优于配置的思想设计,其有两个核心组件:自动配置代码和提供自动配置模块和其他有用的依赖。

在传统的Maven项目中我们通常将一些层、组件拆分为模块来管理,在Spring Boot中我们可以使用starter 来实现此目的。

常用的Starter列表: Spring Boot application starters

Spring、Spring Boot、Spring Cloud的关系

Spring 最初核⼼心的两⼤大核⼼心功能 Spring IoC 和 Spring Aop 成就了了 Spring,Spring 在这两⼤大核⼼心功能上不不断的发展,才有了了 Spring 事务、Spring MVC 等⼀一系列列伟⼤大的产品,最终成就了了 Spring 帝国,到了了后期Spring ⼏几乎可以解决企业开发中的所有问题。

Spring Boot 是在强⼤大的 Spring 帝国⽣生态基础上⾯面发展⽽而来,发明 Spring Boot 不不是为了了取代 Spring,是为了了让⼈人们更更容易易的使⽤用 Spring。所以说没有 Spring 强⼤大的功能和⽣生态,就不不会有后期的 Spring Boot ⽕火热,Spring Boot 使⽤用约定优于配置的理理念,重新重构了了 Spring 的使⽤用,让 Spring 后续的发展更有生命⼒。

Spring Cloud 是⼀一系列列框架的有序集合,它利利⽤用 Spring Boot 的开发便便利利性巧妙地简化了了分布式系统基础设施的开发,如服务发现注册、配置中⼼心、消息总线、负载均衡、断路器、数据监控等,都可以⽤用 Spring Boot的开发⻛风格做到⼀一键启动和部署。

Spring Cloud 是为了了解决微服务架构中服务治理理⽽而提供的⼀一系列列功能的开发框架,并且 Spring Cloud 是完全基于 Spring Boot ⽽而开发,Spring Cloud 利利⽤用 Spring Boot 特性整合了了开源⾏行行业中优秀的组件,整体对外提供了⼀套在微服务架构中服务治理理的解决⽅方案。

正是由于 Spring IoC 和 Spring Aop 两个强⼤的功能才有了 Spring,Spring 生态不断的发展才有了 Spring Boot,使用 Spring Boot 让 Spring 更易用更有⽣命力,Spring Cloud 是基于Spring Boot 开发的⼀套微服务架构下的服务治理理⽅案。

Spring IoC/Aop > Spring > Spring Boot > Spring Cloud

Spring Boot 诞⽣生一⽅⾯面是因为 Spring 自身发展所遇到的问题,另一⽅面在微服务思想诞⽣生之际,急需要一款快速开发⼯工具来实现微服务技术落地,在这样的背景下诞⽣了 Spring Boot。Spring Boot 整体的设计思想是:约定优于配置、依赖此设计思路路,Spring Boot 进⾏了⼤刀阔斧的改⾰,让⼈人们⾮常容易的实现开发、测试、部署。众多的 Starters 成就了 Spring Boot 的发展,让使⽤ Spring Boot 开发项⽬变的更加简单。

模版引擎Thymeleaf基础使用

模版引擎

模版引擎是为了使用户界面和业务数据分离而产生的,它可以生成特定格式的文档,用于网站的模版引擎就会生成一个标准的html文档。

“置换”型模版引擎,只是将制定模版内容(字符串)中的特定标记替换,生成了最终的业务数据(如网页)。

置换型模版引擎实现简单,但是效率低下,无法满足高负载的需求,(海量访问的网站),因此还出现了编译型模版引擎和解释型模版引擎。

Thymeleaf

Thymeleaf 是⾯面向 Web 和独⽴立环境的现代服务器器端 Java 模板引擎,能够处理理 HTML、XML、JavaScript、CSS 甚⾄至纯⽂文本。

Thymeleaf 建⽴立在⾃然模板的概念上,将其逻辑注⼊到模板文件中,不会影响模板设计原型,从而改善了设计的沟通,弥合了设计和开发团队之间的差距。

使用自然模版技术,Thymeleaf的模版语法不会破坏文档的结构,模版依旧是有效的xml文档。

FastDFS

介绍

开源的轻量级分布式文件系统,解决了大数据量和负载均衡的问题,特别适合中小文件(建议范围 4kb~500mb)为载体的在线服务,如相册网站,在线网站等。在uc基于fastDFS开发向用户提供了网盘,社区,广告和应用下载德国业务的存储服务。

不是通用的文件系统,只能通过API来访问。为互联⽹网应⽤用量量身定做,解决了大容量⽂件存储问题,追求⾼性能和高扩展性,FastDFS 可以看做是基于文件的 Key Value Pair 存储系统,称作分布式⽂件存储服务会更更合适。

相关概念

服务端有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(client)

  • Tracker Server:跟踪服务器器,主要做调度⼯工作,起负载均衡的作⽤用。在内存记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。相⽐ GFS 中的 Master 更为精简,不记录⽂件索引信息,占用的内存量很少。
  • Storage Server: 存储服务器(又称存储节点或数据服务器器),⽂件和⽂件属性(Meta Data)都保存到存储服务器器上。Storage Server 直接利利用 OS 的文件系统调⽤管理文件。
  • Client:客户端,作为业务请求的发起⽅,通过专有接口,使⽤ TCP/IP 协议与跟踪器服务器或存储节点进行数据交互。FastDFS 向使用者提供基本⽂件访问接口,如 upload、download、append、delete等,以客户端库的方式提供给⽤户使用。

运行机制图

image-20200710160710575

Swagger2

介绍

swagger是一系列restful api的工具,可以获得项目的一种交互式文档,客户端sdk的自动生成功能等。swagger去掉了调用服务时的很多猜测。

swagger是一个简单但功能强大的api表达工具。我们可以得到交互式文档,自动生成代码的sdk以及api的发现特性。

Swagger 被号称世界上最流⾏的 API ⼯具,它提供了 API管理理的全套解决方案,API 文档管理需要考虑的因素基本都包含。

WebSocket

介绍

WebSocket协议是基于TCP的一种网络协议,它实现了浏览器与服务器的双全工(FULL-duplex)通信—允许服务器主动发送消息给客户端。是真正的双向平等对话,是属于服务器推送技术的一种。

在 WebSocket API 中,浏览器器和服务器器只需要完成⼀次握手,两者之间就直接可以创建持久性的连接,并进⾏行双向数据传输。

优点

  • 较少的控制开销。在连接创建之后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较少。
  • 更强的实时性。由于协议是全双⼯工的,所以服务器器可以随时主动给客户端下发数据。
  • 保持连接状态。websocket是一种有状态的协议。
  • 更好的二进制支持。
  • 更好的压缩效果。

JDBC

JDBC(Java Data Base Connectivity,Java 数据库连接)是⼀种⽤于执行 SQL 语句的 Java API,可以为多种关系数据库提供统一访问,它由一组⽤ Java 语⾔编写的类和接口组成。JDBC 提供了⼀种基准,据此可构建更⾼高级的⼯工具和接⼝,使数据库开发人员能够编写数据库应⽤程序。

说⽩了 JDBC 就是一套 Java 访问数据库的 API 规范,利用这套规范屏蔽了各种数据库 API 调⽤的差异性。

直接使用时的操作

  • 加载数据库驱动
  • 建立数据库连接
  • 创建数据库操作对象
  • 定义操作的sql语句
  • 执行数据库操作
  • 获取数据库操作结果集
  • 关闭对象,回收资源

MyBatis

MyBatis是现如今最流行的ORM框架之一

ORM

对象关系映射(Object Relational Mapping,ORM)模式是⼀种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM 是通过使⽤描述对象和数据库之间映射的元数据,将程序中的对象⾃动持久化到关系数据库中。

MyBatis ⽀支持普通的 SQL 查询,存储过程和⾼高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC代码和参数的⼿工设置以及对结果集的检索封装。MaBatis 可以使⽤简单的 XML 或注解⽤于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

优点

  • SQL 被统一提取出来,便于统一管理和优化
  • SQL和代码解耦
  • 提供映射标签,支持对象与数据库的 ORM 字段关系映射
  • 灵活书写动态 SQL,⽀持各种条件来动态生成不同的 SQL

缺点

  • 编写SQL语句时工作量很大,尤其是字段多,关联表多时,更是如此
  • SQL语句依赖于数据库,导致数据库移植性差

重要概念

Mapper 配置可以使⽤基于 XML 的 Mapper 配置⽂文件来实现,也可以使⽤用基于 Java 注解的 MyBatis 注解来实现,甚⾄可以直接使⽤ MyBatis 提供的 API 来实现。

Mapper 接口是指⾃行行定义的⼀个数据操作接口,类似于通常所说的 DAO 接口。早期的 Mapper 接⼝需要自定义去实现,现在 MyBatis 会⾃动为 Mapper 接口创建动态代理对象。Mapper 接口的⽅法通常与 Mapper配置文件中的 select、insert、update、delete 等 XML 结点存在⼀一对应关系。

ExecutorMyBatis 中所有的 Mapper 语句的执行都是通过 Executor 进⾏的,Executor 是 MyBatis 的⼀个核心接⼝。

SqlSession是 MyBatis 的关键对象,是执行持久化操作的独享,类似于 JDBC 中的 Connection,SqlSession 对象完全包含以数据库为背景的所有执⾏ SQL 操作的⽅法,它的底层封装了 JDBC 连接,可以⽤SqlSession 实例来直接执⾏被映射的 SQL 语句。

SqlSessionFactory是 MyBatis 的关键对象,它是单个数据库映射关系经过编译后的内存镜像。SqlSessionFactory 对象的实例例可以通过 SqlSessionFactoryBuilder 对象类获得,⽽SqlSessionFactoryBuilder 则可以从 XML 配置⽂文件或一个预先定制的 Configuration 的实例例构建出。

MyBatis 的⼯工作流程如下:

image-20200710165424451

Spring Data JPA

Spring Data JPA 是 Spring Boot 体系中约定优于配置的最佳实现,⼤大简化了项⽬中数据库的操作

介绍

JPA(Java Persistence API)是 Sun 官⽅方提出的 Java 持久化规范。它为 Java 开发⼈人员提供了了一种对象 /关联映射工具来管理 Java 应⽤中的关系数据。它的出现主要是为了简化现有的持久化开发⼯工作和整合 ORM技术,结束现在 Hibernate、TopLink、JDO 等 ORM 框架各⾃为营的局面。

注意:JPA 是⼀套规范,不不是⼀套产品,那么像 Hibernate、TopLink、JDO 它们是⼀套产品,如果说这些产品实现了这个 JPA 规范,那么我们就可以称他们为 JPA 的实现产品。

Druid

介绍

Druid 是阿里巴巴开源平台上的一个项⽬目,整个项⽬由数据库连接池、插件框架和 SQL 解析器器组成,该项⽬目主要是为了扩展 JDBC 的⼀些限制,可以让程序员实现⼀些特殊的需求,⽐如向密钥服务请求凭证、统计SQL 信息、SQL 性能收集、SQL 注⼊入检查、SQL 翻译等,程序员可以通过定制来实现⾃自⼰己需要的功能。

Druid ⾸首先是⼀个数据库连接池,但它不仅仅是一个数据库连接池,还包含了了⼀个 ProxyDriver,⼀系列列内置的 JDBC 组件库,⼀一个 SQL Parser。在 Java 的世界中 Druid 是监控做的最好的数据库连接池,在功能、性能、扩展性⽅⾯,也有不错的表现。

功能

  • 替换其他 Java 连接池,Druid 提供了一个高效、功能强大、可扩展性好的数据库连接池。

  • 可以监控数据库访问性能,Druid 内置提供了一个功能强大的 StatFilter 插件,能够详细统计 SQL 的执行性能,这对于线上分析数据库访问性能有很⼤大帮助。

  • 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的⾏为,容易易导致安全问题,DruidDruiver 和 DruidDataSource 都⽀支持 PasswordCallback。

  • SQL 执行⽇志,Druid 提供了不同的 LogFilter,能够⽀支持 Common-Logging、Log4j 和 JdkLog,可以按需要选择相应的 LogFilter,监控应⽤用的数据库访问情况。

  • 扩展 JDBC,如果你要对 JDBC 层有编程的需求,可以通过 Druid 提供的 Filter 机制,很方便编写JDBC 层的扩展插件。

Memcache

介绍

Memcache 是一个⾃由和开放源代码、⾼高性能、分配的内存对象缓存系统。简单来说,Memcache 是⼀个高性能的分布式内存对象的 key-value 缓存系统,用于加速动态 Web 应⽤程序,减轻数据库负载,现在也有很多⼈人将它作为内存式数据库在使⽤用。

它可以应对任意多个连接,使用非阻塞的网络 IO,由于它的⼯作机制是在内存中开辟⼀块空间,然后建立一个 Hash 表,Memcached ⾃动管理理这些 Hash 表。Memcache 由国外社区⽹网站 LiveJournal 开发团队开发,设计理理念就是小⽽强大,它简单的设计促进了了快速部署、易于开发并解决⾯对⼤规模的数据缓存的许多难题,而所开放的 API 使得 Memcache 能⽤用于 Java、C/C++/C#、Perl、Python、PHP、Ruby 等⼤大部分流⾏行行的程序语⾔言。

Memcache 和 Memcached 的区别:Memcache 是这个项⽬目的名称,⽽而 Memcached 是服务器器端的主程序名称。

特点

协议简单: 的服务端客户端通信使⽤用简单的⽂文本协议。Telnet

基于 Libevent 的事件处理

内置内存存储⽅方式

不适应场景

缓存对象不不能⼤大于 1 MB

key 的⻓长度⼤大于 250 字符

Memcache 未提供任何安全策略略

不支持持久化

Redis

数据模型

Redis 数据模型不仅与关系数据库管理系统(RDBMS)不同,也不同于任何简单的 NoSQL 键-值数据存储。

Redis 数据类型类似于编程语⾔的基础数据类型,因此开发⼈人员感觉很⾃然,每个数据类型都⽀持适⽤用于其类型的操作,受支持的数据类型包括:

  • string(字符串串)
  • hash(哈希)
  • list(列列表)
  • set(集合)
  • zset(sorted set:有序集合)

关键优势

Redis 的优势包括它的速度、对富数据类型的支持、操作的原⼦性,以及通⽤用性:

  • 性能极⾼高,它每秒可执行约 100,000 个 SET 以及约 100,000 个 GET 操作;

  • 丰富的数据类型,Redis 对⼤多数开发人员已知的⼤多数数据类型提供了原⽣⽀支持,这使得各种问题得以轻松解决;

  • 原⼦子性,因为所有 Redis 操作都是原⼦性的,所以多个客户端会并发地访问⼀个 Redis 服务器器,获取相同的更新值;

  • 丰富的特性,Redis 是⼀个多效⽤工具,有非常多的应⽤场景,包括缓存、消息队列列(Redis 原⽣生⽀支持发布/订阅)、短期应⽤程序数据(⽐如 Web 会话、Web ⻚面命中计数)等。

ActiveMQ

介绍

消息队列中间件是分布式系统中重要的组件,主要解决应⽤耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终⼀致性架构,是⼤型分布式系统不可缺少的中间件。⽬前在生产环境中使用较多的消息队列有 ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等。

特性

  • 异步性

  • 松耦合

  • 分布式

  • 可靠性

JMS 规范

JMS 即 Java 消息服务(Java Message Service)应⽤程序接口,是⼀个 Java 平台中关于⾯向消息中间件(MOM)的 API,⽤于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java 消息服务是一个与具体平台⽆无关的 API,绝⼤多数 MOM 提供商都对 JMS 提供⽀支持。

JMS 的消息机制有 2 种模型,一种是 Point to Point,表现为队列的形式,发送的消息,只能被⼀个接收者取走;另一种是 Topic,可以被多个订阅者订阅,类似于群发。

ActiveMQ 是 JMS 的⼀一个实现。

RabbitMQ

介绍

AMQP(Advanced Message Queuing Protocol,⾼级消息队列协议)是应⽤层协议的⼀个开放标准,为⾯向消息的中间件设计。消息中间件主要⽤于组件之间的解耦,消息的发送者⽆需知道消息使用者的存在,反之亦然。

AMQP 的主要特征是面向消息、队列列、路由(包括点对点和发布/订阅)、可靠性、安全。

相关概念

通常我们谈到队列列服务,会有三个概念:发消息者、队列列、收消息者。RabbitMQ 在这个基本概念之上,多做了⼀层抽象,在发消息者和队列之间加⼊了交换器(Exchange)。这样发消息者和队列就没有直接联系,转⽽变成发消息者把消息给交换器,交换器根据调度策略再把消息再给队列。

image-20200710183846172

  • 虚拟主机:⼀个虚拟主机持有一组交换机、队列和绑定,为什么需要多个虚拟主机呢?很简单,RabbitMQ 当中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁⽌ A 组访问 B 组的交换机/队列列/绑定,必须为 A 和 B 分别创建一个虚拟主机,每⼀个 RabbitMQ 服务器器都有⼀一个默认的虚拟主机“/”。

  • 交换机:Exchange ⽤用于转发消息,但是它不会做存储,如果没有 Queue bind 到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息。

这⾥有⼀个⽐较重要的概念:路由键 。消息到交换机的时候,交互机会转发到对应的队列列中,那么究竟转发到哪个队列,就要根据该路由键。

  • 绑定:也就是交换机需要和队列相绑定,这其中如上图所示,是多对多的关系。

交换机(Exchange)

交换机的功能主要是接收消息并且转发到绑定的队列,交换机不存储消息,在启⽤用 ack 模式后,交换机找不到队列,会返回错误。交换机有四种类型:Direct、topic、Headers and Fanout。

  • Direct:其类型的⾏为是“先匹配、再投送”,即在绑定时设定一个 routing_key,消息的 routing_key 匹配时,才会被交换器器投送到绑定的队列列中去。

  • Topic:按规则转发消息(最灵活)。

  • Headers:设置 header attribute 参数类型的交换机。

  • Fanout:转发消息到所有绑定队列列。

Direct Exchange

Direct Exchange 是 RabbitMQ 默认的交换机模式,也是最简单的模式,根据 key 全文匹配去寻找队列‘

image-20200710184255854

Topic Exchange

Topic Exchange 转发消息主要是根据通配符。在这种交换机下,队列和交换机的绑定会定义一种路路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发消息。

Headers Exchange

Headers 也是根据规则匹配,相较于 Direct 和 Topic 固定地使用 routing_key,headers 则是⼀个自定义匹配规则的类型。在队列与交换器绑定时,会设定⼀组键值对规则,消息中也包括⼀组键值对(headers 属性),当这些键值对有一对或全部匹配时,消息被投送到对应队列。

Fanout Exchange

Fanout Exchange 消息⼴播的模式,不管路由键或者是路由模式,会把消息发给绑定给它的全部队列,如果配置了 routing_key 会被忽略。

Actuator

Spring Boot Actuator 负责监控应用的各项静态和动态的变量。项目结合 Spring Boot Actuator 的使用,便可轻松对 Spring Boot 应⽤用监控治理,Spring Boot 的Actuator 提供了很多⽣产级的特性,⽐如监控和度量 Spring Boot 应⽤用程序,这些特性可以通过众多 REST接⼝、远程 Shell 和 JMX 获得。

Admin

Spring Boot Admin 是⼀个管理和监控 Spring Boot 应⽤用程序的开源软件,每个应⽤用都认为是一个客户端,通过 HTTP 或者使⽤用 Eureka 注册到 admin server 中进⾏行行展示,Spring Boot Admin UI 部分使⽤用 Vue.js 将数据展示在前端。

Spring Boot Admin 分为服务端和客户端,服务端其实就是⼀个监控后台用来汇总展示所有的监控信息,客户端就是我们的应⽤,使⽤时需要先启动服务端,在启动客户端的时候打开 Actuator 的接口,并指向服务端的地址,这样服务端会定时读取相关信息以达到监控的目的。