介绍

TSW是一个支持抓包、全息日志、监控的基于Node.js的web server。 说人话 就是一个内置了日志采集、请求上报能力的http-server。

我们可以把TSW看作是Nginx这样的Web-Server,也可以将其看作Koa+一些内置基础逻辑来实现的一个小型服务器

为什么使用TSW

大概是为了避免自己去处理日志存储、抓包相关的能力吧. TSW提供了如下一些能力:

  • 基于多核多进程的负载均衡
  • 优雅重启
  • 错误监控、性能监控; 告警推送
  • 日志记录、存储;
  • 染色抓包

TSW的安装

目前TSW官方提供了三种方式,然而npm的方式显然不知道该如何操作, 从tsw代码组织来看,目前作为npm包来用是不太现实的。(官方文档中也没有给出npm安装方式如何配置和使用 纠正: 这里纠正已经可以npm安装,请期待官网更新)。因此我们暂且使用git clone的方式。

git clone https://github.com/Tencent/TSW.git

显然这是把TSW仓库的代码当做一个webserver代码来用。clone之后,再安装其自身的依赖:

cd TSW
npm install

官方文档里这里使用的命令是 npm install --no-optional但实际上,从TSW的package.json中可以看到TSW自身并没有任何optionalDependencies,所以文档里的安装命令显然是多余的 (提醒: 这里官网会进行修复)。

目录结构

我这里只介绍几个对我们来说有用的

-- conf 这是TSW的配置目录
-- bin 这是TSW的主要核心程序
-- index.js 负责引用和启动TSW核心程序
-- examples 这是业务站点的目录

大概可以了解了:

  • conf目录是配置TSW的(如端口、监听IP等信息)
  • examples目录下是我们的业务逻辑,里面有个framework目录,可以支持独立的koa或express等类型的框架

启动入口

通过TSW/conf/config.js 可以发现,其直接把 examples/framework/config.js 导出,因此我们可以直接在 framework/config.js 中配置站点。

另外注意到 framework/config.js 中有引用路由的一段代码:

// 路由
this.router = require('./router.js');
// router.js
// 定义一个路由表
const map = {
  // http://127.0.0.1/egg
  egg: './helloworld.egg/app.js',
   // http://127.0.0.1/express
  express: './express.js',
  // http://127.0.0.1/koa
  koa: './koa.js',
  // http://127.0.0.1/other
  default: './helloworld.js'
  };

因此,TSW启动后,其实是加载了router.js中定义的路由,从而启动到对应的framework业务框架。

而对于业务框架来说,则不需要再自己启动webserver,只需要将对应的handler暴露给TSW即可. 例如对于KOA来说,可以这样:

module.exports = app;

贡献

TSW在社区方面还存在明显不足,我的浅显感知有以下不足:

  • 代码规范和开源社区配套差
  • 文档不足
  • 必须拷贝源码使用,无法基于npm生态使用

从TSW所解决的问题来看,感觉是在增强web开发的基础能力(如日志、监控等),避免重复开发。但换个角度想,这难道不应该做成一个web框架,而为何要做成一个web-server呢?

business --> web framework --> web-server --> nginx

TSW目前定位在web-server这里,但实际上做的事情并不像真正的webserver最应该关注的,但这个定位使得开发者可以自由选择express、koa等框架;如果退后一步定位再web framework层,我觉得也是个很好的解决方案,像egg/think一样,既能提供该有的日志等能力,又能提供更多简化web开发的能力。

后面可以研究下能否协助参与改进


sheldon
947 声望1.6k 粉丝

echo sheldoncui