RSocket
RSocket (英語) は、バイトストリームトランスポートで使用するためのバイナリプロトコルです。これにより、単一の接続を介して渡される非同期メッセージを介して対称的な相互作用モデルが可能になります。
Spring Framework の spring-messaging
モジュールは、クライアント側とサーバー側の両方で RSocket リクエスターとレスポンダーのサポートを提供します。RSocket プロトコルの概要など、詳細については、Spring Framework リファレンスの RSocket セクションを参照してください。
RSocket 戦略の自動構成
Spring Boot は、RSocket ペイロードのエンコードおよびデコードに必要なすべてのインフラストラクチャを提供する RSocketStrategies
Bean を自動構成します。デフォルトでは、自動構成は以下を順番に構成しようとします。
Jackson を使用した CBOR (英語) コーデック
Jackson を使用した JSON コーデック
spring-boot-starter-rsocket
スターターは両方の依存関係を提供します。カスタマイズの可能性について詳しくは、Jackson サポートセクションを参照してください。
開発者は、RSocketStrategiesCustomizer
インターフェースを実装する Bean を作成することにより、RSocketStrategies
コンポーネントをカスタマイズできます。コーデックの順序を決定するため、@Order
は重要であることに注意してください。
RSocket サーバーの自動構成
Spring Boot は、RSocket サーバーの自動構成を提供します。必要な依存関係は spring-boot-starter-rsocket
によって提供されます。
Spring Boot を使用すると、WebFlux サーバーから WebSocket を介して RSocket を公開したり、独立した RSocket サーバーを立ち上げることができます。これは、アプリケーションの型とその構成によって異なります。
WebFlux アプリケーション(つまり、型 WebApplicationType.REACTIVE
)の場合、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
Bean を作成することを意味します。
RSocketRequester で RSocket サービスを呼び出す
サーバーとクライアントの間に RSocket
チャネルが確立されると、どのパーティも相手とリクエストを送受信できます。
サーバーとして、RSocket @Controller
の任意のハンドラーメソッドで RSocketRequester
インスタンスを注入できます。クライアントとして、最初に RSocket 接続を構成して確立する必要があります。Spring Boot は、このような場合に予想されるコーデックを使用して RSocketRequester.Builder
を自動構成し、任意の RSocketConnectorConfigurer
Bean を適用します。
RSocketRequester.Builder
インスタンスはプロトタイプ 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
)
}
}