當前位置:首頁 » 硬碟大全 » guava緩存過期
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

guava緩存過期

發布時間: 2023-01-22 18:49:26

⑴ Spring本地緩存的使用方法

我們現在在用的Spring Cache,可以直接看Spring Boot提供的緩存枚舉類,有如下這些:

EhCache:一個純Java的進程內緩存框架,所以也是基於本地緩存的。(注意EhCache2.x和EhCache3.x相互不兼容)。
Redis:分布式緩存,只有Client-Server(CS)模式,Java一般使用Jedis/Luttuce來操縱。
Hazelcast:基於內存的數據網格。雖然它基於內存,但是分布式應用程序可以使用Hazelcast進行分布式緩存、同步、集群、處理、發布/訂閱消息等。
Guava:它是Google Guava工具包中的一個非常方便易用的本地化緩存實現,基於LRU(最近最少使用)演算法實現,支持多種緩存過期策略。在Spring5.X以後的版本已經將他標記為過期了。
Caffeine:是使用Java8對Guava緩存的重寫版本,在Spring5中將取代了Guava,支持多種緩存過期策略。
SIMPLE:使用ConcurrentMapCacheManager,因為不支持緩存過期時間,所以做本地緩存基本不考慮該方式。

關於分布式緩存,我們需要後面會專門討論Redis的用法,這里只看本地緩存。性能從高到低,依次是Caffeine,Guava,ConcurrentMapCacheManager,其中Caffeine在讀寫上都快了Guava近一倍。

這里我們只討論在Spring Boot裡面怎麼整合使用Caffeine和EhCache。

主要有以下幾個步驟:

1)加依賴包:

2)配置緩存:
這里有兩種方法,通過文件配置或者在配置類裡面配置,先看一下文件配置,我們可以寫一個properties文件,內容像這樣:

然後還要在主類中加上@EnableCaching註解:

另外一種更靈活的方法是在配置類中配置:

應用類:

測試類:

導入依賴包,分為2.x版本和3.x版本。
其中2.x版本做如下導入:

3.x版本做如下導入:

導包完成後,我們使用JCacheManagerFactoryBean + ehcache.xml的方式配置:

參考資料:

https://blog.csdn.net/f641385712/article/details/94982916

http://www.360doc.com/content/17/1017/20/16915_695800687.shtml

⑵ guava cache中怎麼清除緩存

【手動清理】
1、進入手機設置選項,選擇 設置——應用 。
2、 按一下Menu鍵,選擇「按大小排序」。
3、在排序好的列表中點擊應用程序。
4、點擊"清除緩存"選項,即刻就會釋放緩存

⑶ 位元組三面:到底知不知道什麼是Eureka

什麼是服務注冊?

首先我們來了解下,服務注冊、服務發現和服務注冊中心的之間的關系。

舉個形象的例子,三者之間的關系就好像是供貨商,顧客和商店。

首先各地的供貨商會將各種商品提供給商店,然後顧客需要商品的時候會去商店購買。

注冊中心就好比是這個商店,供貨商的動作就是服務注冊,商品就是注冊的服務。

當部署的服務啟動後,會注冊到注冊中心,消費者需要什麼樣的服務,就自己去注冊中心拉取。

那麼到底什麼是服務注冊,為什麼要將服務注冊到注冊中心呢?

服務注冊指的是服務在啟動時將服務的信息注冊到注冊中心中,由注冊中心統一對所有的注冊的服務進行管理。

現在我們想想,假如你是消費者,你需要買一個商品,你可以去商店,也可以直接去供貨商。

但是如果今天你要買很多商品,而且我們並不知道每個商品對應的供應商的地址,那麼你就得挨家挨戶的去跑供貨商購買商品。

是不是就很麻煩了,倘若此時有一家商店,匯總了多家供貨商的商品,那你是不是只需要去這一家商店就能購買到你需要的所有的商品了呢?

這樣是不是就方便了。

在我們現實開發中,比如我們需要獲取用戶信息的時候,而此時,我們的用戶服務只部署了一個節點,那我們就可以使用IP+埠的形式訪問服務。

當此時我們的服務部署了10個節點後,我們可以通過域名訪問,通過nginx轉發到某一個節點上,訪問該節點的服務。

