我很高兴宣布Swift服务器生态系统的一个新的开源项目--Swift服务发现。服务发现是一个Swift包,旨在建立一个标准的API,可由各种服务发现后端实现,如基于DNS、键值存储等。
它是如何工作的?
Swift服务发现包只定义了API,类似于SwiftLog和SwiftMetrics;实际功能由后端实现提供。
概念
- 服务身份:每个服务都必须有一个独特的身份。
Service,表示后端实现中使用的身份类型。 - 服务实例:一个服务可以有零个或多个实例,每个实例都有一个相关的位置(通常是主机-端口)。
Instance,表示后端实现中使用的服务实例类型。
服务器应用
应用程序所有者需要选择一个服务发现后端以使查询可用。这是通过添加对所需后端实现的依赖并在程序开始时将其实例化来实现的。
例如,假设选择假想的DNSBasedServiceDiscovery 作为后端:
// 1) Import the service discovery backend package
import DNSBasedServiceDiscovery
// 2) Create a concrete ServiceDiscovery object
let serviceDiscovery = DNSBasedServiceDiscovery()
要获取当前的实例列表(其中result 是Result<[Instance], Error> ):
serviceDiscovery.lookup(service) { result in
...
}
获取当前的实例列表(其中result 是Result<[Instance], Error> )并订阅未来的变化:
let cancellationToken = serviceDiscovery.subscribe(
to: service,
onNext: { result in
// This closure gets invoked once at the beginning and
// subsequently each time a change occurs
...
},
onComplete: { reason in
// This closure gets invoked when the subscription completes
...
}
)
...
// Cancel the `subscribe` request
cancellationToken.cancel()
subscribe 返回一个 ,可用于以后取消订阅。 是一个闭包,当订阅结束(例如,当服务发现实例关闭时)或通过 被取消时被调用。 可用于区分导致完成的原因。CancellationToken``onComplete CancellationToken``CompletionReason
后端实现
要成为一个兼容的服务发现后端,实现必须符合ServiceDiscovery 协议,其中包括两个方法:lookup 和subscribe :
func lookup(
_ service: Service,
deadline: DispatchTime?,
callback: @escaping (Result<[Instance], Error>) -> Void
)
lookup 获取给定服务的当前实例列表并将其发送到 。如果服务是未知的(例如,需要注册但尚未为该服务注册),那么结果应该是 失败。应该通过 或默认超时对该操作的完成时间规定一个期限。callback LookupError.unknownService deadline:
func subscribe(
to service: Service,
onNext nextResultHandler: @escaping (Result<[Instance], Error>) -> Void,
onComplete completionHandler: @escaping (CompletionReason) -> Void
) -> CancellationToken
subscribe 将服务实例 "推送 "到 。nextResultHandler
- 当
subscribe第一次被调用时,调用者应该收到给定服务的当前实例列表。这基本上是lookup的结果。 - 每当给定服务的实例列表发生变化时。后台实现可以完全控制其服务记录的更新方式和时间,但当实例列表与之前的结果不同时,它必须通知
nextResultHandler。
每个subscribe 请求都会创建一个新的CancellationToken 。如果取消令牌的isCancelled 是true ,那么订阅已经被取消,后端实现应该停止调用相应的nextResultHandler 。
当订阅因任何原因结束时,后端实现还必须通过completionHandler 通知(例如,服务发现实例关闭或通过CancellationToken 请求取消),以便订阅者在需要时可以提交另一个subscribe 请求。
项目状态
这是一个社区驱动的开源项目的开始,积极寻求贡献。 除了对Swift服务发现本身的贡献,我们还需要兼容的后端实现来管理服务注册和查询的位置信息。