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
假设有这样一个简单的表格,

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

不只是查询,变更和订阅也可以同样使用。
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语句和执行计划,因此性能分析等任务也变得更加容易。

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

当这个规则被应用时,
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
-
- 将 Hasura 的配置更改为本地配置
-
- 将配置导出到文件并提交到 Git
- 将配置文件部署为在启动时被加载的方式。
其他
因为累了,所以暂时把它公开,但可能会再添加一些内容。