Kitura

APIDoc Build Status - Master codecov macOS Linux Apache 2 Slack Status

健康

Health 包提供了一个基础架构,Swift 应用程序可以使用它来报告其整体健康状态。

作为应用程序开发者,您可以创建一个 Health 类的实例,然后注册一个或多个健康检查。健康检查可以是符合 HealthCheckClosure 类型别名的闭包,也可以是符合 HealthCheck 协议的类。一旦您设置好健康检查,您可以向您的 Health 实例请求其状态。

Swift 版本

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

下面的示例代码演示了如何创建 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 {
  ...
}

在 Kitura 应用程序中使用 Health

此 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 环境

如果使用 Cloud Foundry 环境,请确保更新您的 manifest.yml 以支持健康检查。 在上面的示例中,您应将 health-check-type 值设置为 http,并将 health-check-http-endpoint 设置为正确的健康端点路径,在本例中为 /health。 有关更多详细信息,请查看健康检查文档

API 文档

有关更多信息,请访问我们的 API 参考

社区

我们很乐意讨论服务器端 Swift 和 Kitura。 加入我们的 Slack 与团队会面!

许可证

此库是在 Apache 2.0 许可下获得许可的。 完整的许可证文本可在 LICENSE 中找到。