订阅
GraphQL 订阅用于随时间从服务器接收查询的更新。一个常见的例子是从服务器发送更新通知。
常规的 GraphQL 查询使用一个简单的 (HTTP) 请求/响应来执行查询。对于订阅来说,保持了一个开放的链接。当前,我们使用 Websocket 的技术来支持订阅。我们将会在未来添加 SSE 的支持。
服务端编程模型
在 DGS 框架中,一个订阅是一个有 @DgsData
注解修饰的 datafetcher 实现。不同于普通的 datafetcher,订阅必须返回一个 org.reactivestreams.Publisher
。
import reactor.core.publisher.Flux;
import org.reactivestreams.Publisher;
⋮
@DgsData(parentType = "Subscription", field = "stocks")
public Publisher<Stock> stocks() {
return Flux.interval(Duration.ofSeconds(1)).map({ t -> Tick(t.toString()) })
}
Publisher
接口来自于 Reactive Streams。Flux 是默认的 Spring 实现。
SubscriptionDatafetcher.java
是一个完整的例子。下一步,必须选择传输实现,这取决于应用程序的部署方式。
Websockets
订阅的 endpoint 运行在 /subscriptions
上。正常的 GraphQL 查询发送到 /graphql
,而订阅请求发送到 /subscriptions
。在 GraphQL 社区里,订阅用的最常见的传输协议就是 WebSockets。
Apollo 定义了一个 sub-protocol,由客户端库支持,由 DGS 框架实现。为了启用 WebSocket 支持,需要在你的 build.gradle
中添加如下模块:
implementation 'com.netflix.graphql.dgs:graphql-dgs-subscriptions-websockets-autoconfigure:latest.release'
Apollo 客户端通过一个 link 支持 WebSocket。通常,您希望将Apollo Client配置为HTTP链接和WS链接,并根据查询类型将它们 区分 。
最后更新于
这有帮助吗?