Skip to main content

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

由上可知,在Elara v0.2的后台管理中,整个体系分为3个主要模块:

  • Developer-Account:管理用户的账户登录状态模块。
  • StatProject的管理及数据统计模块。
  • API:管理用户RequestsRoute模块。

在整体设计上,3个模块设计成微服务的架构体系,均可独立进行扩展。因为这三个模块启动后都以独立进程运行,所以在将来可以对单独的模块进行平行扩容、重构、替换实现等升级。其中Developer-Account模块与Stat模块通过共享数据库共享数据,而StatAPI之间通过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作为基本元素,而一个项目的PIDAPI模块中将会作为这个项目特定的节点Provider使用。开发者在使用这个PIDAPI提起节点访问请求的过程中,将消耗这个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>的参数当前可以填写PolkadotKusama

  • HTTPS, POST /<chain>/<PID> :接受用户发起的RPC请求,该请求的参数为该节点对外提供服务的所有RPC接口
  • Websocket /<chain>/<PID> :接受用户发起的Websocket请求,该请求的参数为该节点对外提供服务的所有RPC接口

以上3个模块共同协作提供了Elara的后端组件。而在其基础上加上一个前端套件,即可成为一个完整的Elara产品对外提供服务:https://elara.patract.io/ 示例截图如下:

elara1 elara2 elara3

运行 Elara#

需要按如下顺序依次启动以上3个模块对应的进程,才能使Elara正常工作:1、Developer-Account,2、Stat,3、API

环境准备#

Elara的运行环境需要rediskafka支持。因此在运行以下命令之前,首先保证运行环境中存在一个运行中的redis实例,以及已经安装好kafka的执行文件。Elara的3个进程由node运行,因此需要在运行前用yarn命令安装相应的依赖。

启动服务#

  1. 启动Developer-Account服务

    1. 进入elara/packages/account目录

      $ cd package/account
    2. 安装依赖

      $ yarn install
    3. 修改Developer-Account服务的配置文件,包括redis field和github field。其中默认端口设置为7001,因此若不修改port域,则该服务启动后占用7001端口。

      $ vim ./config/env/dev.env.js
    4. 启动服务,进程输出的日志位于./logs目录下。

      $ node app.js# or use pm2 to manage process$ pm2 start pm2.json --env dev
  2. 启动Stat服务

    1. 进入elara/packages/stat目录(如果当前在account目录下)

      $ cd ../stat
    2. 安装依赖

      $ yarn install
    3. 切换到kafka目录下启动kafka目录并设置topic

      1. 启动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 
      2. 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
    4. 切换回到elara/packages/stat目录,修改stat模块的配置文件

      $ vim ./config/env/dev.env.js
      1. 由于StatDeveloper-Account共享同一个redis instance,因此在这个配置文件中的redis field的配置应该和Developer-Account配置文件中的redis的配置一致。

      2. 这里的kafka域需要和上一步启动kafka的配置一致。

      3. 若只是用于本地测试,请将默认配置中的test:false修改为test:true。开启了这个flag后在访问stat提供的接口中就不会对登录账户的登录状态进行校验,所有的接口均可直接访问。在生产环境中请一定保证test域的值是false

      4. 配置文件中默认port域是7002,因此若不修改这个值,启动后将会占用7002端口提供服务。

    5. 启动服务

      1. 启动stat服务。启动后若不修改端口则7002端口被占用。后文采用127.0.0.1:7002作为stat进行的服务地址。进程输出的日志位于./logs目录下。

        $ node app.js# or use pm2 to manage process$ pm2 start pm2.json --env dev
      2. 启动kafka consumer服务

        $ node ./kafka/consumer.js
      3. 如果需要看控制台信息,需要启动dashboard服务

        $ node ./timer/dashboard.js

      此时可以在浏览器中打开http://127.0.0.1:7002/dashboard看到监控台的统计信息。

  3. 启动API服务

    1. 进入elara/packages/api目录(如果当前在stat目录下)

      $ cd ../api
    2. 安装依赖

      $ yarn install
    3. 修改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的topic elara-dev。、

      • startServer filed 用来配置stat进程所在的ip和端口,例如如果apistat在同一台主机上,且采用了默认配置(即stat默认占用7002端口),则这里的值为127.0.0.1:7002

      • port field用来配置api服务进程所占用的端口,默认配置为7003

    4. 启动服务

      $ 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开始。

  1. 创建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

  1. 列出这个用户的所有的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信息列表。

  1. 使用这个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 拥有了一次访问。

  1. 若想测试api服务是否能满足正常的节点请求,可以把websocket的访问链接添加给Polkadot/Substrate Portal

    1. 在浏览器中登录Portal网页
    2. 点击左上角
    3. 点击DEVELOPMENT栏并点击Custom栏填入 ws://127.0.0.1:7003/Polkadot/5d4ebb40b08f127652ad022f5936b9da
    4. 点击“Switch”

此时Portal应该能正常工作,且所有的访问请求都被Elara记录。

  1. 访问stat服务获取统计信息

    如列出当前这个project的当天内的所有访问统计信息

    GET http://127.0.0.1:7002/stat/day/5d4ebb40b08f127652ad022f5936b9da

    或者列出这个project这周内的统计信息

    GET http://127.0.0.1:7002/stat/week/5d4ebb40b08f127652ad022f5936b9da
  2. 访问 http://127.0.0.1:7002/dashboard 可以看到从控制台里也能看到总共的统计信息。

此时整个系统就能够正常运转工作了。

回顾验证信息#

  • Developers can use Github account to log in to the developer account space from https://elara.patract.io
  • Developers can create new projects and access related API keys under the account
  • Developers can access the Polkadot node in Elara through Http and web-socket protocols
  • Developers can view the monitoring statistics of the projects on the day and the recent weeks
  • You can view the relevant monitoring statistics from the Elara dashboard