Elara v0.2 报告
回顾 Elara v0.2 的设计目标
- Implement the account space features, supporting developers to use Github as a third-party login system to create an account space.
- Support the creating and management of multiple projects under the developer’s account space
- Provide developers with detailed access statistics features on the single project dimension, showing statistical indicators such as daily and weekly requests, calling methods, and source of user groups.
- Officially launch https://elara.patract.io, providing the community with public access services to the Polkadot mainnet
现在,我们已完成0.2 版本开发及部署上线,欢迎社区使用Elara:
- 所有人都可以使用Elara提供的Polkadot公共RPC服务( wss://polkadot.elara.patract.io 和 https://polkadot.elara.patract.io )
- 开发者可以访问elara.patract.io获得免费接入Polkadot网络的在线服务
接下来展示0.2的设计实现,及如何运行及验证elara 0.2 的内容。
#
Elara 0.2 的设计逻辑我们参考了Infura的业务模型,让每个开发账户可以申请多个Project
来分割不同的Workspace
,然后分配不同的Provider
来访问节点。因此,用户最小的资源单位为一个Project
。我们为每一个Project
分配了一个独立的PID
。在所有资源的索引中,开发者可以使用这个PID
来检索到这个项目对应的信息,比如详细信息,每日或每周的访问统计信息等等。
因此,Elara v0.2的架构大概如下所示
由上可知,在Elara v0.2的后台管理中,整个体系分为3个主要模块:
Developer-Account
:管理用户的账户登录状态模块。Stat
:Project
的管理及数据统计模块。API
:管理用户Requests
的Route
模块。
在整体设计上,3个模块设计成微服务的架构体系,均可独立进行扩展。因为这三个模块启动后都以独立进程运行,所以在将来可以对单独的模块进行平行扩容、重构、替换实现等升级。其中Developer-Account
模块与Stat
模块通过共享数据库共享数据,而Stat
与API
之间通过kafka
这个消息队列进行解耦。将来可以很容易地在此设计的基础上,添加更多复杂的功能模块,让Elara发挥更强大的效果。
这三个模块各自负责不同的功能:
Developer-Account
模块#
1. 这个模块管理用户的账户信息及维护登录状态。这个模块当前采用Redis缓存用户信息,并维护用户的登录状态。这个登录状态与Stat
模块共享。当前这个模块采用向Github请求授权访问Github的AccountID信息来创建用户。
因此该模块运行后对外提供的访问接口有:
- GET
/auth/login
:获取登录状态信息 - GET
/auth/logout
: 登出,移除用户的登录信息。 - GET
/auth/github
:向 github 请求授权相应的信息 - GET
/auth/github/callback
:向github授权的回调(callback)处理
Stat
模块:#
2. 该模块主要负责Project
的管理,并且以Project和用户为维度统计用户从API
模块发起的请求信息。这个模块是kafka
Message Middleware的Consumer
,接受从API
模块发送过来的请求信息并进行处理统计。同时,该模块与Developer-Account
共享了用户的登录状态信息,以检查用户是否还与Elara的网页保持连接状态。在这个模块中,每个用户可以申请分配多个Project
,代表在Elara中一个受限制的资源单位,例如限制一个Project每天可以接受的请求量和带宽总量等等。
在Stat
模块的访问接口以PID
作为基本元素,而一个项目的PID
在API
模块中将会作为这个项目特定的节点Provider
使用。开发者在使用这个PID
向API
提起节点访问请求的过程中,将消耗这个PID
对应的项目下管理的资源,并累计这个项目的统计信息。
基于如上讨论,Stat
模块设计如下访问接口:
- GET
/project/list
:列出当前登录用户下的所有project信息,返回:
{ "code": 0, "message": "", "data": [ { "id": "b78a79f98a2bb1a991a357504a5b04c1", "status": "Active", "chain": "substrate", "name": "thedao", "uid": "...", "secret": "...", "createtime": "1600398327", "lasttime": "1600398327", "allowlist": "false" }, ... ]}
返回信息中的id
即是一个Project
的PID。
GET
/project/<PID>
: 返回关联这个Project
的详细信息。POST
/project/create
:根据当前登录用户的信息创建一个新的Project
参数:
chain:<Polkdaot|Kusama>name:<Validation rules /[a-zA-Z]{4,32}/>
GET
/stat/day/<PID>
:获取一个Project
一天内的统计信息GET
/stat/day/<PID>
:获取一个Project
一周内的统计信息其他接口定义见文档:Stat README
API
模块#
3. 该模块用于提供节点服务。它主要负责proxy用户的节点访问请求(RPC & websocket)给节点,并且作为kafka
消息队列的生产者把用户请求的相关信息发送给Stat
模块。在API
模块中,用户把在Stat
模块中创建的PID
组成访问节点Provider
的URL,然后向API
模块发起节点访问请求。
而API
模块在接受到不同用户发起的请求后,根据路由信息携带的PID
区分出是哪一个Project
下的请求,发送相应的信息进入kafka
队列,并将用户请求转发给对应的节点。因此对于API
模块,elara设计了如下2个访问接口,其中<chain>
的参数当前可以填写Polkadot
和Kusama
- HTTPS, POST
/<chain>/<PID>
:接受用户发起的RPC请求,该请求的参数为该节点对外提供服务的所有RPC接口 - Websocket
/<chain>/<PID>
:接受用户发起的Websocket请求,该请求的参数为该节点对外提供服务的所有RPC接口
以上3个模块共同协作提供了Elara的后端组件。而在其基础上加上一个前端套件,即可成为一个完整的Elara产品对外提供服务:https://elara.patract.io/ 示例截图如下:
#
运行 Elara需要按如下顺序依次启动以上3个模块对应的进程,才能使Elara正常工作:1、Developer-Account
,2、Stat
,3、API
#
环境准备Elara的运行环境需要redis
与kafka
支持。因此在运行以下命令之前,首先保证运行环境中存在一个运行中的redis
实例,以及已经安装好kafka
的执行文件。Elara的3个进程由node
运行,因此需要在运行前用yarn
命令安装相应的依赖。
#
启动服务启动
Developer-Account
服务进入
elara/packages/account
目录$ cd package/account
安装依赖
$ yarn install
修改
Developer-Account
服务的配置文件,包括redis
field和github
field。其中默认端口设置为7001
,因此若不修改port
域,则该服务启动后占用7001
端口。$ vim ./config/env/dev.env.js
启动服务,进程输出的日志位于
./logs
目录下。$ node app.js# or use pm2 to manage process$ pm2 start pm2.json --env dev
启动
Stat
服务进入
elara/packages/stat
目录(如果当前在account
目录下)$ cd ../stat
安装依赖
$ yarn install
切换到
kafka
目录下启动kafka
目录并设置topic
启动
kafka
及相关进程,若没有修改kafka
的配置文件则默认占用9092
端口。$ cd <the root directory of kafka>$ bin/zookeeper-server-start.sh config/zookeeper.properties$ bin/kafka-server-start.sh config/server.properties
给
kafka
添加elara-dev
这个topic# add `elara-dev` topic to kafka$ bin/kafka-topics.sh --create --topic elara-dev --bootstrap-server localhost:9092# check whethere this topic is inittedbin/kafka-topics.sh --describe --topic elara-dev --bootstrap-server localhost:9092
切换回到
elara/packages/stat
目录,修改stat
模块的配置文件$ vim ./config/env/dev.env.js
由于
Stat
与Developer-Account
共享同一个redis
instance,因此在这个配置文件中的redis
field的配置应该和Developer-Account
配置文件中的redis
的配置一致。这里的
kafka
域需要和上一步启动kafka
的配置一致。若只是用于本地测试,请将默认配置中的
test:false
修改为test:true
。开启了这个flag后在访问stat
提供的接口中就不会对登录账户的登录状态进行校验,所有的接口均可直接访问。在生产环境中请一定保证test
域的值是false
。配置文件中默认
port
域是7002
,因此若不修改这个值,启动后将会占用7002
端口提供服务。
启动服务
启动
stat
服务。启动后若不修改端口则7002
端口被占用。后文采用127.0.0.1:7002
作为stat
进行的服务地址。进程输出的日志位于./logs
目录下。$ node app.js# or use pm2 to manage process$ pm2 start pm2.json --env dev
启动
kafka
consumer服务$ node ./kafka/consumer.js
如果需要看控制台信息,需要启动
dashboard
服务$ node ./timer/dashboard.js
此时可以在浏览器中打开
http://127.0.0.1:7002/dashboard
看到监控台的统计信息。
启动
API
服务进入
elara/packages/api
目录(如果当前在stat
目录下)$ cd ../api
安装依赖
$ yarn install
修改
api
模块的配置文件$ vim ./config/env/dev.env.js
chain
field 用来配置真正的链节点,其中链的名称作为api
提供给开发者的路由中的一部分。例如默认中有如下配置,则在API支持的路由中支持/Polkadot/<PID>
的访问方式。'Polkadot': { 'rpc': ['****:**'], //configure as node http://IP: RPC port in step 2 'ws': ['****:**'] //configure as node ws://IP: WS port in step 2}
kafka
field 用来配置在stat
部分中启动的kafka
进程的信息。注意配置的topic即是在配置stat
部分时注册给kafka
的topicelara-dev
。、startServer
filed 用来配置stat
进程所在的ip和端口,例如如果api
与stat
在同一台主机上,且采用了默认配置(即stat
默认占用7002端口),则这里的值为127.0.0.1:7002
port
field用来配置api
服务进程所占用的端口,默认配置为7003
启动服务
$ node app.js# or use pm2 to manage process$ pm2 start pm2.json --env dev
此时服务已经启动,若不修改端口则
7003
端口被占用。后文采用127.0.0.1:7003
端口作为用户访问的host。进程输出的日志位于./logs
目录下。
#
访问 Elara由于在以上的案例中在启动stat
的时候采用了test:true
的配置,因此以下流程中跳过用户登录的过程,直接从创建Project
开始。
创建Project:
向
stat
的服务地址127.0.0.1:7002
发送创建project的请求:这个project是关于Polkadot
链的访问请求,因此参数chain
的值指定为Polkadot
。
POST http://127.0.0.1:7002/project/create
chain:Polkadotname:hello
返回信息:
{ "code": 0, "mssage": "", "data": { "id": "5d4ebb40b08f127652ad022f5936b9da", "status": "Active", "chain": "Polkadot", "name": "hello", "uid": "Only For Test", "secret": "0b89a386965bfe4dcb19f724ecb41890", "createtime": "1606581366", "lasttime": "1606581366", "allowlist": "false" }}
可以得到创建Project
的详细信息及PID
,这里即是5d4ebb40b08f127652ad022f5936b9da
- 列出这个用户的所有的
Project
GET http://127.0.0.1:7002/project/list
返回信息
{ "code": 0, "message": "", "data": [ { "id": "5d4ebb40b08f127652ad022f5936b9da", "status": "Active", "chain": "Polkadot", "name": "hello", "uid": "Only For Test", "secret": "0b89a386965bfe4dcb19f724ecb41890", "createtime": "1606581366", "lasttime": "1606581366", "allowlist": "false" } ]}
由于当前开启了测试,会列出所有的Project
信息。若不开启测试,则只会列出当前登录用的Project
信息列表。
使用这个PID作为路由的一部分发起向节点的访问请求。
向节点的访问请求需要通过
API
服务,当前API
服务地址为127.0.0.1:7003
,因此我们可以发起如下请求:访问路由为<api server host>/<project chain>/<PID>
组成,因此在这里的情形下
对于rpc的访问地址是
http://127.0.0.1:7003/Polkadot/5d4ebb40b08f127652ad022f5936b9da
对于websocket的访问地址是
ws://127.0.0.1:7003/Polkadot/5d4ebb40b08f127652ad022f5936b9da
POST http://127.0.0.1:7003/Polkadot/5d4ebb40b08f127652ad022f5936b9da { "id":1, "jsonrpc":"2.0", "method":"system_chain", "params":[ ]}
API
服务正常返回结果{ "jsonrpc": "2.0", "result": "Polkadot", "id": 1}
这一次访问就将被elara正常的统计到并记录了project
5d4ebb40b08f127652ad022f5936b9da
拥有了一次访问。
若想测试api服务是否能满足正常的节点请求,可以把websocket的访问链接添加给
Polkadot/Substrate Portal
。- 在浏览器中登录Portal网页
- 点击左上角
- 点击
DEVELOPMENT
栏并点击Custom
栏填入ws://127.0.0.1:7003/Polkadot/5d4ebb40b08f127652ad022f5936b9da
- 点击“Switch”
此时Portal应该能正常工作,且所有的访问请求都被Elara记录。
访问
stat
服务获取统计信息如列出当前这个project的当天内的所有访问统计信息
GET http://127.0.0.1:7002/stat/day/5d4ebb40b08f127652ad022f5936b9da
或者列出这个project这周内的统计信息
GET http://127.0.0.1:7002/stat/week/5d4ebb40b08f127652ad022f5936b9da
访问
http://127.0.0.1:7002/dashboard
可以看到从控制台里也能看到总共的统计信息。
此时整个系统就能够正常运转工作了。
#
回顾验证信息Developers can use Github account to log in to the developer account space from https://elara.patract.ioDevelopers can create new projects and access related API keys under the accountDevelopers can access the Polkadot node in Elara through Http and web-socket protocolsDevelopers can view the monitoring statistics of the projects on the day and the recent weeksYou can view the relevant monitoring statistics from the Elara dashboard