javascript
SpringBoot基础重难点
來源:SpringBoot基礎重難點 - liangxiaolong - 博客園
1、SpringBoot
1.1 概念
Spring Boot是構建所有基于Spring的應用程序的起點。Spring Boot旨在盡可能快地啟動和運行,只需最少的Spring前端配置。自己內部添加了單獨tomcat服務器.要求項目盡可能獨立運行.
Springboot自動裝配解析:
1、@SpringBootApplication注解,表明該類是springboot的主配置類,包含了@SpringBootConfiguration、@ComponentScan和@EnableAutoConfiguration注解;
2、看@SpringBootConfiguration的源碼可知,它是一個@Configuration(配置類),因此@SpringBootApplication等同于@Configuration+@ComponentScan+@EnableAutoConfiguration。
3、@EnableAutoConfiguration:自動配置的關鍵,加上此注解開啟自動裝配功能,spring會試圖在你的classpath下找到所有配置的bean然后進行裝配。
4、@ComponentScan:表示將該類自動發現掃描組件。個人理解相當于,如果掃描到有@Component、@Controller、@Service等這些注解的類,并注冊為Bean,可以自動收集所有的Spring組件,包括@Configuration類。我們經常使用@ComponentScan注解搜索beans,并結合@Autowired注解導入。可以自動收集所有的Spring組件,包括@Configuration類。我們經常使用@ComponentScan注解搜索beans,并結合@Autowired注解導入。如果沒有配置的話,Spring Boot會掃描啟動類所在包下以及子包下的使用了@Service,@Repository等注解的類。
5、@Configuration :相當于傳統的xml配置文件,如果有些第三方庫需要用到xml文件,建議仍然通過@Configuration類作為項目的配置主類——可以使用@ImportResource注解加載xml配置文件。等同于spring的XML配置文件;使用Java代碼可以檢查類型安全。
2、分布式
2.1分布式概念
將業務模塊按照特定的規則進行拆分.分別部署到不同的服務器實現了架構的解耦.
傳統項目:
存在問題:
1:模塊之間耦合度太高,其中一個功能升級,其他的模塊都得一起升級部署。
2:開發困難,各個團隊開發最后都要整合在一起.
3:系統擴展性差
4:不能靈活進行分布式部署
解決方案:
把模塊才分成獨立的工程,單節點運行,如果某一個節點壓力大了可以單獨對這個節點進行增加配置,其他節點不受影響。缺點就是系統之間交互
需要額外的工作量來進行接口的開發。把系統拆分成多個工程,需要完成系統的工程需要多個工程協作完成,這種形式就叫做分布式。
分布式:
把系統拆分成多個子系統.優點:
1:把模塊拆分,使用接口通信,降低模塊之間的耦合度.
2:把項目拆分成若干個子項目,不同的團隊負責不同的子項目.
3:增加功能時只需要再增加一個子項目,調用其他系統的接口就可以。
4:可以靈活的進行分布式部署.
5:提高代碼的復用性,比如service層,如果不采用分布式rest服務方式架構就會在手機wap商城,微信商城,pc,android,ios每個端都要寫一個service層邏輯,開發量大,難以維護一起升級,這時候就可以采用分布式rest服務方式,公用一個service層。
缺點:系統之間的交互要使用遠程通信,接口開發增大工作量,但是利大于弊。
2.2分布式項目拆分
垂直拆分:
說明:按照項目的功能(業務)模塊進行拆分.將不同的業務部署到不同的服務器中.
水平拆分:
場景:一個service可能3000行代碼由一個人完成controller-Service-mapper任務繁重.這時需要多個人開發!!
概念:按照調用的層級進行拆分.
2.3分布式項目總結
分布式項目:對外統一,對內獨立.實現了架構的解耦
2.3 分布式事務
1、分布式事務和分布式鎖?
比如從支付寶轉100元到余額寶,我們又兩個方法1、支付寶減掉100,2、余額寶加上100。傳統的在一個模塊,一個服務,或者一個方法里面,我們就很好解決了,只需要注解一個事務就行了。
@Transactional(rollbackFor=Exception.class) 這樣我們就可以保證兩個方法數據的一致性了。但是顯然,現在我們的項目中,為了滿足性能要求,不可能還這樣傳統單機實現。我們做成了兩個服務,在兩個不同的模塊 1、支付寶,2、余額寶 這樣就存在了我們提到的問題,分布式事務,這個時候如何解決呢?
通常來說呢 實現方式有如下幾種:
1、兩階段提交協議(Two-phase Commit,2PC):
架構圖
簡單來說,協調器先給A/B各發一條,準備的命令,等到都返回準備好了的命令的時候,再發起事務提交。這樣來保證事務一致性,但是存在很多問題,就是通信上中斷的情況,會導致事務一致無法提交,而可能使系統崩潰。這就可以使用第二種方案。
第二種方案:TCC補償性,分為三個階段TRYING-CONFIRMING-CANCELING。每個階段做不同的處理。
TRYING:階段主要是對業務系統進行檢測及資源預留
CONFIRMING:階段是做業務提交,通過TRYING階段執行成功后,再執行該階段。
(默認如果TRYING:階段執行成功,CONFIRMING就一定能成功。)
CANCELING:階段是回對業務做回滾,在TRYING階段中,如果存在分支事務TRYING失敗,則需要調用CANCELING將已預留的資源進行釋放。
什么是分布式鎖?
場景1:常規的我們多線程訪問同一代碼塊的時候,為了保證同一時間只能?
由一個線程訪問,保證數據安全一致性,通常我們使用synchronized關鍵字來對方法加鎖,以達到保證數據安全性。
場景2:現在越來越多的項目,為了追求性能與高并發,采用了soa架構,微服務架構,于是就會出現多個模塊單獨的服務。這個時候呢就會有一個問題,如何保證多個節點的現場同步執行呢??
這種情況呢,就會用到了分布式鎖。
分布式鎖的解決方案與實現有哪些呢?
1、數據庫解決方案思路
a.數據庫建一張表,字段方法名并且作為唯一性,當一個方法執行時插入,則相當于獲得鎖,其他線程將無法訪問,方法執行完則釋放鎖。
但是上面這種存在問題:
1、數據庫單點,出現故障則將導致系統不可用。
2、沒有失效時間,一旦操作方法異常,導致一直沒有解鎖,也將導致其他不可用用。
b.使用select * from user?u where username = '' for update?
來對記錄加上排他鎖。操作完成后使用commit命令釋放鎖。
2、基于緩存實現?
通常有Memcached、Redis實現等,以下以Redis實現分布式鎖為例
思路:主要用到的redis函數是setnx(),這個應該是實現分布式鎖最主要的函數。首先是將某一任務標識名(這里用Lock:order作為標識名的例子)作為鍵存到redis里,并為其設個過期時間,如果是還有Lock:order請求過來,先是通過setnx()看看是否能將Lock:order插入到redis里,可以的話就返回true,不可以就返回false
3.Zookeeper分布式鎖
大致思路:每個客戶端對某個方法加鎖時,在zookeeper上的與該方法對應的指定節點的目錄下,生成一個唯一的瞬時有序節點。?
判斷是否獲取鎖的方式很簡單,只需要判斷有序節點中序號最小的一個。?
當釋放鎖的時候,只需將這個瞬時節點刪除即可。同時,其可以避免服務宕機導致的鎖無法釋放,而產生的死鎖問題。
ZK中創建和刪除節點只能通過Leader服務器來執行,然后將數據同不到所有的Follower機器上,所以性能上不如基于緩存實現。
3、Ngnix
Nginx是一款輕量級的Web服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特點是占有內存少,并發能力強,事實上nginx的并發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
3.1 Nginx配置文件介紹
server代表一個服務項
server {listen 80; #監聽端口#server_name 表示攔截域名server_name localhost; #攔截請求之后處理方式location / {#root 是關鍵字 代表反向代理的文件夾名稱root html;#index 默認跳轉頁面index index.html index.htm;}}
如配置圖片代理,并修改hosts文件
配置圖片服務器
server {listen 80;server_name image.jt.com;location / {root D:/1-jt/image;} }實現域名代理
后臺管理服務器 用戶訪問manage.jt.com時訪問localhost:8091
server {listen 80;server_name manage.jt.com;location / {#代理路徑proxy_pass http://localhost:8091;} }3.2 實現負載均衡(Tomcat高可用)
設定負載均衡策略 名稱不要加"_"線 1.默認規則 輪詢
upstream jt-windows {#ip_hash;server 127.0.0.1:8091 max_fails=1 fail_timeout=60s;server 127.0.0.1:8092 max_fails=1 fail_timeout=60s;server 127.0.0.1:8093 max_fails=1 fail_timeout=60s;}#后臺管理服務器 用戶訪問manage.jt.com時訪問localhost:8091server {listen 80;server_name manage.jt.com;location / {#代理路徑proxy_pass http://jt-windows;#鏈接服務器超時proxy_connect_timeout 2; #讀取服務器資源超時 proxy_read_timeout 2;#向服務器發送數據超時 proxy_send_timeout 2; }} }3.3 常見面試題
1、請解釋一下什么是Nginx?
Nginx是一個web服務器和方向代理服務器,用于HTTP、HTTPS、SMTP、POP3和IMAP協議。
2、請列舉Nginx的一些特性。
Nginx服務器的特性包括:
反向代理/負載均衡器
嵌入式Perl解釋器
動態二進制升級
可用于重新編寫URL,具有非常好的PCRE支持
3、請列舉Nginx和Apache 之間的不同點。
4、請解釋Nginx如何處理HTTP請求。
Nginx使用反應器模式。主事件循環等待操作系統發出準備事件的信號,這樣數據就可以從套接字讀取,在該實例中讀取到緩沖區并進行處理。單個線程可以提供數萬個并發連接。
5、在Nginx中,如何使用未定義的服務器名稱來阻止處理請求?
只需將請求刪除的服務器就可以定義為:
Server {
listen 80;
server_name “ “ ;
return 444;
}
這里,服務器名被保留為一個空字符串,它將在沒有“主機”頭字段的情況下匹配請求,而一個特殊的Nginx的非標準代碼444被返回,從而終止連接。
6、 使用“反向代理服務器”的優點是什么?
反向代理服務器可以隱藏源服務器的存在和特征。它充當互聯網云和web服務器之間的中間層。這對于安全方面來說是很好的,特別是當您使用web托管服務時。
7、請列舉Nginx服務器的最佳用途。
Nginx服務器的最佳用法是在網絡上部署動態HTTP內容,使用SCGI、WSGI應用程序服務器、用于腳本的FastCGI處理程序。它還可以作為負載均衡器。
8、請解釋Nginx服務器上的Master和Worker進程分別是什么?
Master進程:讀取及評估配置和維持
Worker進程:處理請求
9、請解釋你如何通過不同于80的端口開啟Nginx?
為了通過一個不同的端口開啟Nginx,你必須進入/etc/Nginx/sites-enabled/,如果這是默認文件,那么你必須打開名為“default”的文件。編輯文件,并放置在你想要的端口:
Like server { listen 81; }
10、請解釋是否有可能將Nginx的錯誤替換為502錯誤、503?
502 = 錯誤網關
503 = 服務器超載
有可能,但是您可以確保fastcgi_intercept_errors被設置為ON,并使用錯誤頁面指令。
Location / {
fastcgi_pass 127.0.01:9001;
fastcgi_intercept_errors on;
error_page 502 =503/error_page.html;
…
11、在Nginx中,解釋如何在URL中保留雙斜線?
要在URL中保留雙斜線,就必須使用merge_slashes_off;
語法:merge_slashes [on/off]
默認值: merge_slashes on
環境: http,server
12、請解釋ngx_http_upstream_module的作用是什么?
ngx_http_upstream_module用于定義可通過fastcgi傳遞、proxy傳遞、uwsgi傳遞、memcached傳遞和scgi傳遞指令來引用的服務器組。
13、請解釋什么是C10K問題?
C10K問題是指無法同時處理大量客戶端(10,000)的網絡套接字。
14、請陳述stub_status和sub_filter指令的作用是什么?
Stub_status指令:該指令用于了解Nginx當前狀態的當前狀態,如當前的活動連接,接受和處理當前讀/寫/等待連接的總數
Sub_filter指令:它用于搜索和替換響應中的內容,并快速修復陳舊的數據
15、解釋Nginx是否支持將請求壓縮到上游?
您可以使用Nginx模塊gunzip將請求壓縮到上游。gunzip模塊是一個過濾器,它可以對不支持“gzip”編碼方法的客戶機或服務器使用“內容編碼:gzip”來解壓縮響應。
16、解釋如何在Nginx中獲得當前的時間?
要獲得Nginx的當前時間,必須使用SSI模塊、$date_gmt和$date_local的變量。
Proxy_set_header THE-TIME $date_gmt;
17、用Nginx服務器解釋-s的目的是什么?
用于運行Nginx -s參數的可執行文件。
18、解釋如何在Nginx服務器上添加模塊?
在編譯過程中,必須選擇Nginx模塊,因為Nginx不支持模塊的運行時間選擇。
4、Linux
Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟件、應用程序和網絡協議。它支持32位和64位硬件。Linux繼承了Unix以網絡為核心的設計思想,是一個性能穩定的多用戶網絡操作系統。
Linux操作系統誕生于1991 年10 月5 日(這是第一次正式向外公布時間)。Linux存在著許多不同的Linux版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬件設備中,比如手機、平板電腦、路由器、視頻游戲控制臺、臺式計算機、大型機和超級計算機。
嚴格來講,Linux這個詞本身只表示Linux內核,但實際上人們已經習慣了用Linux來形容整個基于Linux內核,并且使用GNU工程各種工具和數據庫的操作系統。
4.1 Linux命令
4.1.1 cd命令集
ifconfig 檢查IP地址 ip addr
pwd 查找當前文件位置
cd命令是linux中最基本的命令語句,必須熟練掌握
cd / 返回根目錄
cd ~ 用戶主目錄
cd . 當前目錄
cd ..返回到上一級目錄
cd /usr/ 進入到usr目錄
cd – 返回上一個目錄
cd 直接回家
4.1.2 ls目錄和文件
ls 展現文件目錄
ll 展現文件詳情
ls –l 詳細格式,文件權限,時間
ll 和ls –l作用相同
ls *.txt 查看所有的txt類型文檔
4.1.3目錄操作
mkdir 創建目錄
mkdir a 創建 a目錄
mkdir -p a/b 創建 a目錄,并在a目錄里創建b目錄
mkdir -m 777 c 創建一個權限為777的C目錄
rmdir 刪除目錄(如果目錄里有文件,則不能用此命令)
4.1.4 Vi/vim創建/查看/編輯文件
命令行:Esc切換到命令行模式。
編輯模式:
按i,在光標前開始編輯
按a,在光標后開始編輯
按o,在當前行的下一行開始編輯
按u 撤銷之前的操作
底行模式:按 shift+:冒號。
:q! 不保存退出
:wq 保存退出
:/world 從當前光標處,向上查找world關鍵字
:?world 從當前光標處,向后查找world關鍵字
4.1.5 刪除文件
rm 刪除文件
rm n.txt 提示y刪除n放棄
rm –f n.txt 不提示
rm –rf dirname 不提示遞歸刪除目錄下所以內容
rm –rf * 刪除所有文件
rm –rf /* 刪除所有子目錄所有和文件
4.1.6 復制和移動文件
cp復制文件
cp nginx.conf n.txt
cp –R tomcat1 tomcat2????????????????#復制整個目錄
mv 修改文件名,移動文件
mv n.txt m.txt
4.1.7 瀏覽文件
cat 輸出文件所有的內容
more 輸出文檔所有的內容,分頁輸出,空格瀏覽下一屏,q退出
less 用法和more相同,只是通過PgUp、PgOn鍵來控制
tail 用于顯示文件后幾號,使用頻繁
tail -10 nginx.conf 查看nginx.conf的最后10行
tail –f nginx.conf 動態查看日志,方便查看日志新增的信息
ctrl+c 結束查看
4.1.8 打包命令
tar命令位于/bin目錄下,它能夠將用戶所指定的文件或目錄打包成一個文件,但不做壓縮。一般Linux上常用的壓縮方式是選用tar將許多文件打包成一個文件,再以gzip壓縮命令壓縮成name.tar.gz的文件。
-c 創建一個新的tar文件
-v 顯示運行過程的信息
-f 指定文件名
-z 調用gzip壓縮命令進行壓縮
-t 查看壓縮文件的內容
-x 解開tar文件
tar –cvf n.tar ./* 壓縮當前目錄下的所有文件和目錄,文件名為n.tar
tar –xvf n.tar 解壓壓縮包中的文件到當前目錄(如果長時間未解壓成功 Ctrl+C推出)
tar –cvzf m.tar ./* 解壓m.tar文件到當前目錄
4.1.9 grep命令
grep root /etc/passwd 在文件中查找關鍵字root
grep root /etc/passwd –-color ????????高亮顯示
grep root /etc/passwd –A5 –B5 ????????高亮顯示,A后5行,B前5行
grep -n root /etc/passwd 查找并顯示行數
grep -v root /etc/passwd 取反,查出不含root的數據
4、Redis
5.1 簡介
Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。 它支持多種類型的數據結構,如?字符串(strings),?散列(hashes),?列表(lists),?集合(sets),?有序集合(sorted sets)?與范圍查詢,?bitmaps,?hyperloglogs?和?地理空間(geospatial)?索引半徑查詢。 Redis 內置了?復制(replication),LUA腳本(Lua scripting),?LRU驅動事件(LRU eviction),事務(transactions)?和不同級別的?磁盤持久化(persistence), 并通過?Redis哨兵(Sentinel)和自動?分區(Cluster)提供高可用性(high availability)。
常見API
Jedis?jedis?=?new?Jedis("localhost");
ShardedJedisPool連接池分片
5.2 Redis命令
5.2.1 String類型
命令 說明 案例
set 添加key-value set username admin
get 根據key獲取數據 get username
strlen 獲取key的長度 strlen key
exists 判斷key是否存在 exists name
返回1存在 0不存在
del 刪除redis中的key del key
Keys 用于查詢符合條件的key keys * 查詢redis中全部的key
keys n?me 使用占位符獲取數據
keys nam* 獲取nam開頭的數據
mset 賦值多個key-value mset key1 value1 key2 value2 key3 value3
mget 獲取多個key的值 mget key1 key2
append 對某個key的值進行追加 append key value
type 檢查某個key的類型 type key
select 切換redis數據庫 select 0-15 redis中共有16個數據庫
flushdb 清空單個數據庫 flushdb
flushall 清空全部數據庫 flushall
incr 自動加1 incr key
decr 自動減1 decr key
incrby 指定數值添加 incrby 10
decrby 指定數值減 decrby 10
expire 指定key的生效時間 單位秒 expire key 20
key20秒后失效
pexpire 指定key的失效時間 單位毫秒 pexpire key 2000
key 2000毫秒后失效
ttl 檢查key的剩余存活時間 ttl key
persist 撤銷key的失效時間 persist key
5.2.2 Hash類型
說明:可以用散列類型保存對象和屬性值
例子:User對象{id:2,name:小明,age:19}
命令 說明 案例
hset 為對象添加數據 hset key field value
hget 獲取對象的屬性值 hget key field
hexists 判斷對象的屬性是否存在 HEXISTS key field
1表示存在 0表示不存在
hdel 刪除hash中的屬性 hdel user field [field ...]
hgetall 獲取hash全部元素和值 HGETALL key
hkyes 獲取hash中的所有字段 HKEYS key
hlen 獲取hash中所有屬性的數量 hlen key
hmget 獲取hash里面指定字段的值 hmget key field [field ...]
hmset 為hash的多個字段設定值 hmset key field value [field value ...]
hsetnx 設置hash的一個字段,只有當這個字段不存在時有效 HSETNX key field value
hstrlen 獲取hash中指定key的長度 HSTRLEN key field
hvals 獲取hash的所有值 HVALS user
5.2.3 List類型
說明:Redis中的List集合是雙端循環列表,分別可以從左右兩個方向插入數據.
List集合可以當做隊列使用,也可以當做棧使用
隊列:存入數據的方向和獲取數據的方向相反
棧:存入數據的方向和獲取數據的方向相同
命令 說明 案例
lpush 從隊列的左邊入隊一個或多個元素 LPUSH key value [value ...]
rpush 從隊列的右邊入隊一個或多個元素 RPUSH key value [value ...]
lpop 從隊列的左端出隊一個元素 LPOP key
rpop 從隊列的右端出隊一個元素 RPOP key
lpushx 當隊列存在時從隊列的左側入隊一個元素 LPUSHX key value
rpushx 當隊列存在時從隊列的右側入隊一個元素 RPUSHx key value
lrange 從列表中獲取指定返回的元素 LRANGE key start stop
Lrange key 0 -1 獲取全部隊列的數據
lrem 從存于 key 的列表里移除前 count 次出現的值為 value 的元素。 這個 count 參數通過下面幾種方式影響這個操作:
?count > 0: 從頭往尾移除值為 value 的元素。
?count < 0: 從尾往頭移除值為 value 的元素。
?count = 0: 移除所有值為 value 的元素。 ?LREM list -2 “hello” 會從存于 list 的列表里移除最后兩個出現的 “hello”。
需要注意的是,如果list里沒有存在key就會被當作空list處理,所以當 key 不存在的時候,這個命令會返回 0。
Lset 設置 index 位置的list元素的值為 value LSET key index value
5.2.4 Redis事務命令
說明:redis中操作可以添加事務的支持.一項任務可以由多個redis命令完成,如果有一個命令失敗導致入庫失敗時.需要實現事務回滾.
命令 說明 案例
multi 標記一個事務開始 127.0.0.1:6379> MULTI
OK
exec 執行所有multi之后發的命令 127.0.0.1:6379> EXEC
OK
discard 丟棄所有multi之后發的命令
5.3 SpringBoot整合Redis
1、編輯redis.properties文件:
jedis.host=192.168.175.129
jedis.port=6379
2、編輯配置類:
//表示redis配置類
@Configuration //定義配置類
@PropertySource("classpath:/properties/redis.properties")
public class RedisConfig {
}
5.4 常見注解
5.4.1 @RequestParam
@RequestParam(value="aa" required=false)
1、可以對傳入參數指定參數名:@RequestParam(value="aa")
2、可以通過required=false或者true來要求@RequestParam配置的前端參數是否一定要傳?:@RequestParam(value="aa", required=true)
3、如果@requestParam注解的參數是int類型,并且required=false,此時如果不傳參數的話,會報錯。原因是,required=false時,不傳參數的話,會給參數賦值null,這樣就會把null賦值給了int,因此會報錯。
5.5 Redis分片機制
核心特點:實現了redis內存的擴容.
說明:使用多個redis節點,共同為用戶提供服務.內存空間翻倍.用戶使用時當做一個整體.并且內存保存的數據不一.
List?shards =
new ArrayList();
JedisShardInfo info1 =
new JedisShardInfo("192.168.175.129",6379);
JedisShardInfo info2 =
new JedisShardInfo("192.168.175.129",6380);
JedisShardInfo info3 =
new JedisShardInfo("192.168.175.129",6381);
shards.add(info1);
shards.add(info2);
shards.add(info3);
5.5.1 哈希一致性
概念:同一個字符串hash值是一致的
分片數據存儲原理: 根據hash一致性算法實現數據存儲.
Hash一致性運算發生在服務器端.
一致性哈希算法(Consistent Hashing Algorithm)是一種分布式算法,常用于負載均衡。Memcached client也選擇這種算法,解決將key-value均勻分配到眾多Memcached server上的問題。它可以取代傳統的取模操作,解決了取模操作無法應對增刪Memcached Server的問題(增刪server會導致同一個key,在get操作時分配不到數據真正存儲的server,命中率會急劇下降)。
簡單來說,一致性哈希將整個哈希值空間組織成一個虛擬的圓環
哈希一致性的特性
因為所有節點都是通過ip地址加算法計算獲取的,則可能會出現節點分配不均的問題.導致數據丟失.
均衡性
說明:均衡性要求節點中的數據盡可能的平均.
措施:引入虛擬節點概念
單調性
說明:當節點新增時,能夠實現數據的自動的遷移.
補充說明:如果節點一旦丟失,則導致內存丟失則整個分片無法使用.
分散性
概念:由于分布式原因,導致系統不能獲取全部的內存空間.導致一個key有多個位置.
負載
概念:由于分布式原因,系統不能獲取全部的內存地址.導致同一個位置保存多個數據
5.6 Redis持久化策略
Redis中的數據都在內存中,如果斷電宕機則內存數據丟失.其中數據應該持久化保存.不允許丟失.
持久化策略:
1.RDB模式
2.AOF模式
5.6.1 Redis持久化工作原理
說明:按照配置的時間,定期將內存數據保存到redis中的持久化文件中.
當redis服務器宕機之后重啟時,首先讀取指定的持久化文件,恢復內存數據,方便用戶使用.
5.6.2 RDB模式
概念:RDB模式是Redis中默認的持久化策略.保存的是redis的內存快照.占用的資源少.持久化效率最高的.
RDB特點:
1.RDB模式能夠定期持久化,但是有丟失數據的風險.
2.Redis中默認的持久化策略
3.RDB模式做內存的快照. 效率高
4.占用磁盤空間較小.
5.6.3 AOF模式
特點
1.AOF模式可以實現數據的實時持久化.
2.記錄的是用戶的操作過程.
3.持久化文件會比較大.
4.持久化效率低.
5.AOF模式默認是關閉的
6.AOF模式持久化是異步的.
5.6.4 Redis緩存策略說明
1.如果有并發查詢時.如果緩存服務器宕機/緩存失效.則查詢數據庫.可能導致數據庫宕機. 俗稱:緩存雪崩.
2.如果用戶,高并發查詢一個不存在的數據時.后臺數據庫有宕機的風險.
俗稱:緩存穿透
限流 直至封殺IP地址. IP模擬器
3.如果高并發條件下.當某一個熱點的key,超時或者失效時.數據庫有宕機的風險.
俗稱:緩存擊穿
5.7 Redis內存機制
Redis中的數據都保存內存中.內存中的數據如果一味的新增,不刪除則內存數據很快存滿.導致新的數據保存錯誤.
需求:用戶每次都能存儲數據,但是內存大小是可控的.要求動態維護內存大小.
5.7.1 Redis中內存策略
LRU算法
內存管理的一種頁面置換算法,對于在內存中但又不用的數據塊(內存塊)叫做LRU,操作系統會根據哪些數據屬于LRU而將其移出內存而騰出空間來加載另外的數據。
LRU(Least?recently?used,最近最少使用(按時間))算法根據數據的歷史訪問記錄來進行淘汰數據,其核心思想是“如果數據最近被訪問過,那么將來被訪問的幾率也更高”。
LFU算法
LFU(least frequently used (LFU) page-replacement algorithm)。即最不經常使用(按次數)頁置換算法,要求在頁置換時置換引用計數最小的頁,因為經常使用的頁應該有一個較大的引用次數。但是有些頁在開始時使用次數很多,但以后就不再使用,這類頁將會長時間留在內存中,因此可以將引用計數寄存器定時右移一位,形成指數衰減的平均使用次數。
LFU:根據數據使用的次數多少刪除數據.
內存優化策略
1.volatile-lru
設定超時時間的數據采用LRU算法刪除數據.
2.allkeys-lru
所有的數據采用LRU算法刪除數據
3.volatile-lfu
設定了超時時間的數據采用LFU刪除數據
4.allkeys-lfu
所有的數據采用LFU算法刪除數據
5.volatile-random
設定了超時時間的隨機刪除
6.allkeys-random
所有key隨機刪除
7.volatile-ttl
設定了超時時間的數據排序.將馬上要超時的數據提前刪除.
8.Noeviction
不刪除數據.如果內存數據存滿則報錯返回. 該策略是默認策略
5.8 Redis主從同步
5.8.1高可用介紹(HA)
“高可用性”(High Availability)通常來描述一個系統經過專門的設計,從而減少停工時間,而保持其服務的高度可用性。
概括:利用技術手段實現了當服務器宕機,自動的實現故障的遷移.
Redis的最終形態必須實現高可用,實現高可用的前提必須滿足主從同步.
當發生故障,由于從機與主機的數據是相同的,所以可以非常靈活實現數據的故障遷移.
5.9 Redis哨兵實現高可用
5.9.1 Redis中哨兵的作用
分片作用:redis分片實現了redis內存擴容.
Redis哨兵:主要實現了redis節點的高可用.
5.9.2 Redis哨兵實現步驟
1.redis哨兵會監聽redis主節點.
目的1:檢查主節點是否存活
目的2:獲取連接主節點的從機. IP:端口
2.當利用ping-pong(心跳檢測)檢測機制.檢查主節點是否存活,當哨兵連續3次檢測都沒有數據返回.則表明主節點宕機.
3.哨兵根據從主節點獲取的從節點信息,進行推選.從中挑選一臺新的從節點當做現在的主節點.將新的主從關系寫入其他節點的redis.conf文件中.
4.當服務器重啟后,能夠了解當前主從關系,實現了redis高可用.
5.10 分片與哨兵的缺點
1.Redis分片
用戶通過API利用hash一致性算法,實現了數據存儲.利用分片機制實現了內存的擴容!!!
缺點:如果一個節點宕機.,則違反單調性要求,分片失效.
2.Redis哨兵
哨兵基于心跳檢測機制.實現redis節點高可用.但是前提必須配置主從.
哨兵缺點
1.操作的redis依然是單臺,內存無法擴容.
2.Redis哨兵也有可能宕機.
5.12 常見面試題
1、什么是 Redis?簡述它的優缺點?
Redis 的全稱是:Remote Dictionary.Server,本質上是一個 Key-Value 類型的內存數據庫,很像memcached,整個數據庫統統加載在內存當中進行操作,定期通過異步操作把數據庫數據 flush 到硬盤上進行保存。
因為是純內存操作,Redis 的性能非常出色,每秒可以處理超過 10 萬次讀寫操作,是已知性能最快的Key-Value DB。
Redis 的出色之處不僅僅是性能,Redis 最大的魅力是支持保存多種數據結構,此外單個 value 的最大限制是 1GB,不像 memcached 只能保存 1MB 的數據,因此 Redis 可以用來實現很多有用的功能。
?
比方說用他的 List 來做 FIFO 雙向鏈表,實現一個輕量級的高性 能消息隊列服務,用他的 Set 可以做高性能的 tag 系統等等。
另外 Redis 也可以對存入的 Key-Value 設置 expire 時間,因此也可以被當作一 個功能加強版的memcached 來用。 Redis 的主要缺點是數據庫容量受到物理內存的限制,不能用作海量數據的高性能讀寫,因此 Redis 適合的場景主要局限在較小數據量的高性能操作和運算上。
2、Redis 與 memcached 相比有哪些優勢?
memcached 所有的值均是簡單的字符串,redis 作為其替代者,支持更為豐富的數據類型
redis 的速度比 memcached 快很多 redis 的速度比 memcached 快很多
redis 可以持久化其數據 redis 可以持久化其數據
3、Redis 支持哪幾種數據類型?
String、List、Set、Sorted Set、hashes
4、Redis 主要消耗什么物理資源?
內存。
5、Redis 有哪幾種數據淘汰策略?
?noeviction:返回錯誤當內存限制達到,并且客戶端嘗試執行會讓更多內存被使用的命令。
?allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的數據有空間存放。
?volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限于在過期集合的鍵,使得新添加的數據有空間存放。
?allkeys-random: 回收隨機的鍵使得新添加的數據有空間存放。
?volatile-random: 回收隨機的鍵使得新添加的數據有空間存放,但僅限于在過期集合的鍵。
?volatile-ttl: 回收在過期集合的鍵,并且優先回收存活時間(TTL)較短的鍵,使得新添加的數據有空間存放。
?
6、Redis 官方為什么不提供 Windows 版本?
因為目前 Linux 版本已經相當穩定,而且用戶量很大,無需開發 windows 版本,反而會帶來兼容性等問題。
7、一個字符串類型的值能存儲最大容量是多少?
512M
8、為什么 Redis 需要把所有數據放到內存中
Redis 為了達到最快的讀寫速度將數據都讀到內存中,并通過異步的方式將數據寫入磁盤。所以 redis 具有快速和數據持久化的特征,如果不將數據放在內存中,磁盤 I/O 速度為嚴重影響 redis 的性能。在內存越來越便宜的今天,redis 將會越來越受歡迎, 如果設置了最大使用的內存,則數據已有記錄數達到內存限值后不能繼續插入新值。
9、Redis 集群方案應該怎么做?都有哪些方案?
?codis
?目前用的最多的集群方案,基本和 twemproxy 一致的效果,但它支持在節點數量改變情況下,舊節點數據可恢復到新 hash 節點。
?redis cluster3.0 自帶的集群,特點在于他的分布式算法不是一致性 hash,而是 hash 槽的概念,以及自身支持節點設置從節點。具體看官方文檔介紹。
?在業務代碼層實現,起幾個毫無關聯的 redis 實例,在代碼層,對 key 進行 hash 計算,然后去對應的redis 實例操作數據。這種方式對 hash 層代碼要求比較高,考慮部分包括,節點失效后的替代算法方案,數據震蕩后的自動腳本恢復,實例的監控,等等。
?Java 架構學習資料(里面有高可用、高并發、高性能及分布式、Jvm 性能調優、Spring 源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx 等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!
10、Redis 集群方案什么情況下會導致整個集群不可用?
有 A,B,C 三個節點的集群,在沒有復制模型的情況下,如果節點 B 失敗了,那么整個集群就會以為缺少5501-11000 這個范圍的槽而不可用。
11、MySQL 里有 2000w 數據,redis 中只存 20w 的數據,如何保證 redis 中的數據都是熱點數據??
redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。
12、Redis 有哪些適合的場景?
(1)會話緩存(Session Cache)
最常用的一種使用 Redis 的情景是會話緩存(sessioncache),用 Redis 緩存會話比其他存儲(如Memcached)的優勢在于:Redis 提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?
幸運的是,隨著 Redis 這些年的改進,很容易找到怎么恰當的使用 Redis 來緩存會話的文檔。甚至廣為人知的商業平臺 Magento 也提供 Redis 的插件。
(2)全頁緩存(FPC)
除基本的會話 token 之外,Redis 還提供很簡便的 FPC 平臺。回到一致性問題,即使重啟了 Redis 實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似 PHP 本地FPC。
再次以 Magento 為例,Magento 提供一個插件來使用 Redis 作為全頁緩存后端。
此外,對 WordPress 的用戶來說,Pantheon 有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。
(3)隊列
Reids 在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得 Redis 能作為一個很好的消息隊列平臺來使用。Redis 作為隊列使用的操作,就類似于本地程序語言(如 Python)對 list 的 push/pop操作。
如果你快速的在 Google 中搜索“Redis queues”,你馬上就能找到大量的開源項目,這些項目的目的就是利用 Redis 創建非常好的后端工具,以滿足各種隊列需求。例如,Celery 有一個后臺就是使用Redis 作為 broker,你可以從這里去查看。
(4)排行榜/計數器
Redis 在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(SortedSet)也使得我們在執行這些操作的時候變的非常簡單,Redis 只是正好提供了這兩種數據結構。
所以,我們要從排序集合中獲取到排名最靠前的 10 個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執行即可:
當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執行:
ZRANGE user_scores 0 10 WITHSCORESAgora Games 就是一個很好的例子,用 Ruby 實現的,它的排行榜就是使用 Redis 來存儲數據的,你可以在這里看到。
(5)發布/訂閱
最后(但肯定不是最不重要的)是 Redis 的發布/訂閱功能。發布/訂閱的使用場景確實非常多。我已看見人們在社交網絡連接中使用,還可作為基于發布/訂閱的腳本觸發器,甚至用 Redis 的發布/訂閱功能來建立聊天系統!
13、Redis 支持的 Java 客戶端都有哪些?官方推薦用哪個?
Redisson、Jedis、lettuce 等等,官方推薦使用 Redisson。
14、Jedis 與 Redisson 對比有什么優缺點?
Jedis 是 Redis 的 Java 實現的客戶端,其 API 提供了比較全面的 Redis 命令的支持;
Redisson 實現了分布式和可擴展的 Java 數據結構,和 Jedis 相比,功能較為簡單,不支持字符串操作,不支持排序、事務、管道、分區等 Redis 特性。Redisson 的宗旨是促進使用者對 Redis 的關注分離,從而讓使用者能夠將精力更集中地放在處理業務邏輯上。
15、說說 Redis 哈希槽的概念?
Redis 集群沒有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 個哈希槽,每個 key 通過 CRC16 校驗后對 16384 取模來決定放置哪個槽,集群的每個節點負責一部分 hash 槽。
16、Redis 集群的主從復制模型是怎樣的?
為了使在部分節點失敗或者大部分節點無法通信的情況下集群仍然可用,所以集群使用了主從復制模型,每個節點都會有 N-1 個復制品.
17、Redis 集群會有寫操作丟失嗎?為什么?
Redis 并不能保證數據的強一致性,這意味這在實際中集群在特定的條件下可能會丟失寫操作。
18、Redis 集群之間是如何復制的?
異步復制
19、Redis 集群最大節點個數是多少?
16384 個
20、Redis 集群如何選擇數據庫?
Redis 集群目前無法做數據庫選擇,默認在 0 數據庫。
21、Redis 中的管道有什么用??
一次請求/響應服務器能實現處理新的請求即使舊的請求還未被響應,這樣就可以將多個命令發送到服務器,而不用等待回復,最后在一個步驟中讀取該答復。?
這就是管道(pipelining),是一種幾十年來廣泛使用的技術。例如許多 POP3 協議已經實現支持這個功能,大大加快了從服務器下載新郵件的過程。
22、怎么理解 Redis 事務?
事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行,事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。事務是一個原子操作:事務中的命令要么全部被執行,要么全部都不執行。
23、Redis 事務相關的命令有哪幾個?
MULTI、EXEC、DISCARD、WATCH
24、Redis key 的過期時間和永久有效分別怎么設置?
EXPIRE 和 PERSIST 命令
25、Redis 如何做內存優化?
盡可能使用散列表(hashes),散列表(是說散列表里面存儲的數少)使用的內存非常小,所以你應該盡可能的將你的數據模型抽象到一個散列表里面。?
比如你的 web 系統中有一個用戶對象,不要為這個用戶的名稱,姓氏,郵箱,密碼設置單獨的 key,而是應該把這個用戶的所有信息存儲到一張散列表里面。
26、Redis 回收進程如何工作的??
一個客戶端運行了新的命令,添加了新的數據。Redi 檢查內存使用情況,如果大于 maxmemory 的限制, 則根據設定好的策略進行回收。一個新的命令被執行,等等。?
所以我們不斷地穿越內存限制的邊界,通過不斷達到邊界然后不斷地回收回到邊界以下。?如果一個命令的結果導致大量內存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內存限制就會被這個內存使用量超越。
27.使用過 Redis 分布式鎖么,它是怎么實現的?
先拿 setnx 來爭搶鎖,搶到之后,再用 expire 給鎖加一個過期時間防止鎖忘記了釋放。如果在 setnx 之后執行 expire 之前進程意外 crash 或者要重啟維護了,那會怎么樣?set 指令有非常復雜的參數,這個應該是可以同時把 setnx 和 expire 合成一條指令來用的!
28.使用過 Redis 做異步隊列么,你是怎么用的?有什么缺點?
一般使用 list 結構作為隊列,rpush 生產消息,lpop 消費消息。當 lpop 沒有消息的時候,要適當 sleep一會再重試。
缺點:
?在消費者下線的情況下,生產的消息會丟失,得使用專業的消息隊列如 rabbitmq 等。
?能不能生產一次消費多次呢?
?使用 pub/sub 主題訂閱者模式,可以實現 1:N 的消息隊列。
?
29.何如避免緩存穿透、緩存雪崩??
1:在緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個 key 只允許一個線程查詢數據和寫緩存,其他線程等待。?
2:做二級緩存,A1 為原始緩存,A2 為拷貝緩存,A1 失效時,可以訪問 A2,A1 緩存失效時間設置為短期,A2 設置為長期?
3:不同的 key,設置不同的過期時間,讓緩存失效的時間點盡量均勻
6、微服務
6.1概念
在分布式的基礎之上.服務可以獨立的運行.當服務發生故障時,可以實現故障的自動化遷移.用戶無需關注.
6.2 SOA思想
面向服務的架構(SOA)是一個組件模型,它將應用程序的不同功能單元(稱為服務)進行拆分,并通過這些服務之間定義良好的接口和契約聯系起來。接口是采用中立的方式進行定義的,它應該獨立于實現服務的硬件平臺、操作系統和編程語言。這使得構建在各種各樣的系統中的服務可以以一種統一和通用的方式進行交互。
6.3 RPC協議
RPC(Remote Procedure Call)—遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程序在內的應用程序更加容易。
6.4 OSI模型(網絡7層協議規范)
6.5 RPC與HTTP區別
區別:
1.RPC是傳輸層協議(4層).而HTTP協議是應用層協議(7層).
2.RPC協議可以直接調用中立接口,HTTP協議不可以.
3.RPC通信協議是長鏈接,HTTP協議一般采用短連接需要3次握手(可以配置長鏈接添加請求頭Keep-Alive: timeout=20).
(長連接,指在一個連接上可以連續發送多個數據包,在連接保持期間,如果沒有數據包發送,需要雙方發鏈路檢測包。)
4.RPC協議傳遞數據是加密壓縮傳輸.HTTP協議需要傳遞大量的請求頭信息.
5.RPC協議一般都有注冊中心.有豐富的監控機制.
6.6 RPC總結
RPC叫遠程過程調用.它是OSI模型中第四層協議.封裝了四層以下的通訊方式.使用戶不需要了解tcp/udp等網絡傳輸協議,也能實現數據的傳輸.同時RPC一般使用時需要配置注冊中心.
6.7注冊中心
1.當服務啟動時,將服務信息服務名稱/IP/端口寫入注冊中心.
2.注冊中心接收服務端信息時保存服務信息,并且維護服務列表數據
3.當服務消費者啟動時會通過IP:端口(注冊中心)遠程鏈接注冊中心.
獲取服務列表信息.緩存到本地
4.當消費者調用服務時,查找緩存到本地的服務列表信息.之后通過負載均衡機制挑選其中一個服務進行訪問.
5.當后臺服務器宕機時,由于注冊中心有心跳檢測機制.所以可以發現某臺服務器宕機.之后更新自己的服務列表信息.之后廣播給全部消費者.
6.當消費者獲取服務列表的通知時,最終更新本地的服務列表數據.
6.2 Zookeeper注冊中心
6.2.1 Zookeeper介紹
ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。
ZooKeeper的目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
ZooKeeper包含一個簡單的原語集,提供Java和C的接口。
ZooKeeper代碼版本中,提供了分布式獨享鎖、選舉、隊列的接口,代碼在zookeeper-3.4.3\src\recipes。其中分布鎖和隊列有Java和C兩個版本,選舉只有Java版本。
總結:zookeeper是服務的協調調度服務器!!!
6.2.2 zookeeper集群說明
Zookeeper集群中leader負責監控集群狀態,follower主要負責客戶端鏈接獲取服務列表信息.同時參與投票.
7、Dubbo框架
7.1介紹
Dubbo是?阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和?Spring框架無縫集成。
Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動注冊和發現。
7.2 Dubbo工作原理
1.consumer 服務消費者
2.provider 服務提供者
3.registry 注冊中心
基于SOA思想
7.3負載均衡說明
說明:dubbo默認的負載均衡策略是隨機發送!!!!!
策略:
1.LoadBalance:Random 隨機發起請求 該配置是默認的
2.LoadBalance:RoundRobin 權重相同時輪詢策略
3.LoadBalance:LeastActive 根據響應時間的長短實現負載均衡.如果服務器響應時間越短,則用戶會將大量的請求發送給該服務器.
4.LoadBalance:ConsistentHash
根據hash算法實現負載均衡.實現服務器綁定.
配置方式:
可以在服務端/客戶端通過注解的形式配置.引用時將負載均衡類名前綴小寫即可.
@Reference(timeout = 3000,check=false,loadbalance ="random")
@Reference(timeout = 3000,check=false,loadbalance ="roundrobin")
@Reference(timeout = 3000,check=false,loadbalance ="leastactive")
@Reference(timeout = 3000,check=false,loadbalance ="consistenthash")
7.4 Dubbo面試題
1、當注冊中心宕機后,dubbo能否繼續提供服務.
依然可以正確訪問.因為消費者啟動時已經將服務列表數據緩存到本地.
2.Dubbo是什么?
Dubbo 是一個分布式、高性能、透明化的 RPC 服務框架,提供服務自動注冊、自動發現等高效服務治理方案, 可以和 Spring 框架無縫集成。
RPC 指的是遠程調用協議,也就是說兩個服務器交互數據。
3、為什么要用Dubbo?
因為是阿里開源項目,國內很多互聯網公司都在用,已經經過很多線上考驗。內部使用了 Netty、Zookeeper,保證了高性能高可用性。
使用?Dubbo?可以將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,可用于提高業務復用靈活擴展,使前端應用能更快速的響應多變的市場需求。
4、Dubbo 和 Spring Cloud 有什么區別?
兩個沒關聯,如果硬要說區別,有以下幾點。
通信方式不同
Dubbo 使用的是 RPC 通信,而?Spring Cloud?使用的是 HTTP RESTFul 方式。
5、Dubbo的核心功能?
主要就是如下3個核心功能:
Remoting:網絡通信框架,提供對多種NIO框架抽象封裝,包括“同步轉異步”和“請求-響應”模式的信息交換方式。
Cluster:服務框架,提供基于接口方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集群支持。
Registry:服務注冊,基于注冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
6、Dubbo有些哪些注冊中心?
Multicast注冊中心: Multicast注冊中心不需要任何中心節點,只要廣播地址,就能進行服務注冊和發現。基于網絡中組播傳輸實現;
Zookeeper注冊中心: 基于分布式協調系統Zookeeper實現,采用Zookeeper的watch機制實現數據變更;
redis注冊中心: 基于redis實現,采用key/Map存儲,住key存儲服務名和類型,Map中key存儲服務URL,value服務過期時間。基于redis的發布/訂閱模式通知數據變更;
Simple注冊中心
7.Dubbo的注冊中心集群掛掉,發布者和訂閱者之間還能通信么?
可以的,啟動dubbo時,消費者會從zookeeper拉取注冊的生產者的地址接口等數據,緩存在本地。每次調用時,按照本地存儲的地址進行調用。
8.Dubbo與Spring的關系?
Dubbo采用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring加載Dubbo的配置即可,Dubbo基于Spring的Schema擴展進行加載。
9.Dubbo使用的是什么通信框架?
默認使用NIO Netty框架。
10.Dubbo集群提供了哪些負載均衡策略?
Random LoadBalance: 隨機選取提供者策略,有利于動態調整提供者權重。截面碰撞率高,調用次數越多,分布越均勻;
RoundRobin LoadBalance: 輪循選取提供者策略,平均分布,但是存在請求累積的問題;
LeastActive LoadBalance: 最少活躍調用策略,解決慢提供者接收更少的請求;
ConstantHash LoadBalance: 一致性Hash策略,使相同參數請求總是發到同一提供者,一臺機器宕機,可以基于虛擬節點,分攤至其他提供者,避免引起提供者的劇烈變動;缺省時為Random隨機調用。
11.Dubbo的集群容錯方案有哪些?
Failover Cluster:失敗自動切換,當出現失敗,重試其它服務器。通常用于讀操作,但重試會帶來更長延遲。
Failfast Cluster:快速失敗,只發起一次調用,失敗立即報錯。通常用于非冪等性的寫操作,比如新增記錄。
Failsafe Cluster:失敗安全,出現異常時,直接忽略。通常用于寫入審計日志等操作。
Failback Cluster:失敗自動恢復,后臺記錄失敗請求,定時重發。通常用于消息通知操作。
Forking Cluster:并行調用多個服務器,只要一個成功即返回。通常用于實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks="2" 來設置最大并行數。
Broadcast Cluster:廣播調用所有提供者,逐個調用,任意一臺報錯則報錯 。通常用于通知所有提供者更新緩存或日志等本地資源信息。
12.Dubbo的默認集群容錯方案?
Failover Cluster。
13.Dubbo支持哪些序列化方式?
默認使用Hessian序列化,還有Duddo、FastJson、Java自帶序列化。
14.Dubbo超時時間怎樣設置?
Dubbo超時時間設置有兩種方式:
服務提供者端設置超時時間,在Dubbo的用戶文檔中,推薦如果能在服務端多配置就盡量多配置,因為服務提供者比消費者更清楚自己提供的服務特性。
服務消費者端設置超時時間,如果在消費者端設置了超時時間,以消費者端為主,即優先級更高。因為服務調用方設置超時時間控制性更靈活。如果消費方超時,服務端線程不會定制,會產生警告。
15.服務調用超時問題怎么解決?
dubbo在調用服務不成功時,默認是會重試兩次的。
16.Dubbo在安全機制方面是如何解決?
Dubbo通過Token令牌防止用戶繞過注冊中心直連,然后在注冊中心上管理授權。Dubbo還提供服務黑白名單,來控制服務所允許的調用方。
17.dubbo 和 dubbox 之間的區別?
dubbox 基于 dubbo 上做了一些擴展,如加了服務可 restful 調用,更新了開源組件等。
18.除了Dubbo還有哪些分布式框架?
大家熟知的就是Spring cloud,當然國外也有類似的多個框架。
19.Dubbo和Spring Cloud的關系?
Dubbo 是 SOA 時代的產物,它的關注點主要在于服務的調用,流量分發、流量監控和熔斷。而 Spring Cloud 誕生于微服務架構時代,考慮的是微服務治理的方方面面,另外由于依托了 Spirng、Spirng Boot 的優勢之上,兩個框架在開始目標就不一致,Dubbo 定位服務治理、Spirng Cloud 是一個生態。
8、Quartz定時任務
8.1導入時間表達式工具
該工具是時間表達式生成器.用于定時任務.
8.2業務需求
說明:如果用戶提交了訂單.在30分鐘之內沒有完成支付,則將訂單的狀態由1改為6.
8.3定時任務Quartz
Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣復雜的程序。Jobs可以做成標準的Java組件或 EJBs。Quartz的最新版本為Quartz 2.3.0。
1.調度器 負責任務管理.內部有時鐘監控
2.觸發器 當調度器需要執行任務時,通過觸發器啟動新的線程去執行.
3.JOB/JobDetail 定義任務.
8.4定時任務配置
引入jar包
編輯配置類 @Configuration public class OrderQuartzConfig {
//定義任務詳情 @Bean public JobDetail orderjobDetail() {//指定job的名稱和持久化保存任務return JobBuilder.newJob(OrderQuartz.class).withIdentity("orderQuartz").storeDurably().build(); } //定義觸發器 @Bean public Trigger orderTrigger() {/*SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(1) //定義時間周期.repeatForever();*/CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 0/1 * * * ?");return TriggerBuilder.newTrigger().forJob(orderjobDetail()).withIdentity("orderQuartz").withSchedule(scheduleBuilder).build(); }}
編輯定時任務類
//準備訂單定時任務
@Component
public class OrderQuartz extends QuartzJobBean{
}
總結
以上是生活随笔為你收集整理的SpringBoot基础重难点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 遛鬼酥油饼百度云(遛鬼酥油饼)
- 下一篇: 设计师年度工作总结简短范文(设计师年度工