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发挥更强大的效果。
这三个模块各自负责不同的功能:
1. Developer-Account 模块#
这个模块管理用户的账户信息及维护登录状态。这个模块当前采用Redis缓存用户信息,并维护用户的登录状态。这个登录状态与Stat模块共享。当前这个模块采用向Github请求授权访问Github的AccountID信息来创建用户。
因此该模块运行后对外提供的访问接口有:
- GET
/auth/login:获取登录状态信息 - GET
/auth/logout: 登出,移除用户的登录信息。 - GET
/auth/github:向 github 请求授权相应的信息 - GET
/auth/github/callback:向github授权的回调(callback)处理
2. Stat模块:#
该模块主要负责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
3. API模块#
该模块用于提供节点服务。它主要负责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服务的配置文件,包括redisfield和githubfield。其中默认端口设置为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共享同一个redisinstance,因此在这个配置文件中的redisfield的配置应该和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启动
kafkaconsumer服务$ 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.jschainfield 用来配置真正的链节点,其中链的名称作为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}kafkafield 用来配置在stat部分中启动的kafka进程的信息。注意配置的topic即是在配置stat部分时注册给kafka的topicelara-dev。、startServerfiled 用来配置stat进程所在的ip和端口,例如如果api与stat在同一台主机上,且采用了默认配置(即stat默认占用7002端口),则这里的值为127.0.0.1:7002portfield用来配置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/5d4ebb40b08f127652ad022f5936b9daPOST 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