2018-08-23

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集群

google

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容