RSocket
RSocket (英語) は、バイトストリームトランスポートで使用するためのバイナリプロトコルです。これにより、単一の接続を介して渡される非同期メッセージを介して対称的な相互作用モデルが可能になります。
Spring Framework の spring-messaging
モジュールは、クライアント側とサーバー側の両方で RSocket リクエスターとレスポンダーのサポートを提供します。RSocket プロトコルの概要など、詳細については、Spring Framework リファレンスの RSocket セクションを参照してください。
RSocket 戦略の自動構成
Spring Boot は、RSocket ペイロードのエンコードとデコードに必要なすべてのインフラストラクチャを提供する RSocketStrategies
(Javadoc) Bean を自動構成します。デフォルトでは、自動構成によって次の項目が (順番に) 構成されます。
Jackson を使用した CBOR (英語) コーデック
Jackson を使用した JSON コーデック
spring-boot-starter-rsocket
スターターは両方の依存関係を提供します。カスタマイズの可能性について詳しくは、Jackson サポートセクションを参照してください。
開発者は、RSocketStrategiesCustomizer
(Javadoc) インターフェースを実装する Bean を作成することで、RSocketStrategies
(Javadoc) コンポーネントをカスタマイズできます。@Order
(Javadoc) はコーデックの順序を決定するため重要であることに注意してください。
RSocket サーバーの自動構成
Spring Boot は、RSocket サーバーの自動構成を提供します。必要な依存関係は spring-boot-starter-rsocket
によって提供されます。
Spring Boot を使用すると、WebFlux サーバーから WebSocket を介して RSocket を公開したり、独立した RSocket サーバーを立ち上げることができます。これは、アプリケーションの型とその構成によって異なります。
WebFlux アプリケーション (型 WebApplicationType.REACTIVE
(Javadoc) ) の場合、次のプロパティが一致する場合にのみ、RSocket サーバーが Web サーバーに接続されます。
プロパティ
YAML
spring.rsocket.server.mapping-path=/rsocket
spring.rsocket.server.transport=websocket
spring:
rsocket:
server:
mapping-path: "/rsocket"
transport: "websocket"
RSocket を Web サーバーに接続することは、Reactor Netty でのみサポートされています。RSocket 自体はそのライブラリで構築されています。 |
または、RSocket TCP または websocket サーバーは、独立した組み込みサーバーとして起動されます。依存関係の要件に加えて、唯一の必要な構成は、そのサーバーのポートを定義することです。
プロパティ
YAML
spring.rsocket.server.port=9898
spring:
rsocket:
server:
port: 9898
Spring メッセージング RSocket サポート
Spring Boot は、RSocket の Spring メッセージングインフラストラクチャを自動構成します。
これは、Spring Boot がアプリケーションへの RSocket リクエストを処理する RSocketMessageHandler
(Javadoc) Bean を作成することを意味します。
RSocketRequester で RSocket サービスを呼び出す
サーバーとクライアント間で RSocket
(英語) チャネルが確立されると、どの側も相手にリクエストを送信したり受信したりできるようになります。
サーバーの場合は、RSocket @Controller
(Javadoc) の任意のハンドラーメソッドに RSocketRequester
(Javadoc) インスタンスを挿入できます。クライアントの場合は、最初に RSocket 接続を構成して確立する必要があります。Spring Boot は、このような場合に予想されるコーデックを使用して RSocketRequester.Builder
(Javadoc) を自動構成し、RSocketConnectorConfigurer
(Javadoc) Bean を適用します。
RSocketRequester.Builder
(Javadoc) インスタンスはプロトタイプ Bean です。つまり、各インジェクションポイントは新しいインスタンスを提供します。このビルダーはステートフルであり、同じインスタンスを使用して異なるセットアップのリクエスターを作成してはならないため、これは意図的に行われます。
次のコードは典型的な例を示しています。
Java
Kotlin
import reactor.core.publisher.Mono;
import org.springframework.messaging.rsocket.RSocketRequester;
import org.springframework.stereotype.Service;
@Service
public class MyService {
private final RSocketRequester rsocketRequester;
public MyService(RSocketRequester.Builder rsocketRequesterBuilder) {
this.rsocketRequester = rsocketRequesterBuilder.tcp("example.org", 9898);
}
public Mono<User> someRSocketCall(String name) {
return this.rsocketRequester.route("user").data(name).retrieveMono(User.class);
}
}
import org.springframework.messaging.rsocket.RSocketRequester
import org.springframework.stereotype.Service
import reactor.core.publisher.Mono
@Service
class MyService(rsocketRequesterBuilder: RSocketRequester.Builder) {
private val rsocketRequester: RSocketRequester
init {
rsocketRequester = rsocketRequesterBuilder.tcp("example.org", 9898)
}
fun someRSocketCall(name: String): Mono<User> {
return rsocketRequester.route("user").data(name).retrieveMono(
User::class.java
)
}
}