Health 包提供了一个基础架构,Swift 应用程序可以使用它来报告其整体健康状态。
作为应用程序开发者,您可以创建一个 Health
类的实例,然后注册一个或多个健康检查。健康检查可以是符合 HealthCheckClosure
类型别名的闭包,也可以是符合 HealthCheck
协议的类。一旦您设置好健康检查,您可以向您的 Health
实例请求其状态。
Health 的最新版本适用于 4.1.2
版本的 Swift 二进制文件。您可以点击此链接下载此版本的 Swift 二进制文件。
将 Health
添加到您的应用程序的 Package.swift
文件中的依赖项。 将 "x.x.x"
替换为最新的 Health
发布版本。
.package(url: "https://github.com/Kitura/Health.git", from: "x.x.x")
将 Health
添加到您的目标的依赖项中
.target(name: "example", dependencies: ["Health"]),
下面的示例代码演示了如何创建 Health
实例并注册您的健康检查
import Health
let health = Health()
// Add custom checks
health.addCheck(check: MyCheck1())
health.addCheck(check: MyCheck2())
health.addCheck(check: myClosureCheck1)
health.addCheck(check: myClosureCheck1)
// Get current health status
let count = health.numberOfChecks
let status: Status = health.status
let state: State = status.state
let dictionary = status.toDictionary()
let simpleDictionary = status.toSimpleDictionary()
简单的字典包含一个键值对,让您知道应用程序是 UP (启动) 还是 DOWN (停止)
["status": "UP"]
字典包含一个键值对,让您知道应用程序是 UP (启动) 还是 DOWN (停止),以及有关失败的健康检查的更多详细信息(如果有)和一个协调世界时 (UTC) 时间戳值
["status": "DOWN", "timestamp": "2017-06-12T18:04:38+0000", "details": ["Cloudant health check.", "A health check closure reported status as DOWN."]]
Swift 应用程序可以使用任一字典,具体取决于用例,以报告应用程序的整体状态。例如,可以在应用程序上定义一个端点,该端点查询 Health
对象以获取整体状态,然后将其作为 JSON 有效负载发送回客户端。
Status
结构现在符合 Codable
协议,这使您可以序列化此结构的实例并将其作为响应发送给客户端。 如果您使用这种机制,则无需调用 toDictionary()
或 toSimpleDictionary()
方法来获取客户端的状态有效负载
let status: Status = health.status
let payload = try JSONEncoder().encode(status)
// Send payload to client
创建 Health
类的实例时,您可以将一个可选参数(名为 statusExpirationTime
)传递给它的初始化器,如下所示
let health = Health(statusExpirationTime: 30000)
statusExpirationTime
参数指定 Health
的给定实例在重新计算其状态之前应缓存其状态的毫秒数。 例如,如果分配给 statusExpirationTime
的值为 30000
(如上所示),则必须经过 30 秒,Health
实例才会通过查询已注册的每个健康检查来再次计算其状态。 statusExpirationTime
参数的默认值为 30000
。
您可以通过扩展 HealthCheck
协议或创建一个返回 State
值的闭包来实现健康检查。
以下代码片段显示了一个名为 MyCustomCheck
的类的实现,该类实现了 HealthCheck
协议
class MyCustomCheck: HealthCheck {
public var name: String { get { return "MyCustomCheck for XYZ"} }
public var description: String { get { return "Description for MyCustomCheck..."} }
public func evaluate() -> State {
let state: State = isConnected() ? State.UP : State.DOWN
return state
}
private func isConnected() -> Bool {
...
}
}
以下代码片段显示了使用闭包实现的类似健康检查
func myCustomCheck() -> State {
let state: State = isConnected() ? State.UP : State.DOWN
return state
}
func isConnected() -> Bool {
...
}
此 Swift 包的一个常见用例是将其集成到基于 Kitura 的应用程序中,如下所示
import Kitura
import Foundation
...
// Create main objects...
router = Router()
health = Health()
// Register health checks...
health.addCheck(check: Microservice1Check())
health.addCheck(check: microservice2Check)
...
// Define /health endpoint that leverages Health
router.get("/health") { request, response, next in
// let status = health.status.toDictionary()
let status = health.status.toSimpleDictionary()
if health.status.state == .UP {
try response.send(json: status).end()
} else {
try response.status(.serviceUnavailable).send(json: status).end()
}
}
在上面的代码示例中,应用程序的健康状况通过 /health
端点公开。 然后,云环境(例如 Cloud Foundry、Kubernetes 等)可以使用从 /health
端点返回的状态信息来监视和管理 Swift 应用程序实例。
作为上面为 /health
端点显示的实现的替代方法,您可以利用 Swift 4 中可用的 Codable
协议。由于 Status
结构满足 Codable
协议,因此可以使用 Kitura 2.0 中的新可编码功能实现更简单的 /health
端点实现,如下所示
...
// Define /health endpoint that leverages Health
router.get("/health") { request, response, next in
let status = health.status
if health.status.state == .UP {
try response.status(.OK).send(status).end()
} else {
try response.status(.serviceUnavailable).send(status).end()
}
}
...
除了发送字典响应之外,如果健康状态被认为已停止,服务器还需要响应非 200 状态代码。 这可以通过诸如 503 .serviceUnavailable
之类的状态代码来完成。 这样,云环境可以识别负面的健康响应,销毁该应用程序实例并重新启动该应用程序。
如果使用 Cloud Foundry 环境,请确保更新您的 manifest.yml
以支持健康检查。 在上面的示例中,您应将 health-check-type
值设置为 http
,并将 health-check-http-endpoint
设置为正确的健康端点路径,在本例中为 /health
。 有关更多详细信息,请查看健康检查文档。
有关更多信息,请访问我们的 API 参考。
我们很乐意讨论服务器端 Swift 和 Kitura。 加入我们的 Slack 与团队会面!
此库是在 Apache 2.0 许可下获得许可的。 完整的许可证文本可在 LICENSE 中找到。