Spring Boot高級

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

相關文章
相關標籤/搜索