マイクロサービス領域におけるredisの貢献度を説明する
前置き
redisといえば、皆さんの頭に浮かぶキーワードは、おそらく NoSQL、KV、ハイパフォーマンス、キャッシュ、などなど。しかし、今日の記事は別の観点、つまりマイクロサービスからスタートします。
この記事を書いた理由もインタビューの経験からで、ストレンジャーの候補者(つまり出会い系のストレンジャー)のインタビューで、彼は非常に興味深いと感じた点を述べました、彼はストレンジャーのredisは非常に広く使われており、通常のキャッシュに加えて、いくつかのシナリオも使用するNoSQLデータベースとして、さらにマイクロサービスのレジストリとして、redisを使って、RPC RPC呼び出しプロトコルで使用されていると言いました。 {その レジストリ
レジストリとしての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を指定します。
登録されたデータは以下のような感じで、タイプハッシュがあります。
/dubbo/${service}/${category} です。
として
/dubbo/com.newboo.sample.api.DemoService/dubbo/com.newboo.sample.api.DemoService
保存されたキーの下にあるハッシュデータ構造は、登録されたアップロードのURLで、値は有効期限です。
<ブロッククオート
127.0.0.1:6379> hgetall /dubbo/com.newboo.sample.api.DemoService
1) "dubbo://172.23.233.142:20881/com.newboo.sample.api.DemoService?anyhost=true&application=boot-samples-dubbo&deprecated=false& dubbo=2.0.Dubbo=2.0.Dubbo://172.23.233.142:20881/com.newboo.sample.api-DemoService? 2&dynamic=true&generic=false&interface=com.newboo.sample.api.DemoService&metadata-type=remote&methods=sayHello&pid=19807 &release=2.7.8&side=provider×tamp=1621857955355"
2) "1621858734778"。
理論的には、レジストリはデータの保存、プッシュチェンジのリッスン、ハートビート検出という基本的な機能を満たすだけでよいのです。
redisが独自の機能を使ってレジストリを完成させている例として、dubboを取り上げます(例としてdubboバージョン2.7.8を取り上げます)。
サービス登録
-
プロバイダは、サービス提供者のurlを
/dubbo/${service}
で、データ型はハッシュ、キーはプロバイダの url、値はキーの有効期限、デフォルトは 60s で、以下のように設定可能です。 -
書き込みが完了した後、データは次のように入力されます。
/dubbo/${service}
をキーとして呼び出しpublish
コマンドは、初期化時に登録イベントプロバイダを公開し、すべての1/2 expiration time
(デフォルトは30秒)で - プロバイダが再登録され、register イベントが投稿されます。
サービス発見
-
マッチングを取得する
/dubbo/${service}/*
キー(ここではkeys
コマンド)を使用すると、次のようになります。/dubbo/${service}
/dubbo/${service}
/code ,/dubbo/${service}
for/dubbo/${service}/*
The key taken for thehgetall
to get the real provider list and configuration data, assemble and match Also, open a separate thread for each subscribed service, for/dubbo/${service}
Executepsubscribe
command to block and wait for an event to occur From the source code and testing, dubbo's redis registry cannot be used directly in a production environment for two reasons. uses thekeys
command, it will block the single-threaded redis, and all other commands will have to be queued while keys is executed Without the heartbeat detection feature, I tested that the provider was beingkill -9
The consumer is not aware of this after it is killed. But from the implementation point of view is to determine whether the service is available through the stored expiration time, that is, you need to compare the url corresponding to the value and the current time, if the expiration should be eliminated, but this part does not seem to be fully implemented Although dubbo's redis registry is not available for production, it does not affect the ability to build a production-ready registry, and Stranger is a good example. RPC call protocol The redis protocol as an RPC call protocol was also told to me by a fellow stranger, when I asked him two questions. Why did you choose the redis protocol as the RPC call protocol? /p- How does the redis protocol pass through a header like
implicit parameter
The answer to the first question is also rather unexpected, he said it is for cross-language calls, when I thought that only http, gRPC and other protocols to do cross-language, redis protocol cross-language is also the first time I heard. But on second thought, there's really nothing wrong with it. Which back-end language now doesn't implement the redis client?
The redis protocol is cross-language, thanks to its very simple and easy-to-implement design.
http://redisdoc.com/topic/protocol.html
I'll give you an example of how simple the redis protocol is, from a project I've been following for a long time
https://github.com/jdp
It is a php implementation of the redis client with a single php file, the
196 lines in total
The 196 lines contain comments, variable definitions, link creation, etc. There is very little code to actually parse the protocol, and the request is encoded and sent using only17 lines of code
and the only code returned by parsing is58 lines
! As described in the project description.simple, no-nonsense
The second question was answered as I expected, from the level of the redis protocol can not support the implicit parameters like header for the time being, but the RPC framework of Stranger is self-developed, so they solve this problem at the framework level, serialization they choose
json
If you want to pass through the header parameters, the framework assembles the parameters into the transport body.Unfortunately, the implementation of the redis protocol in dubbo is not complete and cannot expose the redis protocol, it can only be called, so the test can only test the client connecting to the redis server to make get and set calls, which is not very meaningful.
Summary
redis is currently a very versatile storage component, and while it's not mainstream in the microservices space, it does give us a way to think that at least this path is possible.
This article about the contribution of redis in the microservices domain is all about this. For more information about redis microservices, please search the previous articles of Scripting House or continue to browse the following related articles.
- How does the redis protocol pass through a header like
関連
-
Redisクラスタのマスターノードとスレーブノードを縮小する詳細チュートリアル
-
CentOS 8.4へのRedis 6.2.6の詳細なインストール方法
-
redis の RedissonLock が待ちロックを実装する方法
-
Redisの重複排除の3つの手法のまとめ
-
Redis 高効率化の理由とデータ構造の解析
-
Redisによる分散シングルナンバーと分散ID(カスタムルール生成)
-
Redisトランザクション処理の使用方法
-
SpringBootがRedisの分散ロックを利用して並行処理の問題を解決することについて
-
インストール後、Redis-cliが動作しない(redis-cli: コマンドが見つからない)。
-
RedisTemplateでRedisを操作する、この記事で十分です(a)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン