Stargate是一个为数据打造的开源API框架,我们的目标就是让你的数据在任何你能想到的API中间自由存取,且不受限于提供支持的数据存储方式。
我们希望你可以加入我们的旅程,和我们一起重新定义与大量数据交互的可能性有哪些。如果你有兴趣参与,你可以点击这里在GitHub上查看现有的代码
01 什么是Stargate
我们很兴奋地发布Stargate——一个为数据打造的开源API框架——的第一个公测版。
Stargate意为“星际之门”,或简称“星门”,它最初来自于1994年的电影《星际之门》。在电影中,星门是一种圆环形的外星人传输设备网络,允许人或物体被远程传送到拨号拨通的光年级距外另一个星门1。
Stargate这个项目的产生主要是我们厌倦了不同工作内容需要使用不同数据库和不同API。每当我们开始新的项目,我们总是会因“阅读说明”的疲倦和漫长的选择过程消耗精力。我们不由得思考:为什么不打造一个适用于多种API和工作内容的框架呢?由此,Stargate诞生了。
举个例子,如果你是个正在搭建网站的JavaScript开发者。保存和搜索JSON的主意很好,也许你还需要在项目中些微用到GraphQL。而如果你是一个搭建企业级应用程序的Java或C#开发者,SQL似乎更有可能是你一直在使用的工具。
Stargate的目标就是让你的数据在任何你能想到的API中间自由存取,且不受限于提供支持的数据存储方式。
到目前为止,我们已经先从Apache Cassandra开始,将其作为第一个后台,并实现了用Cassandra查询语言(CQL)和一种REST API来实现对数据的增删改查。随后,Stargate也将支持使用更多其它的API。
Stargate的存在是为了所有需要简化工作内容的项目。我们在建构Stargate和核心代码库的过程中时刻谨记要遵循模块化的原则,因为这将使扩展和协作变得容易。
我们希望你可以加入我们的旅程,和我们一起重新定义与大量数据交互的可能性有哪些。如果你有兴趣参与,你可以点击这里在GitHub上查看现有的代码或点击这里加入我们的邮件群组以获取最新信息并参与内部讨论。
02 Stargate的工作原理
Stargate是一种数据网关组件,它被部署于你的客户端应用程序和数据库之间。我们选择Cassandra作为第一个数据库,是因为Cassandra解决了世界上最难的伸缩和可用性挑战,这使我们觉得先开发用于Cassandra的各种API是比较容易实现的。
Stargate本身是基于Cassandra中的协调节点(coordinator node)的概念,与Eric Lubow在2016年的Cassandra Summit的演讲中解释的“胖客户机(fat client)”非常相似。这意味着当Stargate被部署时,它将作为一个协调节点加入Cassandra集群,但是它将不会存储任何数据。
我们选择这样的设计,是因为Cassandra的协调节点已经在处理大多数高可用的存储代理(storage proxy)所需的请求处理和请求路由。继续使用这种经过时间验证的逻辑是合理的。这种使用云基础设施时常见的架构使得计算能力的伸缩可以独立于存储。
下面这张精简的架构图解释了Stargate在整个应用程序栈中所处的位置,以及未来可以期待看到的更多的API和集成。
仔细看看这张图:当一个请求被发送给Stargate,这个请求会由API Service来处理,将其翻译成数据库请求并传送至Persistence Service(持久化服务)。接着,Persistence Service会用Cassandra内部的QueryHandler(请求处理器)将这个请求发送至多个存储副本。
当Persistence Service收到一致性等级(consistency level)所指定的副本数量的确认(acknowledgment)之后,Persistence Service会处理请求并回复客户端。
这是一个相当典型的基于Dynamo存储系统的协调方式。Stargate最终的目标是实现在前端有多种可插拔的API以及在后端有多种可插拔的存储引擎,并且Dynamo魔术般的功能将会在两者中间起到连接作用。
让我们更多一些地了解这个分布式的协调工作是如何进行的。在一个集群中只有一个数据中心,这个数据中心有6个节点并有3个存储副本,这3个存有目标数据的副本都会被进来的请求访问。
在下图中,1、3、4号节点就是那些存有目标数据的副本节点。在下面的例子中,一致性级别为LOCAL_QUORUM,也就是说Stargate需在3个节点中的2个节点成功读写,才能算是满足了客户端的请求,并发回确认成功的信息。
03 迅速上手
下面是一个REST API的例子,这个REST API可以通过HTTP对存储在Cassandra数据表中的数据做增删改查操作。想要动手试试这个例子?你可以下载Postman,并在文档中导入Stargate REST API合集。
01 下载Docker镜像
下载地址:
https://hub.docker.com/u/stargateio
docker pull stargateio/stargate-3_11:v0.0.3
02 启动Docker容器
用DEVELOPER_MODE=true环境变量启动Docker容器,这样就无需再单独安装Cassandra实例了。
docker run --name stargate -p 8081:8081 -p 8082:8082 -p 127.0.0.1:9042:9042 -d -e CLUSTER_NAME=stargate -e CLUSTER_VERSION=3.11 -e DEVELOPER_MODE=true stargateio/stargate-3_11:v0.0.3
03 生成认证令牌(auth token)
curl -L -X POST 'http://localhost:8081/v1/auth' -H 'Content-Type: application/json' --data-raw '{
"username": "cassandra",
"password": "cassandra"
}'
你应该看到这样的输出结果:
{"authToken":"{auth-token-here}"}
04 创建一个键空间
curl --location --request POST 'localhost:8082/schemas/keyspaces'
--header 'X-Cassandra-Token: {auth-token-here}'
--header 'Content-Type: application/json'
--data-raw '{
"name": "users_keyspace",
"replicas": 1
}'
你应该看到这样的输出结果:
{"name":"users_keyspace"}
05 创建一个表
curl --location --request POST 'localhost:8082/schemas/keyspaces/users_keyspace/tables'
--header 'X-Cassandra-Token: {auth-token-here}'
--header 'Content-Type: application/json'
--data-raw '{
"name": "users",
"columnDefinitions": [
{
"name": "firstname",
"typeDefinition": "text"
},
{
"name": "lastname",
"typeDefinition": "text"
},
{
"name": "email",
"typeDefinition": "text"
},
{
"name": "favorite color",
"typeDefinition": "text"
}
],
"primaryKey": {
"partitionKey": ["firstname"],
"clusteringKey": ["lastname"]
},
"tableOptions": {
"defaultTimeToLive": 0,
"clusteringExpression":[
{
"column": "lastname",
"order": "ASC"
}
]
}
}'
你应该看到这样的输出结果:
{"name":"users"}
06 添加一些数据
curl --location --request POST 'localhost:8082/v2/keyspaces/users_keyspace/users'
--header 'X-Cassandra-Token: {auth-token-here}'
--header 'Content-Type: application/json'
--data-raw '{
"firstname": "Mookie",
"lastname": "Betts",
"email": "mookie.betts@gmail.com",
"favorite color": "blue"
}'
你应该看到这样的输出结果:
{"firstname":"Mookie","lastname":"Betts"}
07 取出数据
curl -G --location 'http://localhost:8082/v2/keyspaces/users_keyspace/users'
--header 'X-Cassandra-Token: {auth-token-here}'
--header 'Content-Type: application/json'
--data-urlencode 'where={"firstname": {"$eq": "Mookie"}}'
你应该看到这样的输出结果:
{"count":1,"data":[{"firstname":"Mookie","favorite color":"blue","email":"mookie.betts@gmail.com","lastname":"Betts"}]}
搞定!在Stargate的文档中,你可以看到更全面的基于数据库表的REST API的参考资料,以及更多其它相关信息。
04 如何参与其中?
查阅相关代码并且与我们一起建构Stargate吧!
一直以来,我们在这个项目中将探索精神、灵活性以及广泛适应各种API和存储方式(API and storage agnosticism)作为我们最重要的事情。这个项目的目标就是让社区更容易地创新,并添加更多新的API和扩展程序。
下图展示了Stargate的各个模块是如何协同工作的。
如果你想要开始构建新的API扩展,建议你先看看Stargate GitHub仓库中已经有的REST API实现
想要开始创建新的存储方式扩展,建议你先看看已有的Cassandra实现
你的想法成型之后,记得在我们的群组邮件中给我们发个信息。
要记得,这些内部的API正在被积极开发中,所以目前的版本在正式发布之前可能会有一些变化。
想要新的功能或是发现了bug?在我们的GitHub仓库中创建一个新的GitHub议题(GitHub issue),剩下的就交给我们吧。
让我们一起来探索吧!我们很好奇这个项目将会把我们带向何方。在接下来的几周,我们会陆续推出一些新的API。
升空准备就绪,星际空间见!✨
Reference:
-
https://zh.wikipedia.org/wiki/%E6%98%9F%E9%99%85%E4%B9%8B%E9%97%A8