DaprでRubyとJavaを連携させてみる


はじめに

マイクロサービス開発を容易にする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にも採択されてますし今後が気になるツールなのは間違い無いですね。