使用過nginx的小夥伴們都知道,每當我們需要新增一個節點的時候,我們就需要去修改nginx的配置文件,一旦服務部署的節點過多,頻繁修改配置文件就變成了一件極其麻煩的事情。

這個時候,我們的注冊中心,就應該粉墨登場了。

注冊中心一登場,我們就盡管部署服務節點,部署完成後,服務啟動,服務的信息就會被注冊到注冊中心,我們就不需要擔心是不是又要去修改配置文件了。

什麼是服務發現?

服務發現有兩種模式:一種是客戶端發現模式,一種是服務端發現模式。Eureka採用的是客戶端發現模式。

客戶端發現模式就好比我是一個土豪顧客,我去了商店,我把所有的商品都買回家,需要的時候在這些商品裡面尋找。

因為我是土豪,所以我當然不能忍受商店裡有新品上架,而我卻沒有,所以我每隔一段時間就會商店增量獲取最新的商品。

這就是Eureka中的Fetch Registry,抓取注冊信息。

Eureka Client 從 Eureka Server 獲取注冊表信息並在本地緩存。

這里我們注意一下,Eureka Client並不是直接去服務注冊表中獲取數據,而是從ReadOnly緩存中獲取數據。

並且會通過在上一個獲取周期和當前獲取周期之間獲取增量更新,這些信息會定期更新(每30秒更新一次)。

獲取的時候可能返回相同的實例。Eureka Client會自動處理重復信息。

因為我的土豪行為,我已經被商店老闆記錄在它的VVIP名單上了。可惜天有不測風雲,我破產了,我再也不能這么土豪了,沒辦法,我告訴了老闆我破產了,老闆聽了我的話,想都沒想,直接從他的VVIP名單上將我的名字給剔除了,社會就是這么現實。

這就是Eureka中的Cancel,取消。

每一個微服務節點關閉時,Eureka Client會向Eureka Server發送一個取消請求。

Eureka Server收到你的取消請求後,就會將你從服務注冊表中給剔除。

商店老闆是個傲嬌的人,她制定了一個規則,如果你是她VVIP名單上的人,你必須每隔一段時間就要去商店采購商品。

一旦你在一段時間內沒有來采購,她就覺得你已經沒有購買能力,不適合在她的VVIP名單上存在了。

她就會狠心的將你從她的VVIP名單上將我的名字給剔除了。

這就是Eureka中的Renew(更新 / 續借)

Eureka Client 內部具備一個內置的負載均衡器,它使用輪訓(round-robin)負載演算法。

在服務啟動後,每隔一定周期(默認30秒)向Eureka Server發送心跳。

如果Eureka Server在多個心跳周期內(默認90秒)沒有收到Eureka Client發送過來的心跳,Eureka Server將會在服務注冊表中將該節點剔除。

當然了,服務發現去注冊中心拉取的是服務的信息,然後需要從服務信息中獲取到服務部署的節點信息,然後通過域名地址訪問到該節點的服務。

就好像一家商店,因為空間太小,只是存放了一些商品的微縮模型,模型上寫著該商品所屬的供貨商地址,我們去商店拿到該模型後,看到供貨商的地址,然後我們就可以直接去供貨商那兒直接購買商品了。

什麼是注冊中心,注冊中心的作用?

注冊中心就是一個管理器,各個服務提供者將服務注冊到注冊中心,由注冊中心進行統一的存儲和管理。

注冊中心同時還有著判斷服務是否可用,對於不可用的服務進行剔除的功能。

至於如何判斷服務的可用性和如何剔除不可用的服務,後續會有詳細的講解。

什麼是 Eureka,有什麼作用?

Eureka採用CS架構,它分為兩大組件。

一個是Eureka Server,注冊中心服務端。

當各個微服務節點啟動後,Eureka Server 會存儲服務提供者注冊上來的服務信息,並且提供二層緩存機制來維護整個注冊中心。

另一個是Eureka Client,注冊中心客戶端。

Eureka Client是一個java客戶端,它用來簡化和Eureka Server交互。

Eureka Client 會拉取、更新和緩存 Eureka Server 中的信息。

因此當所有的 Eureka Server 節點都宕掉,服務消費者依然可以使用緩存中的信息找到服務提供者,但是當服務有更改的時候會出現信息不一致。

Eureka 架構詳解

如下圖所示,這是官網提供給我們的Eureka的架構圖Eureka 的架構,主要分為 Eureka Server 和 Eureka Client 兩部分,Eureka Client 又分為 Applicaton Service 和 Application Client,Applicaton Service 就是服務提供者,Application Client 就是服務消費者。

我們首先會在應用程序中依賴 Eureka Client,項目啟動後 Eureka Client 會向 Eureka Server 發送請求,進行注冊,並將自己的一些信息發送給 Eureka Server。

注冊成功後,每隔一定的時間,Eureka Client 會向 Eureka Server 發送心跳來續約服務,也就是匯報健康狀態。如果客戶端長時間沒有續約,那麼 Eureka Server 大約將在 90 秒內從伺服器注冊表中刪除客戶端的信息。

Eureka Client 還會定期從 Eureka Server 拉取注冊表信息,然後根據負載均衡演算法得到一個目標,並發起遠程調用,關於負載均衡在後面的課時會詳細介紹,也就是 Ribbon 組件。

應用停止時也會通知 Eureka Server 移除相關信息,信息成功移除後,對應的客戶端會更新服務的信息,這樣就不會調用已經下線的服務了,當然這個會有延遲,有可能會調用到已經失效的服務,所以在客戶端會開啟失敗重試功能來避免這個問題。

Eureka Server 會有多個節點組成一個集群,保證高可用。Eureka Server 沒有集成其他第三方存儲,而是存儲在內存中。

所以 Eureka Server 之間會將注冊信息復制到集群中的 Eureka Server 的所有節點。

這樣數據才是共享狀態,任何的 Eureka Client 都可以在任何一個 Eureka Server 節點查找注冊表信息。

Eureka 的工作流程

Eureka 的自我保護機制

什麼是自我保護機制

官方定義:自我保護模式正是一種針對網路異常波動時的安全保護措施,使用自我保護模式能使Eureka集群更加健壯穩定的運行。

為什麼要開啟自我保護機制?

如果Eureka Server在一定時間內(默認90s)(可優化)沒有收到某一個服務節點的心跳,Eureka Server將會移除該服務實例。

但是在某些時候,遇到網路分區故障,服務節點實際上是正常存活狀態,但是卻無法和Eureka Server正常通信,此時如果沒有引入自我保護機制,Eureka Server就會將該服務節點剔除。

自我保護模式的工作機制

如果15分鍾內超過85%的客戶端節點都沒有正常的心跳,那麼Eureka Server就會認為客戶端與注冊中心發生了網路故障,Eureka Server進入自我保護機制。

自我保護機制的缺點

如果在自我保護機制中,剛好某些服務節點非正常下線,但是Eureka Server並不會剔除該服務節點,服務消費者就會獲取到一個無效的服務實例。

解決方案

① :關閉自我保護機制(不推薦)

② :切換請求或斷路器,使用負載均衡的方式,設置當一個請求超過多少秒還未得到響應,速度切換請求到下一個注冊服務,例如使用Ribbon+Hystrix配置負載均衡和斷路器。

Eureka Server 進入自我保護機制後

1、Eureka Server不再從注冊表中剔除因為長時間沒有和注冊中心續約的服務節點

2、Eureka Server仍然能夠接受新服務的注冊和查詢請求,但是不會同步到其他Eureka Server節點上

3、網路正常後,當前Eureka Server節點會將新的服務節點信息同步到其他Eureka Server節點上

如何開啟自我保護

通過
eureka.server.enable-self-preservation=true/false來開啟或關閉自我保護機制。

其他關鍵配置:

清理失效服務節點的時間間隔:
eureka.server.evication-interval-timer-in-ms默認60s

續約間隔時間:
eureka.instance.lease-renewal-interval-in-seconds默認30s

續約到期時間:
eureka.instance.lease-expiration-ration-in-seconds默認90s

通過源碼窺探Eureka是如何開啟自我保護機制的

第一步,我們引入Eureka Server 依賴。

第二步,我們找到eureka-core jar包下的路徑為com.netflix.eureka下的registry包

第三步,進入AbstractInstanceRegistry 類,找到evict方法,這個是定期剔除任務的線程最終執行的方法

第四步,我們找到isLeaseExpirationEnabled()方法的實現

第五步,我們注意到
numberOfRenewsPerMinThreshold這個變數很關鍵,它的含義是每分鍾最小的續約次數

在服務注冊register和服務下線cancel兩個方法中會更新這個變數,更新該變數方法如下:

以上就是Eureka開啟自我保護的整個邏輯流程。

解除自我保護機制

1.當服務的網路分區故障解除之後,客戶端能夠和服務進行交互時,在續約的時候,更新每分鍾的續約數,當每分鍾的續約數大於85%時,則自動解除。

2.重啟服務

Eureka 的健康檢查

其實很多框架的健康狀態監控都是通過 actuator 來管理健康狀態的,並且擴展了 health 端點。

所以說我們只要在項目中集成Actuator,我們就能管理監控項目的健康狀態。

Eureka也是一樣,我們可以將某些不健康的服務節點的狀態告知Eureka Server,然後Eureka Server 會主動讓其下線。

這個就是Eureka的健康檢查。

如何實現Eureka-Actuator健康檢查?

首先我們要在pom中依賴
spring-boot-starter-actuator。

第二步,配置文件中添加
eureka.client.healthcheck.enabled=true 配置

原理分析:

首先在 中根據 eureka.client.healthcheck.enabled 的值來決定是否要裝配 EurekaHealthCheckHandler ,然後在 EurekaClientAutoConfiguration 中會注冊 HealthCheck ,但我們注冊完成後會有調用任務來進行狀態的更新,在 com.netflix.discovery.InstanceInfoReplicator.run() 中會進行狀態更新。

Eureka 的多級緩存機制

什麼是多級緩存機制

Eureka Server 為了避免同時讀取內存數據造成的並發沖突問題,採用了多級緩存機制提升服務請求的響應速度。

Eureka Server的緩存是通過一個只讀,一個讀寫緩存來實現的。

一級緩存:concurrentHashMap<key,value>readOnlyCacheMap本質是HashMap,無過期時間,保存數據信息對外輸出。

readOnlyCacheMap依賴於定時器的更新,通過與readWriteCacheMap的值做對比,以readWriteCacheMap為准。

responseCacheUpdateIntervalMs:readOnlyCacheMap緩存更新間隔,默認30s

二級緩存:LoaDing<key,value>readWriteCacheMap本質是Guava緩存,包含失效機制,保護數據信息對外輸出。

:readWriteCacheMap 緩存過期時間,默認180s。

當服務節點發生注冊,下線,過期,狀態變更等變化時

1.在內存中更新注冊表信息

2.同時過期掉readWriteCacheMap緩存,緩存清除只是會去清除readWriteCacheMap這個緩存, readOnlyCacheMap 只讀 緩存並沒有更新,也就說當客戶端的信息發生變化之後, 只讀緩存不是第一時間感知到的。只讀緩存的更新只能依賴那個30秒的定時任務來更新。

3.一段時間後(默認30s),後台線程發現readWriteCacheMap緩存為空,於是也將readOnlyCacheMap中的緩存清空

4.當有服務消費者拉取注冊表信息時,會調用ClassLoader的load方法,將內存中的注冊表信息載入到各級緩存中,並返回注冊表信息。

在Eureka Server 中會有兩個線程,一個是定時同步兩個緩存的數據,默認30s,一個是定時檢測心跳故障,默認90s。

服務拉取

1.服務消費者,默認每30s,拉取注冊表信息

2.從readOnlyCacheMap中獲取信息,如果獲取為空

3.從readWriteCacheMap中獲取,如果還是為空

4.調用ClassLoader的load方法,將內存中的注冊表信息載入到各級緩存中,並返回注冊表信息。

Eureka的區域配置

當用戶地理分布范圍很廣的時候,比如公司在上海、杭州、青島等都有分公司的時候,一般都會有多個機房。

那麼對於用戶而言,當然是希望調用本地分公司的機房中的微服務應用。

比如:上海用戶A,調用OAuth2服務,用戶A當然希望調用上海機房裡面的微服務應用。如果上海用戶A調用杭州機房的OAuth2服務,就增加的延時時間。

所以我們希望一個機房內的服務優先調用同一個機房內的服務,當同一個機房的服務不可用的時候,再去調用其它機房的服務,以達到減少延時的作用。

為此,eureka提供了region和zone兩個概念來進行分區,Eureka基於Amazon設計的,所以對於地域的區分也與Amazon一致,Amazon分為多個region,每個region包含多個zone,所以Eureka設計時也是可以設置region與zone,請求時可以優先選擇與請求服務在同一個zone的服務。

基本配置

此時無論我們調用多少次,調用的都是shanghai下面的zone1下面的服務。

一般來說我們都會結合Ribbon來實現微服務的負載均衡,而Ribbon內部會有一些專門的負載策略演算法,雖然剛剛我們說過會優先請求的是指定region下指定 Zone 區域的服務實例。

但有些時候比如當在Region=shanghai下沒有可用的zone,系統會默認載入 DEFAULT_ZONE,或者說或者同區域的服務負載過高...等等,也會自動切換成其他區域的服務。

Eureka的重試機制

由於 Spring Cloud Eureka 實現的服務治理機制強調了 CAP 原理中的 AP,即可用性與可靠性,犧牲了一定的一致性(在極端情況下它寧願接受故障實例也不要丟掉"健康"實例,如同如我們上面所說的自我保護機制)。

但不論是由於觸發了保護機制還是服務剔除的延遲,引起服務調用到這些不正常的服務,調用就會失敗,從而導致其它服務不能正常工作!

這顯然不是我們願意看到的,我們還是希望能夠增強對這類問題的容錯。所以,我們在實現服務調用的時候通常會加入一些重試機制。

從 Camden SR2 版本開始,Spring Cloud 就整合了 Spring Retry 來增強 RestTemplate 的重試能力,對於開發者來說只需通過簡單的配置,原來那些通過 RestTemplate 實現的服務訪問就會自動根據配置來實現重試策略。

開啟Eureka的重試機制很簡單,首先我們在pom中引入Spring Retry的依賴:

然後在配置文件中配置
spring.cloud.loadbalancer.retry.enabled參數來控制重試機制的開關,因為 Spring Retry默認是開啟的,所以說我們只要引入依賴即可,如果說我們想要關閉的話只需要將 spring.cloud.loadbalancer.retry.enabled設置為false即可。

其實在SpringCloud的架構組件中無論是Fegin,Ribbon,還是Zuul都提供了重試機制,這些暫且不論,後續再講到具體的組件時再進行具體的分析。

實戰 Eureka 注冊中心的部署

Eureka Server 項目搭建

1、創建一個 springcloud-eureka-server 的項目,然後在 pom 中增加
spring-cloud-starter-netflix-eureka-server 的依賴。

2.在pom.xml文件中新增
spring-cloud-starter-netflix-eureka-server依賴

3.在啟動類
上使用 @EnableEurekaServer 開啟 EurekaServer 的自動裝配功能。

4.添加配置文件application.properties

5.啟動項目,然後訪問 http://localhost:8761/ ,可以看到 Eureka 的管理頁面,表示 Eureka 啟動成功了。

1、創建一個 springcloud-eureka-client 的項目,然後在 pom 中增加
spring-cloud-starter-netflix-eureka-client 的依賴。

2.在啟動類
上使用 @EnableEurekaClient 開啟 EurekaServer 的自動裝配功能。

配置
eureka.client.serviceUrl.defaultZone 的地址,也就是剛剛啟動的 Eureka Server 的地址, http://localhost:8761/eureka/ 。

啟動客戶端,然後刷新剛剛打開的Eureka主頁,我們發現服務已經注冊成功。

Eureka 注冊中心添加密碼認證

上面我們看到我們搭建好Eureka Server 後訪問 http://localhost:8761/ ,沒有登陸就可以直接看到 Eureka 的管理頁面。

如果在實際使用中,注冊中心地址有公網 IP 的話,必然能直接訪問到,這樣是不安全的。所以我們需要對 Eureka 進行改造,通過集成 Spring-Security 來進行安全認證,加上許可權認證來保證安全性。

首先,在 pom.xml 中引入 Spring-Security 的依賴

然後在 application.properties 中加上認證的配置信息

最後增加Spring Security 配置類

這樣我們啟動Eureka Server成功後在訪問 http://localhost:8761/ ,此時瀏覽器會提示你輸入用戶名和密碼,輸入正確後才能繼續訪問 Eureka 提供的管理頁面。

總結

本章我們主要學習了Eureka相關知識,雖然Eureka已經停更了,但是很多公司還在使用它,而它也足夠穩定,它所提供的功能也足夠大多數公司使用。所以說現在面試中,Eureka相關題目還是經常出現的。反正學到了就是自己的。

祝願大家早日成為大牛,有一頭烏黑秀發的大牛。