Spring Boot高級


Spring Boot高級
內容概要
一、Spring Boot與緩存
二、Spring Boot與消息
三、Spring Boot與檢索
四、Spring Boot與任務
五、Spring Boot與安全
六、Spring Boot與分布式
七、Spring Boot與監控管理
八、Spring Boot與部署
一、Spring Boot與緩存
JSR-107、Spring緩存抽象、整合Redis
一、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設置。

二、Spring緩存抽象
Spring從3.1開始定義了org.springframework.cache.Cache
和org.springframework.cache.CacheManager接口來統一不同的緩存技術;
並支持使用JCache(JSR-107)注解簡化我們開發;

Cache接口為緩存的組件規范定義,包含緩存的各種操作集合;
Cache接口下Spring提供了各種xxxCache的實現;如RedisCache,EhCacheCache , ConcurrentMapCache等;

每次調用需要緩存功能的方法時,Spring會檢查檢查指定參數的指定的目標方法是否已經被調用過;如果有就直接從緩存中獲取方法調用后的結果,如果沒有就調用方法並緩存結果后返回給用戶。下次調用直接從緩存中獲取。
使用Spring緩存抽象時我們需要關注以下兩點;
1、確定方法需要被緩存以及他們的緩存策略
2、從緩存中讀取之前緩存存儲的數據

三、幾個重要概念&緩存注解

 

四、緩存使用

1、引入spring-boot-starter-cache模塊
2、@EnableCaching開啟緩存
3、使用緩存注解
4、切換為其他緩存
五、整合redis實現緩存

引入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

 

二、Spring Boot與消息
JMS、AMQP、RabbitMQ
一、概述
大多應用中,可通過消息服務中間件來提升系統異步通信、擴展解耦能力
消息服務中兩個重要概念:
消息代理(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

二、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
表示消息隊列服務器實體

三、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個或多個單詞,*匹配一個單詞。

四、RabbitMQ整合
引入 spring-boot-starter-amqp
application.yml配置
測試RabbitMQ
AmqpAdmin:管理組件
RabbitTemplate:消息發送處理組件


三、Spring Boot與檢索

ElasticSearch
一、檢索
我們的應用經常需要添加檢索功能,開源的 ElasticSearch 是目前全文搜索引擎的首選。他可以快速的存儲、搜索和分析海量數據。Spring Boot通過整合Spring Data ElasticSearch為我們提供了非常便捷的檢索功能支持;

Elasticsearch是一個分布式搜索服務,提供Restful API,底層基於Lucene,采用多shard(分片)的方式保證數據安全,並且提供自動resharding的功能,github等大型的站點也是采用了ElasticSearch作為其搜索服務,

二、概念 
以 員工文檔 的形式存儲為例:一個文檔代表一個員工數據。存儲數據到 ElasticSearch 的行為叫做 索引 ,但在索引一個文檔之前,需要確定將文檔存儲在哪里。
一個 ElasticSearch 集群可以 包含多個 索引 ,相應的每個索引可以包含多個 類型 。 這些不同的類型存儲着多個 文檔 ,每個文檔又有 多個 屬性 。
類似關系:
索引-數據庫
類型-表
文檔-表中的記錄
屬性-列

三、整合ElasticSearch測試 
引入spring-boot-starter-data-elasticsearch
安裝Spring Data 對應版本的ElasticSearch
application.yml配置
Spring Boot自動配置的
ElasticsearchRepository、ElasticsearchTemplate、Jest
測試ElasticSearch
四、Spring Boot與任務
異步任務、定時任務、郵件任務
一、異步任務
在Java應用中,絕大多數情況下都是通過同步的方式來實現交互處理的;但是在處理與第三方系統交互的時候,容易造成響應遲緩的情況,之前大部分都是使用多線程來完成此類任務,其實,在Spring 3.x之后,就已經內置了@Async來完美解決這個問題。

兩個注解:
@EnableAysnc、@Aysnc
二、定時任務 
項目開發中經常需要執行一些定時任務,比如需要在每天凌晨時候,分析一次前一天的日志信息。Spring為我們提供了異步執行任務調度的方式,提供TaskExecutor 、TaskScheduler 接口。
兩個注解:@EnableScheduling、@Scheduled
cron表達式:

三、郵件任務 
郵件發送需要引入spring-boot-starter-mail
Spring Boot 自動配置MailSenderAutoConfiguration
定義MailProperties內容,配置在application.yml中
自動裝配JavaMailSender
測試郵件發送

五、Spring Boot與安全
安全、Spring Security
一、安全
Spring Security是針對Spring項目的安全框架,也是Spring Boot底層安全模塊默認的技術選型。他可
以實現強大的web安全控制。對於安全控制,我們僅需引入spring-boot-starter-security模塊,進行
少量的配置,即可實現強大的安全管理。 幾個類:
WebSecurityConfigurerAdapter:自定義Security策略
AuthenticationManagerBuilder:自定義認證策略
@EnableWebSecurity:開啟WebSecurity模式

應用程序的兩個主要區域是“認證”和“授權”(或者訪問控制)。這兩個主要區域是Spring Security 的兩個目標。

“認證”(Authentication),是建立一個他聲明的主體的過程(一個“主體”一般是指用戶,設備或一些可以在你的應用程序中執行動作的其他系統)。

“授權”(Authorization)指確定一個主體是否允許在你的應用程序執行一個動作的過程。為了抵達需要授權的店,主體的身份已經有認證過程建立。

這個概念是通用的而不只在Spring Security中。

二、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;

六、Spring Boot與分布式
分步式、Dubbo/Zookeeper、Spring Boot/Cloud
一、分布式應用
在分布式系統中,國內常用zookeeper+dubbo組合,而Spring Boot推薦使用全棧的Spring,Spring Boot+Spring Cloud。

 

 

單一應用架構
當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。此時,用於簡化增刪改查工作量的數據訪問框架(ORM)是關鍵。
垂直應用架構
當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。
分布式服務架構
當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提高業務復用及整合的分布式服務框架(RPC)是關鍵。
流動計算架構
當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基於訪問壓力實時管理集群容量,提高集群利用率。此時,用於提高機器利用率的資源調度和治理中心(SOA)是關鍵。

二、Zookeeper和Dubbo
ZooKeeper
ZooKeeper 是一個分布式的,開放源碼的分布式應用程序協調服務。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。
Dubbo
Dubbo是Alibaba開源的分布式服務框架,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地松耦合)。從服務模型的角度來看,Dubbo采用的是一種非常簡單的模型,要么是提供方提供服務,要么是消費方消費服務,所以基於這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。

