Hasura真的超级方便耶,这是一个说法

我使用过https://hasura.io/后觉得非常方便,但似乎并不是很多人在使用,所以我来列举一下hasura的优点。

Hasura 是什么?

Hasura是一种可以自动从PostgreSQL服务器构建GraphQL服务器的工具。它以Docker映像的形式分发,并且只需设置要连接的PostgreSQL服务器的地址和密码,即可立即使用作为GraphQL服务器。(实际上,您可以从Hasura控制台选择要公开的表格。详细信息请参阅文档)
如果要在本地启动,则可以按照以下方式进行操作。

docker run -d -p 8080:8080 \
  -e HASURA_GRAPHQL_DATABASE_URL=postgres://username:password@hostname:port/dbname \
  -e HASURA_GRAPHQL_ENABLE_CONSOLE=true \
  hasura/graphql-engine:latest

在这种情况下,可以从localhost:8080访问Hasura控制台,并且localhost:8080/v1/graphql将成为GraphQL端点。
Hasura服务器充当客户端和PostgreSQL服务器之间的中间层,使得可以通过GraphQL API操作PostgreSQL。

client <- (GraphQL) -> hasura server <- (SQL) -> PostgreSQL server

假设有这样一个简单的表格,

スクリーンショット 2020-02-12 21.53.34.png

您可以从Hasura控制台的GraphiQL中以这种方式使用GraphQL。您可以获取考虑外键关系并通过JOIN连接的数据形式。

スクリーンショット 2020-02-13 10.08.09.png

不只是查询,变更和订阅也可以同样使用。

Hasura的优点是什么?

只要有PostgreSQL服务器,就能立即使用。

Hasura是一个与PostgreSQL服务器通信并解析模式信息的自动可用的GraphQL服务器。它以Docker镜像的形式分发,因此如果您正在管理ECS、Cloud Run或GKE等基础设施,您可以很轻松地开始使用它。由于它使用PostgreSQL作为数据源,所以您可以使用已经建立了运维经验的平台,如RDS或CloudSQL。

即使我们决定停用 Hasura,由于数据源只是普通的 PostgreSQL,我认为也不会对 Hasura 产生过强的依赖。相比于 Prisma Cloud 这样的 GraphQL SaaS,Hasura 更容易停用,这是一个优点我认为。

省去了实现GraphQL服务器的麻烦

有了Hasura,它能自动运行作为GraphQL服务器,就省去了实现GraphQL服务器的麻烦。
为了解决N+1问题,通过使用Dataloader实现GraphQL解析器是相当麻烦的,所以如果在PostgreSQL中有表,并在Hasura上进行设置,就可以立即使用Query、Mutation和Subsucription,这能极大地提高开发速度。
实际上,使用Hasura后,可以操作数据库,修改Hasura的配置,通过graphql-codegen生成客户端代码,当能够安全且快速地进行开发时,感觉非常令人兴奋。

然而,在大多数应用中,仅仅从数据库进行 SELECT、INSERT 是不够的,还需要进行复杂的逻辑处理,这在事务中是必不可少的。这种逻辑往往在 hasura 生成的 GraphQL 操作中很难实现。hasura 提供了一些解决方案(远程架构、用户自定义的 SQL 函数),在这些方面我还没有进行尝试。

页面翻页和汇总查询等也会自动生成

假设有一种服务,用户可以在其中发布评论,我们想要实现一个用户列表页面,显示用户最后一次评论的日期和评论总数。幸好,hasura可以自动生成这样的查询操作,我们可以借助它来实现。

query Users {
  users(offset: 100, limit: 20) {
    name
    lastCommentAt: comments(order_by: {createdAt: desc}, limit: 1) {
      createdAt
    }
    totalComment: comments_aggregate {
      aggregate {
        count
      }
    }
  }
}
{
  "data": {
    "users": [
      {
        "name": "bob",
        "lastCommentAt": [
          {
            "createdAt": "2020-02-12T13:21:32.555949"
          }
        ],
        "totalComment": {
          "aggregate": {
            "count": 2
          }
        }
      },
      {
        "name": "john",
        "lastCommentAt": [
          {
            "createdAt": "2020-02-12T13:21:47.733137"
          }
        ],
        "totalComment": {
          "aggregate": {
            "count": 2
          }
        }
      }
    ]
  }
}

可以使用条件子句,例如 where、order_by、limit 和 offset,以及聚合函数,例如 max、count 和 avg 进行默认操作。这类似于将 PostgreSQL 作为公开的 GraphQL ORM 进行使用。

可以立即知道实际发行的 SQL。

在普通的GraphQL服务器实现中,我认为会使用类似Dataloader的工具进行中间处理,但在Hasura的情况下,GraphQL操作直接被转换为SQL语句。你可以从Hasura控制台中查看这些SQL语句和执行计划,因此性能分析等任务也变得更加容易。

スクリーンショット 2020-02-13 10.02.03.png

存在认证和认可机制。

可以使用Auth0等组件来拦截未经身份验证的请求并在基于角色的基础上限制功能。Hasura会与Auth0等身份验证提供商进行通信,以获取JWT。Hasura可以在GraphQL操作执行时读取Auth0中设置的数据,并在Hasura控制台上设置规则。可以通过嵌入在JWT中的X-Hasura-User-Id来设置规则,以仅获取自己的数据。

スクリーンショット 2020-02-13 10.03.24.png

当这个规则被应用时,

query Users {
  users {
    name
    comments {
      content
    }
  }
}

即使发出了一个查询来获取所有用户的评论,并且该查询将”user_id”: { “_eq”: “X-Hasura-User-Id” }条件嵌入到查询中,也不会引用其他用户的数据。

Hasura 的不明之处

除非亲自试用或阅读文件,否则无法了解其中令人费解之处。

如何操作和使用Hasura的设置?

我在这里贴了一些 Hasura 控制台 Web UI 的屏幕截图,但是当进入实际运营阶段时,最好避免在生产环境中手动操作这个界面。
Hasura 提供了从 Web UI 以外的方式导入/导出设置的功能,可以通过 HTTP POST/GET JSON,或者从命令行界面写入/读取。我认为在运营中将会使用其中一种方式。
Hasura 的 CLI Docker 镜像 hasura/graphql-engine:v1.0.0.cli-migrations 在启动时会读取放置在 /hasura-migrations 的配置文件并启动。结合使用 docker-compose,应该会是这样的。

version: "3.1"

services:
  hasura:
    image: hasura/graphql-engine:v1.0.0.cli-migrations
    volumes:
      - ./hasura/hasura-migrations:/hasura-migrations
    ports:
      - 8888:8080
    restart: always
    environment:
      HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:@postgres:5432/mydb
    1. 将 Hasura 的配置更改为本地配置

 

    1. 将配置导出到文件并提交到 Git

 

    将配置文件部署为在启动时被加载的方式。

其他

因为累了,所以暂时把它公开,但可能会再添加一些内容。

广告
将在 10 秒后关闭
bannerAds