Code Monkey home page Code Monkey logo

netsvr's Introduction

netsvr

简介

netsvr是一个网关程序,它在如下架构中处于网关层:

网络架构

netsvr主要负责:

  1. 承载客户的websocket连接,并支持存储连接的:唯一id、主题标签、session信息
  2. 承载业务进程的tcp连接
  3. 接收客户连接发来的数据,并按一定的路由策略转发到对应的业务进程
  4. 接收业务进程发来的数据,并按数据中包含的cmd指令:或转发给客户连接,或自己处理并返回给业务进程

实现的指令

本网关程序实现了下面这套指令,所有业务进程与网关交互都必须基于这套指令。
业务进程可以用php、go或其它语言实现,如果是php、go,则已经生成好对应的代码,直接引入即可。
更高级的sdk,比如需要广播到多台网关机器啥的,需要自己封装。

业务进程与网关之间的TCP数据包边界处理

采用固定包头 + 包体协议包头是一个uint32,表示接下来的包体有多长,注意包头表示的长度,不包含包头 自己的4字节
包头采用大端序,包体是protobuf编码的数据。
如果采用swoole开发业务进程,则协分包协议设置如下:

$socket = new \Swoole\Coroutine\Socket(AF_INET, SOCK_STREAM, 0);
//设置分包协议
$socket->setProtocol([
    'open_length_check' => true,
    'package_length_type' => 'N',
    'package_length_offset' => 0,
    'package_body_offset' => 4,
]);

客户数据转发策略

首先是业务进程启动的时候需要将自己注册到网关中,发起注册的时候需要提供一个workerIdworkerId的区间是:[1,999]
多个业务进程可以注册同一个workerId
然后是客户端发送数据的时候需要在数据头部写入三个字节(不足,补零)的workerId,用于表示该数据要被哪个workerId 的业务进程处理。
如果一个workerId包含多个业务进程,则采用轮询策略进行转发。
客户端发送数据的示例:001{"cmd":11,"data":"{}"},其中的001表示,数据要被转发到workerId1的业务进程。

代码结构介绍

  • netsvr.go 是本网关程序的启动入口。
  • business.go 是为了测试本网关程序的业务进程启动入口。
  • stress.go 是为了压测本网关程序的压测进程启动入口,它可以大规模的向网关发起websocket连接。
  • build.sh 是编译脚本,把项目clone下来后,直接跑它(依赖go环境),会自动编译出Windows、Linux、Mac三端的网关程序、业务进程程序、压测进程程序。

启动顺序是:网关 --> 业务进程 --> 压测进程

网关压测

还望有条件的老哥,可以把玩一下这个项目,然后在Linux下做个小小压测,然后把数据贴出来瞅瞅。 我感觉数据不会太差,因为这个网关程序用的websocket包是:nbio,它是一个异步包,Linux下稳定快速。

业务进程的示例项目

  1. 在线抽奖程序
  2. php版的业务进程演示程序

netsvr's People

Contributors

buexplain avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.