1、安裝zookeeper作為注冊中心
2、編寫服務提供者
3、編寫服務消費者
4、整合dubbo

三、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 入門
1、創建provider
2、創建consumer
3、引入Spring Cloud
4、引入Eureka注冊中心
5、引入Ribbon進行客戶端負載均衡
七、Spring Boot與開發熱部署
熱部署
一、熱部署
在開發中我們修改一個Java文件后想看到效果不得不重啟應用,這導致大量時間花費,我們希望不重啟應用的情況下,程序可以自動部署(熱部署)。有以下四種情況,如何能實現熱部署。

1、模板引擎
在Spring Boot中開發情況下禁用模板引擎的cache
頁面模板改變ctrl+F9可以重新編譯當前頁面並生效

2、Spring Loaded
Spring官方提供的熱部署程序,實現修改類文件的熱部署
下載Spring Loaded(項目地址https://github.com/spring-projects/spring-loaded)
添加運行時參數;
-javaagent:C:/springloaded-1.2.5.RELEASE.jar –noverify

3、JRebel
收費的一個熱部署軟件
安裝插件使用即可

4、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

八、Spring Boot與監控管理
一、監控管理
通過引入spring-boot-starter-actuator,可以使用Spring Boot為我們提供的准生產環境下的應用監控和管理功能。我們可以通過HTTP,JMX,SSH協議來進行操作,自動得到審計、健康及指標信息等

步驟:
引入spring-boot-starter-actuator
通過http方式訪問監控端點
可進行shutdown(POST 提交,此端點默認關閉)


二、定制端點信息

定制端點一般通過endpoints+端點名+屬性名來設置。
修改端點id(endpoints.beans.id=mybeans)
開啟遠程應用關閉功能(endpoints.shutdown.enabled=true)
關閉端點(endpoints.beans.enabled=false)
開啟所需端點
endpoints.enabled=false
endpoints.beans.enabled=true
定制端點訪問根路徑
management.context-path=/manage
關閉http端點
management.port=-1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM