溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redis在微服務領域有什么奉獻

發布時間:2021-10-15 17:41:41 來源:億速云 閱讀:182 作者:小新 欄目:開發技術

小編給大家分享一下redis在微服務領域有什么奉獻,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

前言

說到redis,可能大家的腦海中蹦出的關鍵詞是:NoSQL、KV、高性能、緩存等。但今天的文章從另一個角度——微服務來展開。

這篇文章的起因也是源自一次面試經歷,在面試一位來自陌陌的候選人(就是那個交友的陌陌)時,他提到一點讓我覺得很有意思,他說redis在陌陌被使用的非常廣泛,除了常規的緩存外,某些場景下也當NoSQL數據庫來使用,還用redis作為微服務的注冊中心,甚至連RPC的調用協議都用了redis協議。

注冊中心

最早了解到redis可以作為注冊中心是從dubbo的源碼中看到,但一直也沒有過多的了解,因為從沒聽說哪家公司使用redis來做服務發現。

在dubbo中使用redis來做服務發現還是挺簡單的,引入jedis依賴,將注冊中心地址改為redis地址即可:

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>2.9.0</version>
</dependency>

dubbo.registry.address=redis://127.0.0.1:6379

注冊上來的數據是這樣,類型是hash

/dubbo/${service}/${category}

/dubbo/com.newboo.sample.api.DemoService/consumers
/dubbo/com.newboo.sample.api.DemoService/providers

hash數據結構下保存的key是注冊上來的url,value是過期時間

127.0.0.1:6379> hgetall /dubbo/com.newboo.sample.api.DemoService/providers
1) "dubbo://172.23.233.142:20881/com.newboo.sample.api.DemoService?anyhost=true&application=boot-samples-dubbo&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.newboo.sample.api.DemoService&metadata-type=remote&methods=sayHello&pid=19807&release=2.7.8&side=provider&timestamp=1621857955355"
2) "1621858734778"

從理論上來說,注冊中心只要符合數據存儲、監聽推送變更、心跳檢測這幾個基本的功能即可。

以dubbo為例看下redis是如何利用自身特性來完成注冊中心的功能( 以dubbo 2.7.8版本為例):

服務注冊

  • provider在服務注冊時,將服務提供方的url寫入/dubbo/${service}/providers下,數據類型為hash,key為提供方url,value為key的過期時間,默認為60s,可配置

  • 寫入完成后以/dubbo/${service}/providers為key調用publish命令發布一個register事件provider在初始化時起一個單獨的線程每隔1/2過期時間(默認30s)時對

  • provider進行重新重新注冊并發布register事件

服務發現

  • 獲取匹配/dubbo/${service}/*的key(此處用到了keys命令),拿到的有這幾種:/dubbo/${service}/providers、/dubbo/${service}/routers、/dubbo/${service}/configuators

  • /dubbo/${service}/*拿到的key進行hgetall,拿到真實的provider列表以及配置等數據,進行組裝、匹配

  • 同時對每個subscribe的服務單獨開一個線程,對/dubbo/${service}執行psubscribe命令阻塞等待有事件發生

redis在微服務領域有什么奉獻

從源碼和測試來看,dubbo的redis注冊中心不能直接用于生產環境,原因有如下兩點:

  • 使用了keys命令,會阻塞單線程的redis,keys執行期間,其他命令都得排隊

  • 沒有心跳檢測這個功能,我測試了provider被kill -9殺死后,consumer是無法感知的。但從實現上來看是想通過存儲的過期時間來判斷服務是否可用,即需要對比url對應的value與當前的時間,如果過期應被剔除,但這部分貌似沒有實現完整

雖然dubbo的redis注冊中心生產不可用,但這并不影響他可以構建一個生產可用的注冊中心,陌陌就是個很好的例子。

RPC調用協議

redis協議作為RPC調用協議也是陌陌同學告訴我的,當時我問了他兩個問題:

  • 為什么選擇redis協議作為RPC調用協議

  • redis協議如何透傳類似header的隱式參數

第一個問題的答案也比較出乎意料,他說是為了跨語言調用,當時覺得只有http、gRPC等協議做到了跨語言,redis協議跨語言也是第一次聽說。但仔細一想,確實沒毛病,現在哪個后端語言沒有實現redis的客戶端呢?

之所以redis協議能夠做到跨語言,這也全仰仗它的設計非常簡潔,易于實現,詳細協議內容可以參考這個鏈接:

http://redisdoc.com/topic/protocol.html

我就舉一個例子來證明redis協議簡潔到了什么程度,這是我很久之前就關注的一個項目

https://github.com/jdp/redisent

它是一個php實現的redis客戶端,只有一個php文件,共196行,這196行包含了注釋,變量定義,鏈接建立等,真正解析協議的代碼非常少,請求的編碼和發送只用了17行代碼,解析返回的代碼只有58行!正如項目的介紹那樣:simple, no-nonsense

第二個問題回答的和我的預期一致,從redis協議的層面暫時無法支持類似header的隱式參數,但陌陌的RPC框架是自研的,所以他們在框架層解決了這個問題,序列化他們選擇了json,如果要透傳header參數,框架將參數組裝到傳輸體中去。

redis在微服務領域有什么奉獻

遺憾的是dubbo中的redis協議實現并不完整,無法暴露redis協議,只能調用,所以測試也只能測試client連接到redis服務器進行get、set調用,意義不大。

以上是“redis在微服務領域有什么奉獻”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女