はじめに
マイクロサービス開発を容易にするDaprをJavaで利用してみたに引き続きDaprです。
チュートリアルのStep6に相当します。
コードは下記を参照
https://github.com/koduki/example-dapr/tree/v01
構成概要
チュートリアルではPythonですが、趣味の問題でRubyを使っています。
この構成のポイントはRubyとJavaは直接通信しないどころはRubyはあくまで自分のサイドカーのDaprと話すのであってJavaを起動しているDaprとは直接話さないことです。
テストがローカルなので実は直接話すこともできるのですが、分かりやすくJavaのDaprポートを3500, RubyのDaprポートを3600とします。
コード
今回は1秒に一度、対象APIにリクエストを投げるだけの超シンプルなコードです。
javaapp
はJavaアプリのappidです。こちらを使ってDparどうして適切なアプリを自動で発見します。APIが動いているIPとかポート番号の指定は不要です。
Rubyコード内で指定しているhttp://localhost:#{MY_DAPR_PORT}
はJava側のDaprではなくRuby側のDaprです。なので常にlocalhostですし、ポート番号も今回で言えば3500では無く3600です。
require 'net/https'
require "json"
MY_DAPR_PORT=ARGV[0]
n = 0
while true do
n += 1
params = {data: {orderId: n}}
url = "http://localhost:#{MY_DAPR_PORT}/v1.0/invoke/javaapp/method/neworder"
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
headers = { "Content-Type" => "application/json" }
response = http.post(uri.path, params.to_json, headers)
sleep 1
end
実行&確認
では実行してみましょう。DaprはWebアプリだけでは無くコマンドも問題なくラッピングできるようです。
まず、API側を立ち上げます。
$ dapr run --app-id javaapp --app-port 8080 --port 3500 ./mvnw quarkus:dev
続いて別ターミナルでクライアント側を立ち上げます。
$ dapr run --app-id rubyapp --port 3600 ruby app.rb 3600
Java側の実行結果を見ると以下のようになっています。
== APP == orderId: 1
== APP == orderId: 2
== APP == orderId: 3
ちゃんと毎秒定期実行されてるのが分かりますね。
dapr list
を実行することで今起動しているDaprの一覧も確認できます。
$dapr list
APP ID HTTP PORT GRPC PORT APP PORT COMMAND AGE CREATED PID
rubyapp 3600 55932 0 ruby app.rb 3600 28m 2020-05-24 21:08.13 44897
javaapp 3500 56777 8080 ./mvnw quarkus:dev 3d 2020-05-21 21:21.30 27471
まとめ
上手くRubyとJavaでDaprを経由して通信ができました。
このアーキテクチャの面白いところはRubyコードもJavaコードもあくまでDaprとしか会話してないのでその間はHTTPなりgRPCなりでセキュリティをさほど気にしなくて良いことです。
通信の暗号化とか認証とかはDapr同士がやれば問題ないのでセキュリティに関する部分を外だしできるのは大きいですね。
分散トレーシングとかTwitter APIやKafkaなど他のコネクタもあるはずなのでそこら辺も試してみたいと思います。
同じマイクロサービス支援ということでKNativeと似たレイヤーかと最初は思ってたのですが、あちらはビルド環境やFaaS, Servelessと言ったインフラ観点よりなのに対し、こちらはかなりアプリより仕組みなのでCNCFにも採択されてますし今後が気になるツールなのは間違い無いですね。