embrace http - noradle/noradle-dispatcher GitHub Wiki

noradle 内部网络协议 web 化,和由此带来的设计优化,包括:

各类型节点的通信只使用以下协议

  • http 直接提供 JSON REST console 服务
    • get 请求获取系统运行状态:连接到的client/oracle,其中的统计信息,client/oracle 访问通道繁忙程度等等
    • post 请求动态修改配置,如增加访问通道数,动态删减各种事件处理钩子
    • dispatcher 直接提供json状态服务,不再需要通过额外 console 应用通过 dnode 协议访问间接提供
  • http(s) + upgrade(fake websocket)
    • 先握手进行认证,然后使用 noradle-protocol 进行 frame 交换
    • 握手采用 upgrade:websocket header
    • 对于 console 的实时监控,dispatcher 将实时信息推送到 console
  • noradle-protocol frame 交换协议
  • https 作为 http 的安全增强版本
    • 用于握手过程中 http basic authentication 密码保护
    • 用于通信过程的保护
    • 允许用于 oracle/client/console 连接 dispatcher 的身份确认,而且是相互的身份确认,利用标准的公钥和证书体系
    • 确认安全不考虑采用 http digest 挑战码(完全避免密码明码传输),因此需要双方交互过程,控制复杂

https 支持

  • 测试 https 支持
    • dispatcher 支持 https 证书和监听端口配置,根据配置决定是否启动 https 服务
    • noradle-client 创建 dbpool 增加 secure 参数,控制是否使用 https 访问 dispatcher
    • oracle 学习尝试下通过 oracle wallet 来创建到 dispatcher 的 https 连接
    • 采用 https 接入 dispatcher 后,可以完整的提供认证和传输的安全性,直接利用ssl提供的各种安全机制,特别是以后可以基于身份证书进行接入者的认证,不再需要密码。
    • 该举措将使得 noradle 可以应用到对安全要求极为苛刻的应用场景,特别是在互联网公网上

可代理性支持

  • 测试是否可以将 noradle-dispatcher 部署到 proxy 后,反向代理访问
    • 测试通过 uniproxy(基于http-proxy模块,node.js 社区最流行的代理)
    • 测试通过 nginx 代理(性能最佳的传统模式的web服务器)
    • 该举措的意义在于可以将dispatcher部署到企业的统一对外web端口后,实现dispatcher的负载均衡,实现在各种云平台上部署服务
    • http/websocket 化协议改造,将大大提升 noradle 的通达性,穿透各种防火墙的阻断,增加其应用场景
    • 去除系统部署时对网管人员的依赖

nginx proxy to noradle-dispatcher demo

http {
    server {
        listen       80;
        server_name  localhost;
    }
    server {
        server_name dispatcher.noradle.org;
        location / {
            proxy_pass   http://127.0.0.1:9009;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }

see http://nginx.org/en/docs/http/websocket.html

"proxy_pass" set to the http listening address of noradle-dispatcher with protocol prefix,
format like "protocol://ip:port"

WARN: proxy_read_timeout default to 60s, so noradle-dispatcher must be configured to send keep-alive ping frame less than it.

参考 websocket 协议

  • 管理帧:包括 ping/pong 包,graceful quit
  • 端到端的通信管理,而不是点对点的,很好的支持了 http 代理
  • 帧结构简化,适合 oracle API 读写

http 状态码的使用

  • 426 : 'Upgrade Required', // RFC 2817
  • 503 : 'Service Unavailable',

更符合 node.js http 模块的风格

变更日志

  • dispatcher 直接提供json状态服务,不再需要通过额外 console 应用通过 dnode 协议访问间接提供

  • dispatcher 删除了的 dnode 的依赖,增加对 basic-auth 第三方模块(解析http basic authentication)依赖* console 直接通过普通 http 请求访问 dispatcher 服务,获取系统状态

  • console 直接 http 访问 dispatcher,不用再依赖 dnode module 和相应的私有协议

  • 原有的 frame stream 协议得到简化,不再处理头信息和认证* client/oracle 都可以直接通过Http upgrade请求进行身份说明认证的握手过程,成功后直接socket通信

  • oracle 通过 upgrade 握手包建立到 dispatcher的链接,其中提供了更全面的身份和标识信息

  • 确认安全不考虑采用 http digest 挑战码(完全避免密码明码传输)

  • 安全机制更为灵活,可以采用 https 接入

  • 确定了认证功能自定义接口规范 check(role,name,pass,cip,secure),根据访问dispatcher的角色(client/console/oracle),用户名密码,客户端IP,是否通过加密通道链接5个参数才确定是否允许握手通过,可以支持各种灵活的策略,系统默认采用的内置策略是位于同一局域网下可以访问dispatcher。

  • 确定启动新项目 noradle-auth,来支持标准化的基于静态配置文件的认证和配置获取功能

  • 对 noradle-dispatcher 项目进行重构,将逻辑清晰的分布到三个字文件中,分别负责配置获取和全局设置、服务器启动和握手处理、具体的frame交换和服务。