Spring Boot高級(jí)
內(nèi)容概要
一、Spring Boot與緩存 二、Spring Boot與消息 三、Spring Boot與檢索 四、Spring Boot與任務(wù) 五、Spring Boot與安全 六、Spring Boot與分布式 七、Spring Boot與監(jiān)控管理 八、Spring Boot與部署
一、Spring Boot與緩存JSR-107、Spring緩存抽象、整合Redis
一、JSR107
Java Caching定義了5個(gè)核心接口,分別是CachingProvider,?CacheManager,?Cache,?Entry
和?Expiry。
CachingProvider定義了創(chuàng)建、配置、獲取、管理和控制多個(gè)CacheManager。一個(gè)應(yīng)用可
以在運(yùn)行期訪問多個(gè)CachingProvider。
CacheManager定義了創(chuàng)建、配置、獲取、管理和控制多個(gè)唯一命名的Cache,這些Cache存在于CacheManager的上下文中。一個(gè)CacheManager僅被一個(gè)CachingProvider所擁有。
Cache是一個(gè)類似Map的數(shù)據(jù)結(jié)構(gòu)并臨時(shí)存儲(chǔ)以Key為索引的值。一個(gè)Cache僅被一個(gè)CacheManager所擁有。
Entry是一個(gè)存儲(chǔ)在Cache中的key-value對(duì)。
Expiry?每一個(gè)存儲(chǔ)在Cache中的條目有一個(gè)定義的有效期。一旦超過這個(gè)時(shí)間,條目為過期 的狀態(tài)。一旦過期,條目將不可訪問、更新和刪除。緩存有效期可以通過ExpiryPolicy設(shè)置。
Application
CachingProvider CachingProvider
Cache
Entry
Entry
CacheManager
Cache
Expiry Expiry
CacheManager
ExpiryEntry?Expiry
Cache
Entry
二、Spring緩存抽象
Spring從3.1開始定義了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口來統(tǒng)一不同的緩存技術(shù); 并支持使用JCache(JSR-107)注解簡(jiǎn)化我們開發(fā);
??Cache接口為緩存的組件規(guī)范定義,包含緩存的各種操作集合;
??Cache接口下Spring提供了各種xxxCache的實(shí)現(xiàn);如RedisCache,EhCacheCache ,
ConcurrentMapCache等;
??每次調(diào)用需要緩存功能的方法時(shí),Spring會(huì)檢查檢查指定參數(shù)的指定的目標(biāo)方法是否 已經(jīng)被調(diào)用過;如果有就直接從緩存中獲取方法調(diào)用后的結(jié)果,如果沒有就調(diào)用方法 并緩存結(jié)果后返回給用戶。下次調(diào)用直接從緩存中獲取。
??使用Spring緩存抽象時(shí)我們需要關(guān)注以下兩點(diǎn);1、確定方法需要被緩存以及他們的緩存策略2、從緩存中讀取之前緩存存儲(chǔ)的數(shù)據(jù)
三、幾個(gè)重要概念&緩存注解
Cache緩存接口,定義緩存操作。實(shí)現(xiàn)有:RedisCache、EhCacheCache、?ConcurrentMapCache等
CacheManager緩存管理器,管理各種緩存(Cache)組件
@Cacheable主要針對(duì)方法配置,能夠根據(jù)方法的請(qǐng)求參數(shù)對(duì)其結(jié)果進(jìn)行緩存
@CacheEvict清空緩存
@CachePut保證方法被調(diào)用,又希望結(jié)果被緩存。
@EnableCaching開啟基于注解的緩存
keyGenerator緩存數(shù)據(jù)時(shí)key生成策略
serialize緩存數(shù)據(jù)時(shí)value序列化策略
@Cacheable/@CachePut/@CacheEvict?主要的參數(shù)
value緩存的名稱,在?spring?配置文件中定義,必須指定 至少一個(gè)例如:?@Cacheable(value=”mycache”)?或者@Cacheable(value={”cache1”,”cache2”}
key緩存的?key,可以為空,如果指定要按照?SpEL?表達(dá) 式編寫,如果不指定,則缺省按照方法的所有參數(shù) 進(jìn)行組合例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition緩存的條件,可以為空,使用?SpEL?編寫,返回?true?或者?false,只有為?true?才進(jìn)行緩存/清除緩存,在 調(diào)用方法之前之后都能判斷例如:
@Cacheable(value=”testcache”,condition=”#userNam e.length()>2”)
allEntries (@CacheEvict?)是否清空所有緩存內(nèi)容,缺省為?false,如果指定為true,則方法調(diào)用后將立即清空所有緩存例如:
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation
(@CacheEvict)
是否在方法執(zhí)行前就清空,缺省為?false,如果指定 為?true,則在方法還沒有執(zhí)行的時(shí)候就清空緩存, 缺省情況下,如果方法執(zhí)行拋出異常,則不會(huì)清空 緩存例如:?@CachEvict(value=”testcache”,beforeInvocation=true)
unless
(@CachePut) (@Cacheable)
用于否決緩存的,不像condition,該表達(dá)式只在方 法執(zhí)行之后判斷,此時(shí)可以拿到返回值result進(jìn)行判 斷。條件為true不會(huì)緩存,fasle才緩存例如:
@Cacheable(value=”testcache”,unless=”#result == null”)
Cache SpEL available metadata
名字位置 描述 示例
methodNameroot object?當(dāng)前被調(diào)用的方法名?#root.methodName
methodroot object?當(dāng)前被調(diào)用的方法?#root.method.name
targetroot object?當(dāng)前被調(diào)用的目標(biāo)對(duì)象?#root.target
targetClassroot object?當(dāng)前被調(diào)用的目標(biāo)對(duì)象類?#root.targetClass
argsroot object?當(dāng)前被調(diào)用的方法的參數(shù)列表?#root.args[0]
cachesroot object?當(dāng)前方法調(diào)用使用的緩存列表(如@Cacheable(value={"cache1", #root.caches[0].name "cache2"})),則有兩個(gè)cache
argument nameevaluation context?方法參數(shù)的名字.?可以直接?#參數(shù)名 ,也可以使用?#p0或#a0?的?#iban?、?#a0?、?#p0?形式,0代表參數(shù)的索引;
resultevaluation context?方法執(zhí)行后的返回值(僅當(dāng)方法執(zhí)行之后的判斷有效,如?#result‘unless’,’cache put’的表達(dá)式?’cache evict’的表達(dá)式
beforeInvocation=false)
四、緩存使用
??1、引入spring-boot-starter-cache模塊??2、@EnableCaching開啟緩存
??3、使用緩存注解
??4、切換為其他緩存
1. 2. 3.
五、整合redis實(shí)現(xiàn)緩存
引入spring-boot-starter-data-redis
application.yml配置redis連接地址
使用RestTemplate操作redis
1. redisTemplate.opsForValue();//操作字符串2. redisTemplate.opsForHash();//操作hash 3. redisTemplate.opsForList();//操作list
4. redisTemplate.opsForSet();//
操作set
5. redisTemplate.opsForZSet();//
操作有序set
配置緩存、CacheManagerCustomizers測(cè)試使用緩存、切換緩存、?CompositeCacheManager
4. 5.
二、Spring Boot與消息JMS、AMQP、RabbitMQ
一、概述
1.?大多應(yīng)用中,可通過消息服務(wù)中間件來提升系統(tǒng)異步通信、擴(kuò)展解耦能力2.?消息服務(wù)中兩個(gè)重要概念:
消息代理(message broker)和目的地(destination)當(dāng)消息發(fā)送者發(fā)送消息以后,將由消息代理接管,消息代理保證消息傳遞到指定目
的地。
3.?消息隊(duì)列主要有兩種形式的目的地
1.?隊(duì)列(queue):點(diǎn)對(duì)點(diǎn)消息通信(point-to-point)
2.?主題(topic):發(fā)布(publish)/訂閱(subscribe)消息通信
異步處理
應(yīng)用解耦
流量削峰
4.?點(diǎn)對(duì)點(diǎn)式:
– ?消息發(fā)送者發(fā)送消息,消息代理將其放入一個(gè)隊(duì)列中,消息接收者從隊(duì)列中獲取消息內(nèi)容, 消息讀取后被移出隊(duì)列
– ?消息只有唯一的發(fā)送者和接受者,但并不是說只能有一個(gè)接收者5.?發(fā)布訂閱式:
6. 7.
–?發(fā)送者(發(fā)布者)發(fā)送消息到主題,多個(gè)接收者(訂閱者)監(jiān)聽(訂閱)這個(gè)主題,那么 就會(huì)在消息到達(dá)時(shí)同時(shí)收到消息
JMS(Java Message Service)JAVA消息服務(wù):
–?基于JVM消息代理的規(guī)范。ActiveMQ、HornetMQ是JMS實(shí)現(xiàn)
AMQP(Advanced Message Queuing Protocol)
– ?高級(jí)消息隊(duì)列協(xié)議,也是一個(gè)消息代理的規(guī)范,兼容JMS
– ?RabbitMQ是AMQP的實(shí)現(xiàn)
JMSAMQP
定義Java api網(wǎng)絡(luò)線級(jí)協(xié)議
跨語言否是
跨平臺(tái)否是
Model提供兩種消息模型: (1)、Peer-2-Peer(2)、Pub/sub提供了五種消息模型:
(
1)、direct exchange
(2)、fanout exchange
(3)、topic change
(4)、headers exchange
(5)、system exchange?本質(zhì)來講,后四種和JMS的pub/sub模型沒有太大差別,僅是在 路由機(jī)制上做了更詳細(xì)的劃分;
支持消息類型多種消息類型:
TextMessage
MapMessage
BytesMessage StreamMessage ObjectMessage
Message?
(只有消息頭和屬性)
byte[]?當(dāng)實(shí)際應(yīng)用時(shí),有復(fù)雜的消息,可以將消息序列化后發(fā)送。
綜合評(píng)價(jià)JMS?定義了JAVA API層面的標(biāo)準(zhǔn);在java體系中,多個(gè)client?均可以通過JMS進(jìn)行交互,不需要應(yīng)用修改代碼,但是其對(duì)跨 平臺(tái)的支持較差;AMQP定義了wire-level層的協(xié)議標(biāo)準(zhǔn);天然具有跨平臺(tái)、跨語 言特性。
8. Spring支持
9.
– ?spring-jms提供了對(duì)JMS的支持
– ?spring-rabbit提供了對(duì)AMQP的支持
– ?需要ConnectionFactory的實(shí)現(xiàn)來連接消息代理
– ?提供JmsTemplate、RabbitTemplate來發(fā)送消息
– ?@JmsListener(JMS)、@RabbitListener(AMQP)注解在方法上監(jiān)聽消息代理發(fā) 布的消息
– ?@EnableJms、@EnableRabbit開啟支持
Spring Boot自動(dòng)配置
– ?JmsAutoConfiguration
– ?RabbitAutoConfiguration
二、RabbitMQ簡(jiǎn)介RabbitMQ是一個(gè)由erlang開發(fā)的AMQP(Advanved Message Queue Protocol)的開源實(shí)現(xiàn)。
核心概念
Message
消息,消息是不具名的,它由消息頭和消息體組成。消息體是不透明的,而消息頭則由一系列的可選屬性組 成,這些屬性包括routing-key(路由鍵)、priority(相對(duì)于其他消息的優(yōu)先權(quán))、delivery-mode(指出 該消息可能需要持久性存儲(chǔ))等。
Publisher
消息的生產(chǎn)者,也是一個(gè)向交換器發(fā)布消息的客戶端應(yīng)用程序。
Exchange
交換器,用來接收生產(chǎn)者發(fā)送的消息并將這些消息路由給服務(wù)器中的隊(duì)列。
Exchange有4種類型:direct(默認(rèn)),fanout, topic,?和headers,不同類型的Exchange轉(zhuǎn)發(fā)消息的策略有 所區(qū)別
RabbitMQ簡(jiǎn)介:
Queue
消息隊(duì)列,用來保存消息直到發(fā)送給消費(fèi)者。它是消息的容器,也是消息的終點(diǎn)。一個(gè)消息
可投入一個(gè)或多個(gè)隊(duì)列。消息一直在隊(duì)列里面,等待消費(fèi)者連接到這個(gè)隊(duì)列將其取走。
Binding
綁定,用于消息隊(duì)列和交換器之間的關(guān)聯(lián)。一個(gè)綁定就是基于路由鍵將交換器和消息隊(duì)列連
接起來的路由規(guī)則,所以可以將交換器理解成一個(gè)由綁定構(gòu)成的路由表。
Exchange?和Queue的綁定可以是多對(duì)多的關(guān)系。
Connection
網(wǎng)絡(luò)連接,比如一個(gè)TCP連接。
Channel
信道,多路復(fù)用連接中的一條獨(dú)立的雙向數(shù)據(jù)流通道。信道是建立在真實(shí)的TCP連接內(nèi)的虛 擬連接,AMQP?命令都是通過信道發(fā)出去的,不管是發(fā)布消息、訂閱隊(duì)列還是接收消息,這 些動(dòng)作都是通過信道完成。因?yàn)閷?duì)于操作系統(tǒng)來說建立和銷毀?TCP?都是非常昂貴的開銷,所 以引入了信道的概念,以復(fù)用一條?TCP?連接。
Consumer
消息的消費(fèi)者,表示一個(gè)從消息隊(duì)列中取得消息的客戶端應(yīng)用程序。
Virtual Host
虛擬主機(jī),表示一批交換器、消息隊(duì)列和相關(guān)對(duì)象。虛擬主機(jī)是共享相同的身份認(rèn)證和加 密環(huán)境的獨(dú)立服務(wù)器域。每個(gè)?vhost?本質(zhì)上就是一個(gè)?mini?版的?RabbitMQ?服務(wù)器,擁有 自己的隊(duì)列、交換器、綁定和權(quán)限機(jī)制。vhost?是?AMQP?概念的基礎(chǔ),必須在連接時(shí)指定,RabbitMQ?默認(rèn)的?vhost?是?/?。
Broker
表示消息隊(duì)列服務(wù)器實(shí)體
AMQP?中的消息路由
三、RabbitMQ運(yùn)行機(jī)制
??AMQP?中消息的路由過程和?Java?開發(fā)者熟悉的?JMS?存在一些差別,AMQP?中增加了Exchange?和?Binding?的角色。生產(chǎn)者把消息發(fā)布到?Exchange?上,消息最終到達(dá)隊(duì)列并被 消費(fèi)者接收,而?Binding?決定交換器的消息應(yīng)該發(fā)送到那個(gè)隊(duì)列。
Exchange?類型
??Exchange分發(fā)消息時(shí)根據(jù)類型的不同分發(fā)策略有區(qū)別,目前共四種類型:direct、fanout、topic、headers?。headers?匹配?AMQP?消息的?header而不是路由鍵,?headers?交換器和?direct?交換器完全一致,但性能差很多, 目前幾乎用不到了,所以直接看另外三種類型:
消息中的路由鍵(routing key)如果和?Binding?中的?binding key?一致, 交換器就將消息發(fā)到對(duì)應(yīng)的隊(duì)列中。路由鍵與隊(duì)
列名完全匹配,如果一個(gè)隊(duì)列綁定到交換機(jī)要求路由鍵為 “dog”,則只轉(zhuǎn)發(fā)?routing key?標(biāo)記為“dog”的消息,不會(huì)轉(zhuǎn) 發(fā)“dog.puppy”,也不會(huì)轉(zhuǎn)發(fā)“dog.guard”等等。它是完全 匹配、單播的模式。
每個(gè)發(fā)到?fanout?類型交換器的消息都會(huì)分到所 有綁定的隊(duì)列上去。fanout?交換器不處理路由鍵, 只是簡(jiǎn)單的將隊(duì)列綁定到交換器上,每個(gè)發(fā)送 到交換器的消息都會(huì)被轉(zhuǎn)發(fā)到與該交換器綁定
的所有隊(duì)列上。很像子網(wǎng)廣播,每臺(tái)子網(wǎng)內(nèi)的 主機(jī)都獲得了一份復(fù)制的消息。fanout?類型轉(zhuǎn)發(fā) 消息是最快的。
topic?交換器通過模式匹配分配消息的路由鍵屬 性,將路由鍵和某個(gè)模式進(jìn)行匹配,此時(shí)隊(duì)列 需要綁定到一個(gè)模式上。它將路由鍵和綁定鍵 的字符串切分成單詞,這些單詞之間用點(diǎn)隔開。 它同樣也會(huì)識(shí)別兩個(gè)通配符:符號(hào)“#”和符號(hào) “*”。#匹配0個(gè)或多個(gè)單詞,*匹配一個(gè)單詞。
四、RabbitMQ整合
1.?引入?spring-boot-starter-amqp
2. application.yml配置
3.?測(cè)試RabbitMQ
1. AmqpAdmin:管理組件
2. RabbitTemplate:消息發(fā)送處理組件
exchange.direct
msg
atguigu atguigu.news
atguigu.emps?msg
gulixueyuan.news
atguigu.#
exchange.topic
*.news
exchange.fanout
三、Spring Boot與檢索ElasticSearch
一、檢索
我們的應(yīng)用經(jīng)常需要添加檢索功能,開源的?ElasticSearch?是目前全文搜索引擎的 首選。他可以快速的存儲(chǔ)、搜索和分析海量數(shù)據(jù)。Spring Boot通過整合Spring Data ElasticSearch為我們提供了非常便捷的檢索功能支持;
Elasticsearch是一個(gè)分布式搜索服務(wù),提供Restful API,底層基于Lucene,采用 多shard(分片)的方式保證數(shù)據(jù)安全,并且提供自動(dòng)resharding的功能,github等大型的站點(diǎn)也是采用了ElasticSearch作為其搜索服務(wù),
二、概念
以?員工文檔?的形式存儲(chǔ)為例:一個(gè)文檔代表一個(gè)員工數(shù)據(jù)。存儲(chǔ)數(shù)據(jù)到ElasticSearch?的行為叫做?索引?,但在索引一個(gè)文檔之前,需要確定將文檔存 儲(chǔ)在哪里。
一個(gè)?ElasticSearch?集群可以 包含多個(gè)?索引?,相應(yīng)的每個(gè)索引可以包含多 個(gè)?類型?。 這些不同的類型存儲(chǔ)著多個(gè)?文檔?,每個(gè)文檔又有 多個(gè)?屬性?。
??類似關(guān)系:
–?索引-數(shù)據(jù)庫
–?類型-表
–?文檔-表中的記錄–?屬性-列
ES集群
microsoft
megacorp
索引
employee
product
employee
product
類型
{id:1,name:”張三”,age:18}
{id:2,name:”李四”,age:19}
文檔
{id:3,name:”王五”,age:20}
{id:1,name:”張三”,age:18}
{id:2,name:”李四”,age:19}
{id:3,name:”王五”,age:20}
屬性
三、整合ElasticSearch測(cè)試
??引入spring-boot-starter-data-elasticsearch??安裝Spring Data?對(duì)應(yīng)版本的ElasticSearch
??application.yml配置
??Spring Boot自動(dòng)配置的
ElasticsearchRepository、ElasticsearchTemplate、Jest??測(cè)試ElasticSearch
四、Spring Boot與任務(wù)異步任務(wù)、定時(shí)任務(wù)、郵件任務(wù)
一、異步任務(wù)
在Java應(yīng)用中,絕大多數(shù)情況下都是通過同步的方式來實(shí)現(xiàn)交互處理的;但是在 處理與第三方系統(tǒng)交互的時(shí)候,容易造成響應(yīng)遲緩的情況,之前大部分都是使用 多線程來完成此類任務(wù),其實(shí),在Spring 3.x之后,就已經(jīng)內(nèi)置了@Async來完 美解決這個(gè)問題。
兩個(gè)注解:
@EnableAysnc、@Aysnc
二、定時(shí)任務(wù)
項(xiàng)目開發(fā)中經(jīng)常需要執(zhí)行一些定時(shí)任務(wù),比如需要在每天凌晨時(shí)候,分析一次前 一天的日志信息。Spring為我們提供了異步執(zhí)行任務(wù)調(diào)度的方式,提供TaskExecutor?、TaskScheduler?接口。
兩個(gè)注解:@EnableScheduling、@Scheduledcron表達(dá)式:
特殊字符代表含義
,枚舉
-區(qū)間
*任意
/步長(zhǎng)
?日/星期沖突匹配
L最后
W工作日
C和calendar聯(lián)系后計(jì)算過的值
#星期,4#2,第2個(gè)星期四
字段允許值允許的特殊字符
秒0-59,-*/
分0-59,-*/
小時(shí)0-23,-*/
日期1-31,-*?/LWC
月份1-12,-*/
星期0-7或SUN-SAT 0,7是SUN,-*?/LC#
三、郵件任務(wù)
郵件發(fā)送需要引入spring-boot-starter-mail
Spring Boot?自動(dòng)配置MailSenderAutoConfiguration
定義MailProperties內(nèi)容,配置在application.yml中
自動(dòng)裝配JavaMailSender
測(cè)試郵件發(fā)送
zhangsan@qq.com
qq郵箱服務(wù)器
lisi@163.com
163郵箱服務(wù)器
五、Spring Boot與安全安全、Spring Security
一、安全
Spring Security是針對(duì)Spring項(xiàng)目的安全框架,也是Spring Boot底層安全模 塊默認(rèn)的技術(shù)選型。他可以實(shí)現(xiàn)強(qiáng)大的web安全控制。對(duì)于安全控制,我們僅 需引入spring-boot-starter-security模塊,進(jìn)行少量的配置,即可實(shí)現(xiàn)強(qiáng)大的 安全管理。
幾個(gè)類:WebSecurityConfigurerAdapter:自定義Security策略AuthenticationManagerBuilder:自定義認(rèn)證策略@EnableWebSecurity:開啟WebSecurity模式
??應(yīng)用程序的兩個(gè)主要區(qū)域是“認(rèn)證”和“授權(quán)”(或者訪問控制)。 這兩個(gè)主要區(qū)域是Spring Security?的兩個(gè)目標(biāo)。
??“認(rèn)證”(Authentication),是建立一個(gè)他聲明的主體的過程(一 個(gè)“主體”一般是指用戶,設(shè)備或一些可以在你的應(yīng)用程序中執(zhí)行動(dòng) 作的其他系統(tǒng))。
“授權(quán)”(Authorization)指確定一個(gè)主體是否允許在你的應(yīng)用程序 執(zhí)行一個(gè)動(dòng)作的過程。為了抵達(dá)需要授權(quán)的店,主體的身份已經(jīng)有認(rèn) 證過程建立。
這個(gè)概念是通用的而不只在Spring Security中。
二、Web&安全
1.?登陸/注銷
–?HttpSecurity配置登陸、注銷功能
2. Thymeleaf提供的SpringSecurity標(biāo)簽支持
–?需要引入thymeleaf-extras-springsecurity4
–?sec:authentication=“name”獲得當(dāng)前用戶的用戶名
–?sec:authorize=“hasRole(‘ADMIN’)”當(dāng)前用戶必須擁有ADMIN權(quán)限時(shí)才會(huì)顯示標(biāo)簽內(nèi)容
3. 4.
remember me
– ?表單添加remember-me的checkbox
– ?配置啟用remember-me功能
CSRF(Cross-site request forgery)跨站請(qǐng)求偽造
–?HttpSecurity啟用csrf功能,會(huì)為表單添加_csrf的值,提交攜帶來預(yù)防CSRF;
六、Spring Boot與分布式分步式、Dubbo/Zookeeper、Spring Boot/Cloud
一、分布式應(yīng)用
在分布式系統(tǒng)中,國內(nèi)常用zookeeper+dubbo組合,而Spring Boot推薦使用 全棧的Spring,Spring Boot+Spring Cloud。
分布式系統(tǒng):
??單一應(yīng)用架構(gòu)當(dāng)網(wǎng)站流量很小時(shí),只需一個(gè)應(yīng)用,將所有功能都部署在一起,以減少部署節(jié)點(diǎn)和成
本。此時(shí),用于簡(jiǎn)化增刪改查工作量的數(shù)據(jù)訪問框架(ORM)是關(guān)鍵。
??垂直應(yīng)用架構(gòu)當(dāng)訪問量逐漸增大,單一應(yīng)用增加機(jī)器帶來的加速度越來越小,將應(yīng)用拆成互不相干
的幾個(gè)應(yīng)用,以提升效率。此時(shí),用于加速前端頁面開發(fā)的Web框架(MVC)是關(guān)鍵。
??分布式服務(wù)架構(gòu)
當(dāng)垂直應(yīng)用越來越多,應(yīng)用之間交互不可避免,將核心業(yè)務(wù)抽取出來,作為獨(dú)立的服 務(wù),逐漸形成穩(wěn)定的服務(wù)中心,使前端應(yīng)用能更快速的響應(yīng)多變的市場(chǎng)需求。此時(shí), 用于提高業(yè)務(wù)復(fù)用及整合的分布式服務(wù)框架(RPC)是關(guān)鍵。
??流動(dòng)計(jì)算架構(gòu)
當(dāng)服務(wù)越來越多,容量的評(píng)估,小服務(wù)資源的浪費(fèi)等問題逐漸顯現(xiàn),此時(shí)需增加一個(gè) 調(diào)度中心基于訪問壓力實(shí)時(shí)管理集群容量,提高集群利用率。此時(shí),用于提高機(jī)器利 用率的資源調(diào)度和治理中心(SOA)是關(guān)鍵。
??ZooKeeper
二、Zookeeper和Dubbo
ZooKeeper?是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù)。它是 一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、 域名服務(wù)、分布式同步、組服務(wù)等。
??Dubbo
Dubbo是Alibaba開源的分布式服務(wù)框架,它最大的特點(diǎn)是按照分層的方 式來架構(gòu),使用這種方式可以使各個(gè)層之間解耦合(或者最大限度地松耦 合)。從服務(wù)模型的角度來看,Dubbo采用的是一種非常簡(jiǎn)單的模型,要 么是提供方提供服務(wù),要么是消費(fèi)方消費(fèi)服務(wù),所以基于這一點(diǎn)可以抽象 出服務(wù)提供方(Provider)和服務(wù)消費(fèi)方(Consumer)兩個(gè)角色。
https://github.com/alibaba/dubbo
??1、安裝zookeeper作為注冊(cè)中心??2、編寫服務(wù)提供者
??3、編寫服務(wù)消費(fèi)者
??4、整合dubbo
com.alibaba.spring.boot dubbo-spring-boot-starter 2.0.0
三、Spring Boot和Spring Cloud
Spring Cloud
Spring Cloud是一個(gè)分布式的整體解決方案。Spring Cloud?為開發(fā)者提供了在分布式系統(tǒng)(配 置管理,服務(wù)發(fā)現(xiàn),熔斷,路由,微代理,控制總線,一次性token,全局瑣,leader選舉,分 布式session,集群狀態(tài))中快速構(gòu)建的工具,使用Spring Cloud的開發(fā)者可以快速的啟動(dòng)服務(wù) 或構(gòu)建應(yīng)用、同時(shí)能夠快速和云平臺(tái)資源進(jìn)行對(duì)接。
??SpringCloud分布式開發(fā)五大常用組件??服務(wù)發(fā)現(xiàn)——Netflix Eureka
??客服端負(fù)載均衡——Netflix Ribbon
??斷路器——Netflix Hystrix
??服務(wù)網(wǎng)關(guān)——Netflix Zuul
??分布式配置——Spring Cloud Config
微服務(wù)
Martin Fowler?微服務(wù)原文?https://martinfowler.com/articles/microservices.html
??Spring Cloud?入門
–?1、創(chuàng)建provider
–?2、創(chuàng)建consumer
–?3、引入Spring Cloud
–?4、引入Eureka注冊(cè)中心
–?5、引入Ribbon進(jìn)行客戶端負(fù)載均衡
七、Spring Boot與開發(fā)熱部署熱部署
一、熱部署
在開發(fā)中我們修改一個(gè)Java文件后想看到效果不得不重啟應(yīng)用,這導(dǎo)致大量時(shí)間 花費(fèi),我們希望不重啟應(yīng)用的情況下,程序可以自動(dòng)部署(熱部署)。有以下四 種情況,如何能實(shí)現(xiàn)熱部署。
??1、模板引擎
–?在Spring Boot中開發(fā)情況下禁用模板引擎的cache–?頁面模板改變ctrl+F9可以重新編譯當(dāng)前頁面并生效
2、Spring LoadedSpring官方提供的熱部署程序,實(shí)現(xiàn)修改類文件的熱部署
–?下載Spring Loaded(項(xiàng)目地址https://github.com/spring- projects/spring-loaded)
–?添加運(yùn)行時(shí)參數(shù);-javaagent:C:/springloaded-1.2.5.RELEASE.jar?–noverify
3、JRebel
–?收費(fèi)的一個(gè)熱部署軟件–?安裝插件使用即可
4、Spring Boot Devtools(推薦)–?引入依賴
org.springframework.boot spring-boot-devtools
–?IDEA使用ctrl+F9–?或做一些小調(diào)整
Intellij IEDA和Eclipse不同,Eclipse設(shè)置了自動(dòng)編譯之后,修改類它會(huì)自動(dòng)編譯,而IDEA在非RUN或DEBUG情況下 才會(huì)自動(dòng)編譯(前提是你已經(jīng)設(shè)置了Auto-Compile)。
??設(shè)置自動(dòng)編譯(settings-compiler-make project automatically)??ctrl+shift+alt+/(maintenance)
??勾選compiler.automake.allow.when.app.running
八、Spring Boot與監(jiān)控管理
一、監(jiān)控管理
通過引入spring-boot-starter-actuator,可以使用Spring Boot為我們提供的準(zhǔn) 生產(chǎn)環(huán)境下的應(yīng)用監(jiān)控和管理功能。我們可以通過HTTP,JMX,SSH協(xié)議來進(jìn) 行操作,自動(dòng)得到審計(jì)、健康及指標(biāo)信息等
??步驟:
–?引入spring-boot-starter-actuator
–?通過http方式訪問監(jiān)控端點(diǎn)
–?可進(jìn)行shutdown(POST?提交,此端點(diǎn)默認(rèn)關(guān)閉)
??監(jiān)控和管理端點(diǎn)
端點(diǎn)名描述
autoconfig
所有自動(dòng)配置信息
auditevents
審計(jì)事件
beans
所有Bean的信息
configprops所有配置屬性
dump
線程狀態(tài)信息
env
當(dāng)前環(huán)境信息
health
應(yīng)用健康狀況
info
當(dāng)前應(yīng)用信息
metrics
應(yīng)用的各項(xiàng)指標(biāo)
mappings
應(yīng)用@RequestMapping映射路徑
shutdown關(guān)閉當(dāng)前應(yīng)用(默認(rèn)關(guān)閉)
trace
追蹤信息(最新的http請(qǐng)求)
二、定制端點(diǎn)信息
–?定制端點(diǎn)一般通過endpoints+端點(diǎn)名+屬性名來設(shè)置。
–?修改端點(diǎn)id(endpoints.beans.id=mybeans)
–?開啟遠(yuǎn)程應(yīng)用關(guān)閉功能(endpoints.shutdown.enabled=true)–?關(guān)閉端點(diǎn)(endpoints.beans.enabled=false)
–?開啟所需端點(diǎn)
??endpoints.enabled=false
??endpoints.beans.enabled=true
–?定制端點(diǎn)訪問根路徑
??management.context-path=/manage
–?關(guān)閉http端點(diǎn)
??management.port=-1