Spring Boot高级
内容概要
1、Spring Boot与缓存
2、Spring Boot与消息
3、Spring Boot与检索
4、Spring Boot与任务
5、Spring Boot与安全
6、Spring Boot与分布式
7、Spring Boot与监控管理
8、Spring Boot与部署
1、Spring Boot与缓存
JSR-10七、Spring缓存抽象、整合Redis
1、JSR107
Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry。
CachingProvider定义了建立、配置、获取、管理和控制多个CacheManager。一个应用能够在运行期访问多个CachingProvider。
CacheManager定义了建立、配置、获取、管理和控制多个惟一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
Cache是一个相似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有。
Entry是一个存储在Cache中的key-value对。
Expiry 每个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过时的状态。一旦过时,条目将不可访问、更新和删除。缓存有效期能够经过ExpiryPolicy设置。前端
2、Spring缓存抽象
Spring从3.1开始定义了org.springframework.cache.Cache
和org.springframework.cache.CacheManager接口来统一不一样的缓存技术;
并支持使用JCache(JSR-107)注解简化咱们开发;java
Cache接口为缓存的组件规范定义,包含缓存的各类操做集合;
Cache接口下Spring提供了各类xxxCache的实现;如RedisCache,EhCacheCache , ConcurrentMapCache等;git
每次调用须要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;若是有就直接从缓存中获取方法调用后的结果,若是没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。
使用Spring缓存抽象时咱们须要关注如下两点;
一、肯定方法须要被缓存以及他们的缓存策略
二、从缓存中读取以前缓存存储的数据github
3、几个重要概念&缓存注解web
4、缓存使用redis
一、引入spring-boot-starter-cache模块
二、@EnableCaching开启缓存
三、使用缓存注解
四、切换为其余缓存
5、整合redis实现缓存spring
引入spring-boot-starter-data-redis
application.yml配置redis链接地址
使用RestTemplate操做redis
redisTemplate.opsForValue();//操做字符串
redisTemplate.opsForHash();//操做hash
redisTemplate.opsForList();//操做list
redisTemplate.opsForSet();//操做set
redisTemplate.opsForZSet();//操做有序set
配置缓存、CacheManagerCustomizers
测试使用缓存、切换缓存、 CompositeCacheManager数据库
2、Spring Boot与消息
JMS、AMQP、RabbitMQ
1、概述
大多应用中,可经过消息服务中间件来提高系统异步通讯、扩展解耦能力
消息服务中两个重要概念:
消息代理(message broker)和目的地(destination)
当消息发送者发送消息之后,将由消息代理接管,消息代理保证消息传递到指定目的地。
消息队列主要有两种形式的目的地
队列(queue):点对点消息通讯(point-to-point)
主题(topic):发布(publish)/订阅(subscribe)消息通讯缓存
点对点式:
消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,消息读取后被移出队列
消息只有惟一的发送者和接受者,但并非说只能有一个接收者安全
发布订阅式:
发送者(发布者)发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,那么就会在消息到达时同时收到消息
JMS(Java Message Service)JAVA消息服务:
基于JVM消息代理的规范。ActiveMQ、HornetMQ是JMS实现
AMQP(Advanced Message Queuing Protocol)
高级消息队列协议,也是一个消息代理的规范,兼容JMS
RabbitMQ是AMQP的实现
Spring支持
spring-jms提供了对JMS的支持
spring-rabbit提供了对AMQP的支持
须要ConnectionFactory的实现来链接消息代理
提供JmsTemplate、RabbitTemplate来发送消息
@JmsListener(JMS)、@RabbitListener(AMQP)注解在方法上监听消息代理发布的消息
@EnableJms、@EnableRabbit开启支持
Spring Boot自动配置
JmsAutoConfiguration
RabbitAutoConfiguration
2、RabbitMQ简介
RabbitMQ简介:
RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现。
核心概念
Message
消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其余消息的优先权)、delivery-mode(指出该消息可能须要持久性存储)等。
Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序。
Exchange
交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
Exchange有4种类型:direct(默认),fanout, topic, 和headers,不一样类型的Exchange转发消息的策略有所区别
Queue
消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者链接到这个队列将其取走。
Binding
绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列链接起来的路由规则,因此能够将交换器理解成一个由绑定构成的路由表。
Exchange 和Queue的绑定能够是多对多的关系。
Connection
网络链接,好比一个TCP链接。
Channel
信道,多路复用链接中的一条独立的双向数据流通道。信道是创建在真实的TCP链接内的虚拟链接,AMQP 命令都是经过信道发出去的,无论是发布消息、订阅队列仍是接收消息,这些动做都是经过信道完成。由于对于操做系统来讲创建和销毁 TCP 都是很是昂贵的开销,因此引入了信道的概念,以复用一条 TCP 链接。
Consumer
消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
Virtual Host
虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每一个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有本身的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在链接时指定,RabbitMQ 默认的 vhost 是 / 。
Broker
表示消息队列服务器实体
3、RabbitMQ运行机制
AMQP 中的消息路由
AMQP 中消息的路由过程和 Java 开发者熟悉的 JMS 存在一些差异,AMQP 中增长了 Exchange 和 Binding 的角色。生产者把消息发布到 Exchange 上,消息最终到达队列并被消费者接收,而 Binding 决定交换器的消息应该发送到那个队列。
Exchange 类型
Exchange分发消息时根据类型的不一样分发策略有区别,目前共四种类型:direct、fanout、topic、headers 。headers 匹配 AMQP 消息的 header 而不是路由键, headers 交换器和 direct 交换器彻底一致,但性能差不少,目前几乎用不到了,因此直接看另外三种类型:
消息中的路由键(routing key)若是和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。路由键与队列名彻底匹配,若是一个队列绑定到交换机要求路由键为“dog”,则只转发 routing key 标记为“dog”的消息,不会转发“dog.puppy”,也不会转发“dog.guard”等等。它是彻底匹配、单播的模式。
每一个发到 fanout 类型交换器的消息都会分到全部绑定的队列上去。fanout 交换器不处理路由键,只是简单的将队列绑定到交换器上,每一个发送到交换器的消息都会被转发到与该交换器绑定的全部队列上。很像子网广播,每台子网内的主机都得到了一份复制的消息。fanout 类型转发消息是最快的。
topic 交换器经过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列须要绑定到一个模式上。它将路由键和绑定键的字符串切分红单词,这些单词之间用点隔开。它一样也会识别两个通配符:符号“#”和符号“*”。#匹配0个或多个单词,*匹配一个单词。
4、RabbitMQ整合
引入 spring-boot-starter-amqp
application.yml配置
测试RabbitMQ
AmqpAdmin:管理组件
RabbitTemplate:消息发送处理组件
3、Spring Boot与检索
ElasticSearch
1、检索
咱们的应用常常须要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的首选。他能够快速的存储、搜索和分析海量数据。Spring Boot经过整合Spring Data ElasticSearch为咱们提供了很是便捷的检索功能支持;
Elasticsearch是一个分布式搜索服务,提供Restful API,底层基于Lucene,采用多shard(分片)的方式保证数据安全,而且提供自动resharding的功能,github等大型的站点也是采用了ElasticSearch做为其搜索服务,
2、概念
以 员工文档 的形式存储为例:一个文档表明一个员工数据。存储数据到 ElasticSearch 的行为叫作 索引 ,但在索引一个文档以前,须要肯定将文档存储在哪里。
一个 ElasticSearch 集群能够 包含多个 索引 ,相应的每一个索引能够包含多个 类型 。 这些不一样的类型存储着多个 文档 ,每一个文档又有 多个 属性 。
相似关系:
索引-数据库
类型-表
文档-表中的记录
属性-列
3、整合ElasticSearch测试
引入spring-boot-starter-data-elasticsearch
安装Spring Data 对应版本的ElasticSearch
application.yml配置
Spring Boot自动配置的
ElasticsearchRepository、ElasticsearchTemplate、Jest
测试ElasticSearch
4、Spring Boot与任务
异步任务、定时任务、邮件任务
1、异步任务
在Java应用中,绝大多数状况下都是经过同步的方式来实现交互处理的;可是在处理与第三方系统交互的时候,容易形成响应迟缓的状况,以前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x以后,就已经内置了@Async来完美解决这个问题。
两个注解:
@EnableAysnc、@Aysnc
2、定时任务
项目开发中常常须要执行一些定时任务,好比须要在天天凌晨时候,分析一次前一天的日志信息。Spring为咱们提供了异步执行任务调度的方式,提供TaskExecutor 、TaskScheduler 接口。
两个注解:@EnableScheduling、@Scheduled
cron表达式:
3、邮件任务
邮件发送须要引入spring-boot-starter-mail
Spring Boot 自动配置MailSenderAutoConfiguration
定义MailProperties内容,配置在application.yml中
自动装配JavaMailSender
测试邮件发送
5、Spring Boot与安全
安全、Spring Security
1、安全
Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型。他可
以实现强大的web安全控制。对于安全控制,咱们仅需引入spring-boot-starter-security模块,进行
少许的配置,便可实现强大的安全管理。几个类:
WebSecurityConfigurerAdapter:自定义Security策略
AuthenticationManagerBuilder:自定义认证策略
@EnableWebSecurity:开启WebSecurity模式
应用程序的两个主要区域是“认证”和“受权”(或者访问控制)。这两个主要区域是Spring Security 的两个目标。
“认证”(Authentication),是创建一个他声明的主体的过程(一个“主体”通常是指用户,设备或一些能够在你的应用程序中执行动做的其余系统)。
“受权”(Authorization)指肯定一个主体是否容许在你的应用程序执行一个动做的过程。为了抵达须要受权的店,主体的身份已经有认证过程创建。
这个概念是通用的而不仅在Spring Security中。
2、Web&安全
登录/注销
HttpSecurity配置登录、注销功能
Thymeleaf提供的SpringSecurity标签支持
须要引入thymeleaf-extras-springsecurity4
sec:authentication=“name”得到当前用户的用户名
sec:authorize=“hasRole(‘ADMIN’)”当前用户必须拥有ADMIN权限时才会显示标签内容
remember me
表单添加remember-me的checkbox
配置启用remember-me功能
CSRF(Cross-site request forgery)跨站请求伪造
HttpSecurity启用csrf功能,会为表单添加_csrf的值,提交携带来预防CSRF;
6、Spring Boot与分布式
分步式、Dubbo/Zookeeper、Spring Boot/Cloud
1、分布式应用
在分布式系统中,国内经常使用zookeeper+dubbo组合,而Spring Boot推荐使用全栈的Spring,Spring Boot+Spring Cloud。
单一应用架构
当网站流量很小时,只需一个应用,将全部功能都部署在一块儿,以减小部署节点和成本。此时,用于简化增删改查工做量的数据访问框架(ORM)是关键。
垂直应用架构
当访问量逐渐增大,单一应用增长机器带来的加速度愈来愈小,将应用拆成互不相干的几个应用,以提高效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
分布式服务架构
当垂直应用愈来愈多,应用之间交互不可避免,将核心业务抽取出来,做为独立的服务,逐渐造成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提升业务复用及整合的分布式服务框架(RPC)是关键。
流动计算架构
当服务愈来愈多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增长一个调度中心基于访问压力实时管理集群容量,提升集群利用率。此时,用于提升机器利用率的资源调度和治理中心(SOA)是关键。
2、Zookeeper和Dubbo
ZooKeeper
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
Dubbo
Dubbo是Alibaba开源的分布式服务框架,它最大的特色是按照分层的方式来架构,使用这种方式可使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种很是简单的模型,要么是提供方提供服务,要么是消费方消费服务,因此基于这一点能够抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。
一、安装zookeeper做为注册中心
二、编写服务提供者
三、编写服务消费者
四、整合dubbo
3、Spring Boot和Spring Cloud
Spring Cloud
Spring Cloud是一个分布式的总体解决方案。Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者能够快速的启动服务或构建应用、同时可以快速和云平台资源进行对接。
SpringCloud分布式开发五大经常使用组件
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
Spring Cloud 入门
一、建立provider
二、建立consumer
三、引入Spring Cloud
四、引入Eureka注册中心
五、引入Ribbon进行客户端负载均衡
7、Spring Boot与开发热部署
热部署
1、热部署
在开发中咱们修改一个Java文件后想看到效果不得不重启应用,这致使大量时间花费,咱们但愿不重启应用的状况下,程序能够自动部署(热部署)。有如下四种状况,如何能实现热部署。
一、模板引擎
在Spring Boot中开发状况下禁用模板引擎的cache
页面模板改变ctrl+F9能够从新编译当前页面并生效
二、Spring Loaded
Spring官方提供的热部署程序,实现修改类文件的热部署
下载Spring Loaded(项目地址https://github.com/spring-projects/spring-loaded)
添加运行时参数;
-javaagent:C:/springloaded-1.2.5.RELEASE.jar –noverify
三、JRebel
收费的一个热部署软件
安装插件使用便可
四、Spring Boot Devtools(推荐)
引入依赖
IDEA使用ctrl+F9
或作一些小调整
Intellij IEDA和Eclipse不一样,Eclipse设置了自动编译以后,修改类它会自动编译,而IDEA在非RUN或DEBUG状况下才会自动编译(前提是你已经设置了Auto-Compile)。
设置自动编译(settings-compiler-make project automatically)
ctrl+shift+alt+/(maintenance)
勾选compiler.automake.allow.when.app.running
8、Spring Boot与监控管理
1、监控管理
经过引入spring-boot-starter-actuator,可使用Spring Boot为咱们提供的准生产环境下的应用监控和管理功能。咱们能够经过HTTP,JMX,SSH协议来进行操做,自动获得审计、健康及指标信息等
步骤:
引入spring-boot-starter-actuator
经过http方式访问监控端点
可进行shutdown(POST 提交,此端点默认关闭)
2、定制端点信息
定制端点通常经过endpoints+端点名+属性名来设置。修改端点id(endpoints.beans.id=mybeans)开启远程应用关闭功能(endpoints.shutdown.enabled=true)关闭端点(endpoints.beans.enabled=false)开启所需端点endpoints.enabled=falseendpoints.beans.enabled=true定制端点访问根路径management.context-path=/manage关闭http端点management.port=-1