best-practice

编写 Node.js Rest API 的 10 个最佳实践

13 | 03 | 2017

Node.js 除了用来编写 WEB 应用之外,还可以用来编写 API 服务,我们在本文中会介绍编写 Node.js Rest API 的最佳实践,包括如何命名路由、进行认证和测试等话题,内容摘要如下:

1. 正确使用 HTTP Method 和路由

试想你正要构建一个 API 用来创建、更新、获取、删除用户,对于这些操作,HTTP 规范里面已经有了现成的操作:POST、PUT、GET、DELETE,建议直接使用他们来描述接口的行为。

至于路由的命名,应该使用名词或名词性短语来作为资源标识符,比如上文提到的用户管理的例子,路由就应该长这样:

  • POST /users 或者 PUT /users/:id 用来创建新用户;
  • GET /users 用来获取用户列表;
  • GET /users/:id 用来获取单个用户;
  • PATCH /users/:id 用来更新用户信息;
  • DELETE /users/:id 用来删除用户;

2. 正确的使用 HTTP 状态码

如果服务器端在请求处理的过程中出错了,你必须设置正确的响应状态码,具体如下:

  • 2xx,表示一切正常;
  • 3xx,表示资源位置已经更改;
  • 4xx,表示因为客户端错误而导致请求无法被处理,比如参数校验没通过;
  • 5xx,表示因为服务器错误导致请求无法被处理,比如服务端抛了异常;

如果你使用 express,设置状态码非常简单:res.status(500).send({ error: ‘Internal server error happend’ }),如果使用了 restify,也是类似的:res.status(201)。

如果想看完整的 HTTP 状态码,点击这里

3. 使用 HTTP Header 来发送元数据

如果想要发送关于响应体数据的元数据,可以使用 Header ,Header 可以包含的常见元数据包括如下几类:

  • 分页信息;
  • 频率限制信息;
  • 认证信息;

如果你需要在 Header 中发送自定义的元数据,最好的做法是在 Header 名称前面加 X,例如,需要发送 CSRF Token 的时候,实际的 Header 应该命名为:X-CSRF-Token,然而,这种 Header 在 RFC 6648 中已经被废弃了。API 在设置自定义 Header 的时候还要尽可能避免命名冲突,比如为了达到这个目的OpenStack 为所有 API 的自定义 Header 都加上了 OpenStack 的前缀:

需要注意的是,虽然 HTTP 规范中没有规定 Header 的大小,但是 Node.js 中 Header 的大小被限制在了 80KB。官方原文如下:

4. 为 REST API 挑选合适的框架

根据你的实际场景挑选合适的框架是非常重要的,Node.js 中的框架大致介绍如下:

Express、Koa、HAPI

ExpressKoaHAPI 主要是用来构建浏览器 WEB 应用,因为他们都支持服务端模板渲染,虽然这只是他们众多功能中的一个。如果你的应用需要提供用户界面,那么这三个就是不错的选择。

Restify

Restify 是专门用来创建符合 REST 规范的服务的,他诞生的目的就是帮你构建严格意义上的、可维护的 API 服务。Restify 内置了所有请求处理函数的 DTrace 支持。并且已经被 npmnetflix 用来在生产环境提供重要的服务。

5. 要对 API 进行黑盒测试

测试 API 的最好办法是对他们进行黑盒测试,黑盒测试是一种不关心应用内部结构和工作原理的测试方法,测试时系统任何部分都不应该被 mock。

supertest 是可以用来对接口进行黑盒测试的模块之一,下面是基于测试框架 mocha编写的一个测试用例,该用例的目的是检查接口是否能返回单条的用户数据:

可能有人会问:API 服务所连接的数据库里面的数据是如何写进去的呢?

通常来说,你写测试的时候,要尽可能不对系统状态做假设,然而在某些场景下,你需要准确的知道系统当前所处的状态以增加更多的断言来提高测试覆盖率。如果你有这种需求,你可以试用如下的方法对数据库进行预填充:

  • 选择生产环境数据的子集来运行黑盒测试;
  • 运行黑盒测试之前把手工构造的数据填充到数据库中。

此外,有了黑盒测试并不意味着不需要单元测试,针对 API 的单元测试还是需要编写的。

6. 使用基于 JWT 的无状态的认证机制

因为 Rest API 必须是无状态的,因此认证机制也需要是无状态的,而基于 JWT(JSON Web Token) 的认证机制是无状态认证机制中的最佳解决方案。

JWT 的认证机制包含三部分:

  1. Header:包含 token 的类型和哈希算法;
  2. payload:包含声明信息;
  3. signature:JWT 实际上并不是对 payload 进行加密,只是对其做了签名;

为 API 添加基于 JWT 的认证机制也非常的简单,比如下面的代码:

有了如上的代码,你的 API 就有了 JWT 的保护。如果要访问这种被保护的接口,需要使用 Authorization Header 来提供 token,比如:

你可能注意到了,JWT 模块并不依赖任何数据存储层,这是因为 token 本身是可以单独被校验的,token 里面的 payload 甚至可以包含 token 的签名时间、有效期限。

此外,你还需要确保,所有的 API 接口只能通过更安全的 HTTPS 链接来访问。

7. 学会使用条件请求机制

条件请求机制是基于不同的 Header 表现出不同的行为的机制,可以认为这些 Header 就是请求处理方式的先决条件,如果条件满足,请求处理方式就会有所不同。

可以利用这些 Header 检测服务器上的资源版本是否匹配特定的资源版本,这些 Header 的取值可以是如下的内容:

  • 资源的最后修改时间;
  • 资源的标签(随资源变化而变化);

具体来说:

  • Last-Modified:标识资源的最新修改时间;
  • Etag:标识资源的标签;
  • If-Modified-Since:结合 Last-Modified Header 使用;
  • If-Non-Match:结合 Etag 使用;

下面来看一个实际的例子:

客户端不知道 doc 资源的任何版本,所以请求时即不能提供 If-Modified-Since,也不能提供 If-Non-Match 两个 Header,然后服务端在响应中会增加 Etag 和 Last-Modified 两个 Header。

nodejs-resftul-api-with-conditional-request-without-previous-versions.png
接下来,客户端再次请求相同的资源的时候,就可以带上 If-Modified-Since 和 If-Non-Match 这两个 Header 了,然后如果服务器端会检查资源是否修改,如果没有修改,直接返回 304 – Not Modified 状态码,而不重复发送资源的内容。

nodejs-resftul-api-with-conditional-request-with-previous-versions.png

8. 拥抱接口调用频率限制(Rate-Limiting)

频率限制是用来控制调用方有对接口发起请求的次数,为了让你的 API 用户知道他们还剩下多少余额,可以设置下面的 Header:

  • X-Rate-Limit-Limit:特定时间段内允许的最多请求次数;
  • X-Rate-Limit-Remaining:特定时间段内剩余的请求次数;
  • X-Rate-Limit-Reset:什么时候请求频率限制次数会重置;

大多数的 WEB 框架都支持上面这些 Header,如果内置不支持,也可以找到插件来支持,比如,如果你使用了 koa,可以使用 koa-rate-limit

需要注意的是,不同的 API 服务提供商频率限制的时间窗差异会很大,比如 GitHub 是 60 分钟,而 Twitter 是 15 分钟。

9. 编写良好的 API 文档

编写 API 的目的当然是让别人使用并受益,提供良好的接口文档至关重要。下面这两个开源项目可以帮你创建 API 文档:

如果你愿意使用第三方文档服务商,可以考虑 Apiary

10. 对 API 技术演化保持关注

过去几年中,API 技术方案领域出现了两种新的查询语言,分别是 Facebook 的 GraphQL 和 Netflix 的 Falcor,为什么需要他们呢?

试想这种 API 接口请求:/org/1/space/2/docs/1/collaborators?include=email&page=1&limit=10,类似的情况会让 API 很快失控,如果你希望所有接口能返回类似的响应格式,那么 GraphQL 和 Falcor 就能帮你解决这个问题。

关于 GraphQL

 

关于 Falcor

 

能带来灵感的优秀 API 设计

如果你正在开发 Rest API 或者准备改进老版本的 API,这里收集了几个在线上提供服务、设计优秀并且非常直接借鉴的 API:

QQ截图20170310111400

ES6语言特性的总结(1)

10 | 03 | 2017

虽然在编写项目的过程中,也会用到ES6的语法以及新特性。但感觉学习的不是特别系统,索性这两天重新刷了一下Understanding The ES6,也对ES6有了更深的理解。这里,针对感觉应用比较多,知识点比较重要的部分做了一下总结。内容有点多,因此预计将分为三个部分。

块级绑定-作用域

在ES5中,有一个知识难点,就是变量提升和作用域。而这一部分之所以让人困扰,则是因为JS中变量的声明方式会影响变量实际的创建位置。

有一条规则是:使用var关键字声明的变量,无论其实际声明位置在何处,都会被声明与函数的顶部,这就是变量提升(hosting)。

ES6中为了让变量的生命周期更加可控,引入了块级声明。即,让所声明的变量在指定块的作用域外无法被访问。ES6主要引入了两个新的关键字,letconst

let

letvar类似,不同是的,let声明的变量不会存在变量提升的情况。因此,下面这个代码中:

是无法访问到a变量的。

另一个限制的地方是,禁止重复声明相同的变量。

上面的代码也会报错。

const

这个关键字也是限制了变量提升以及重复声明,而且变量值是不可更改的。

但是,如果绑定的是对象,可以更改对象属性值。

暂时性死区

利用letconst声明的变量,代码在访问到声明处前都是禁止访问的。

循环中的let和const声明

请看下面这段代码:

使用var声明的变量,会在每次循环中被共享了。因此,在循环内部创建的函数都用于同一个变量的引用。通常解决这种方式,在ES5中会采用闭包的方式。而ES6中,可以使用let关键字

这是因为let关键字在每次循环中,都会创建一个新的i变量,而循环内部的函数获取的i变量其实都是副本。

const关键字不可以用在传统的for循环中,但是可以用在for...offor … in语法中。使用效果和let一样。

函数

ES6中对函数的功能做了新的扩展,使之使用起来更方便。

箭头函数

自从有了箭头函数,在遇到回调函数写法的时候,就特别方便。当然它的功能肯定不止于此。箭头函数的语法像这样:

是传统函数写法的一种便捷写法,同时,有以下几个特点:

  1. 不允许重复的具名参数
  2. 没有arguments对象
  3. 不能更改this,在整个函数声明周期内其值会保持不变,因此,在遇到this问题时,不用再像ES5之前的时期使用类似var self =thisbind(this)之类的方法了。
  4. 不能被new调用
  5. 没有this、super、arguments、也没有new.target绑定

默认参数和不具名参数

先看下面这个例子,同时使用了默认参数和不具名参数(也叫做剩余参数):

采用了默认参数值时,仍然可以使用arguments对象来反应真实函数的调用状态, 而arguments对象也可以和不具名参数进行协同工作。

同时,函数的默认值甚至可以利用函数来动态生成,而非写死的,如:

需要注意的是,函数的不具名参数是不能够在对象的setter上使用的,这是因为setter只接受单一值作为它的参数。

扩展运算符

这三个点运算符用在函数声明的时候,就是不具名参数,但是它同时也能用在解构对象上,因此,在函数调用过程中,可以使用该运算符,进行多个参数传递。如

new.target

这是ES6函数对象的元属性,可以通过检查new.target对象是否被定义,可以判断函数是否通过new进行调用。

原理方面,其实就是当函数的构造器(constructor)方法被调用时,new.target 会被填入 new 运算符的作用目标,该目标通常是新创建的对象实例的构造器,并且会成为函数体内部的 this 值。而若call方法被执行的时候, new.target 的值则会是undefined

解构

解构的意思是将数据结构分解为更小的部分,而ES6中引入了解构的方式目的就是能够更好地提取数据。

##对象解构
直接上例子:

以上需要注意的是,当解构赋值表达式的右侧( = 后面的表达式)的计算结果为 null 或 undefined 时,会抛出错误。

##数组解构

数组解构时,解构作用在数组内部的位置上,而不是作用在对象的具名属性上。

参数解构

需要注意的是默认情况下调用函数时未给参数解构传值会抛出错误。但若你要求它是可选的,可以给解构的参数提供默认值来处理这种行为。

扩展的对象功能

在ES6中也对对象的使用方式做了进一步的扩展,使其无论是在代码编写形式层面还是底层操作对象的层面都有了更多的特性。

对象类别

在ES6规范中,定义了对象的每种类别:

1.普通对象:拥有JS对象所有默认的内部行为

2.奇异对象:有别于默认的内部行为的对象

3.标准对象:是在ES6中被定义的对象,可以是普通对象也可以是奇异对象。

4.内置对象:在脚本开始运行时由JS运行环境(浏览器或Node)提供的对象。所有标准对象都是内置对象。

属性初始化器

当对象的一个属性名称与本地变量名相同的时候,可以省略冒号和值,如:

方法简写

方法简写如下:

需要注意的是,使用方法简写,在方法内部可以使用super方法,而传统的写法是无法使用的。

计算性属性名

属性名可以使用拼接的写法,如:

对于某些需要动态生成属性名的场合,写法更加方便。

Object.is方法

为了避免在对象比较过程中的强制对象转换。通常该方法的运行结果和===一样,但是+0-0,NaNNaN不相同。

Object.assign(source, target) 方法

该方法接受一个接收者,以及任意数量的供应者,并会返回接收者。我通常在使用的时候,用来做继承或者说深度拷贝??。

Object.assign() 方法接受任意数量的供应者,而接收者会按照供应者在参数中的顺序来依次接收它们的属性。这意味着在接收者中,第二个供应者的属性可能会覆盖第一个供应者的。

关于重复的对象字面量属性

ES6 移除了重复属性的检查,严格模式与非严格模式都不再检查重复的属性。当存在重复属性时,排在后面的属性的值会成为该属性的实际值。

自有属性的枚举顺序

1.所有的数字类型键,按升序排列。

2.所有的字符串类型键,按被添加到对象的顺序排列。

3.所有的符号类型键,也按添加顺序排列。

修改对象的原型

对象原型的实际值被存储在一个内部属性[[Prototype]] 上, Object.getPrototypeOf() 方法会返回此属性存储的值,而 Object.setPrototypeOf() 方法则能够修改该值。ES6 通过添加 Object.setPrototypeOf()方法而改变了这种假定,此方法允许你修改任意指定对象的原型。它接受两个参数:需要被修改原型的对象,以及将会成为前者原型的对象。
因为这个特性的添加,可以使用 super 进行简单的原型访问。super 是指向当前对象的原型的一个指针,实际上就是 Object.getPrototypeOf(this) 的值。这个功能在使用ES6类的继承的时候,提供了更好的访问父类的方式。

微信小程序自定义轮播图swiper dots默认样式

23 | 01 | 2017

默认的swiper面板指示点都是小圆点黑灰的wx-swiper-dot::before,但这满足不了广大小伙伴需求,目前只尝试成功更改了外层wx-swiper-dot样式,效果如下。

784465-20161109124805905-264881914

对样式文件即*.wxss文件做如下修改 :

但是依然满足不了需求,需求是自己写的(给自己挖了个坑 T_T)然后上网各种查,就有了下文解决办法

首先当然是要禁用掉(直接删掉)swiper属性indicator-dots,再用view组件模拟dots,对应的代码如下:

然后是wxss代码:

再对swiper的bindchange属性绑定对应的事件:

20170112161516126

logo

小内存福音,Kcptun Shadowsocks加速方案

30 | 10 | 2016

本博客曾经发布了通过 锐速Serverspeeder 加速 Shadowsocks 的教程,大家普遍反映能达到一个非常不错的速度。锐速Serverspeeder 虽好,就是内存占用稍高,不适合服务器内存本来就小的用户

今天我就给大家介绍这么一个能替代 锐速Serverspeeder 的项目 — Kcptun。

Kcptun介绍

Kcptun 是一个非常简单和快速的,基于 KCP 协议的 UDP 隧道,它可以将 TCP 流转换为 KCP+UDP 流。而 KCP 是一个快速可靠协议,能以比 TCP 浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。

Kcptun 是 KCP 协议的一个简单应用,可以用于任意 TCP 网络程序的传输承载,以提高网络流畅度,降低掉线情况。由于 Kcptun 使用 Go 语言编写,内存占用低(经测试,在64M内存服务器上稳定运行),而且适用于所有平台,甚至 Arm 平台。

Kcptun 工作示意图:

小内存福音,Kcptun Shadowsocks加速方案 - 第1张  | 扩软博客

KCP 协议:https://github.com/skywind3000/kcp

Kcptun 项目地址:https://github.com/xtaci/kcptun

2016.08.31 v20160831发布,新版支持配置文件!

2016.08.29 新的客户端可视化配置工具可选

2016.08.20 v2016.08.20发布,添加新的加密方式;尝试解决 deadline 问题,断流现象有所减少。

2016.08.19 添加客户端可视化配置工具 Kcptun-GUI

2016.08.13 发布一键安装脚本 https://blog.kuoruan.com/110.html

2016.08.06 添加Kcptun可视化运行工具和Android使用说明。

2016.06.17 添加客户端开机自启批处理,重写软件启动vbs脚本。

相关项目

以下为 Kcptun 的相关项目,如果有兴趣,可以了解一下。

1.Kcp-server:https://github.com/clangcn/kcp-server

Kcp-server 是在 Kcptun 的基础上,添加了配置文件的支持,并整合了一个socks5代理,可用不用配合其他软件单独使用,而原版 Kcptun 需要配合其他软件使用而不能单独使用。Kcp-server 简化了安装过程,一条命令即可配置完毕。

2.Shadowsocks-Plus:https://github.com/shadowsocks-plus/shadowsocks-plus

基于 Shadowsocks Go 版本,加入了以下特性:

  • 启动后降低权限至 nobody , 增强安全性;
  • 与 kcptun 集成,配合相应客户端可加速传输;
  • 网页控制面板。

部署Kcptun

现在博主编写的一键安装脚本已公开发布测试,支持 Kcptun 一键安装、更新、卸载、配置,欢迎测试使用:Kcptun 服务端一键安装脚本

以下为手动配置方式(使用了一键安装脚本之后不用再手动配置了,可用通过 supervisor 命令管理 kcptun):

本教程以 CentOS 6.5 64位为例。

首先下载 Kcptun,可以到 GitHub 上获取最新版:小内存福音,Kcptun Shadowsocks加速方案 - 第2张  | 扩软博客

用 Xshell 或者 Putty 登陆服务器,下载 Kcptun 的预编译版:

 

注:请根据你的系统下载对应版本。32位系统下载 kcptun-linux-386-*.tar.gz,64位系统下载 kcptun-linux-amd64-*.tar.gz

解压之后有两个文件:client_linux_amd64 和 server_linux_amd64,一个用于服务器,一个用于客户端。

这个项目目前还没有 init 脚本,也还不支持配置文件,于是我写了两个简单的 sh 脚本,用于启动和关闭服务端。请在服务端程序相同目录下新建两个文件 start.sh 和 stop.sh。

创建 start.sh

写入以下内容:

 

server_linux_amd64 对应服务端文件名,请对应修改。

创建配置文件

写入以下内容:

  • listen 表示 Kcptun 的服务端监听端口,用于接收外部请求和发送数据,这里设置为:29900,请选一个你喜欢的端口;
  • target 表示要加速的地址,由于 Kcptun 和 Shadowsocks 在同一服务器,地址填写 127.0.0.1,而 8388 为 Shadowsocks 端口;
  • key 是 Kcptun 的验证密钥,服务端和本地必须一致才能通过验证,请自行设置(可省略)默认:it’s a secrect,这里自定义为了 test;
  • crypt 为加密方式,这里使用了轻量快速的 salsa20;
  • mode 为加速模式,默认 fast,这里使用 fast2;
  • nocomp 为去掉压缩传输,这里设置为 false 表示开启压缩传输;
  • 其他参数的含义请查看帮助。

响应速度:

fast3 > [fast2] > fast > normal > default

有效载荷比:

default > normal > fast > [fast2] > fast3

中间 mode 参数比较均衡,总之就是越快越浪费带宽(根据设置,可能会浪费数倍流量),请自行斟酌。推荐模式 fast2。

可用的参数请使用 ./server_linux_amd64 -h 查看:

更深层次的参数调整需要理解 KCP 协议,并通过“隐藏参数”调整。巭孬嫑乱动

下面是作者给的配置参数样例,适用大部分ADSL接入(非对称上下行)的参数(实验环境电信100M ADSL)。其它带宽请按比例调整,比如 50M ADSL,把 CLIENT 的 -sndwnd -rcvwnd 减掉一半,SERVER 不变。

带宽计算公式:在不丢包的情况下,有最大-rcvwnd 个数据包在网络上正在向你传输,以平均数据包大小avgsize计算,在任意时刻,有:

network_cap = rcvwnd*avgsize

数据流向你,这个值再除以ping值(rtt),等于最大带宽使用量。

max_bandwidth = network_cap/rtt = rcvwnd*avgsize/rtt

举例,设rcvwnd = 1024, avgsize = 1KB, rtt = 400ms,则:

max_bandwidth = 1024 * 1KB / 400ms = 2.5MB/s ~= 25Mbps

(注:以上计算不包括前向纠错的数据量)

前向纠错是最大带宽量的一个固定比例增加:

max_bandwidth_fec = max_bandwidth*(datashard+parityshard)/datashard

举例,设datashard = 10 , partiyshard = 3,则:

max_bandwidth_fec = max_bandwidth * (10 + 3) /10 = 1.3*max_bandwidth = 1.3 * 25Mbps = 32.5Mbps

看不懂?那就别管它,你只要会简易自我调优方法就够了:

  1. 同时在两端逐步增大 client rcvwnd 和 server sndwnd;
  2. 尝试下载,观察如果带宽利用率(服务器+客户端两端都要观察)接近物理带宽则停止,否则跳转到第一步。

基本原则:SERVER 的发送速率不能超过 ADSL 下行带宽,否则只会浪费您的服务器带宽。

下面开始创建启动软件所需要用到的一些文件,都是 vi 的基础操作,我不写具体的编辑保存命令了,不会的可以自己搜索一下。

创建 stop.sh

写入以下内容:

 

创建 restart.sh

 

然后可以启动服务端:

/root/kcptun/kcptun.log 为日志信息。

监听日志信息可以使用:

停止服务端请使用:

重启服务端:

添加开机启动:

Centos:

Ubuntu/Debian:

如果你有任何问题,欢迎加入我们的QQ群寻求帮助:43391448

配置客户端

以本地 Windows 64位系统为例,首先下载 Kcptun 的 Windows 版本。

请注意:客户端版本必须和服务端版本一致,有许多朋友没有检查两端造成无法连接!

我这里先新建一个文件夹,命名为 Kcptun,然后下载和服务端相同的版本:

注意:

1.0830以后的版本不和之前的版本兼容,请确保两端使用相同的版本!

2.下面的软件截图仅供选择软件时参考,请不要照着填写里边的参数!

当前,Kcptun 已经有可视化配置工具了,你可以自行选择使用。如果不想用工具,可以往后翻,使用传统的文件启动方式。

1.Kcptun客户端配置管理工具,来自 @dfdragon

小内存福音,Kcptun Shadowsocks加速方案 - 第3张  | 扩软博客

下载地址:https://github.com/dfdragon/kcptun_gclient/releases

2.kcptun-gui-windows,来自 @GangZhuo

小内存福音,Kcptun Shadowsocks加速方案 - 第4张  | 扩软博客

下载地址:https://github.com/GangZhuo/kcptun-gui-windows/releases

3.来自“逗比根据地”的 Kcptun tools。由于软件是易语言编写的,可能会被杀毒软件报毒,请各位自行查毒。

小内存福音,Kcptun Shadowsocks加速方案 - 第5张  | 扩软博客

软件说明:http://www.dou-bi.com/ss-jc37/

软件下载地址:https://pan.baidu.com/s/1i5HdlVv

4.KcptunGUI,来自“诸神的黄昏”。

小内存福音,Kcptun Shadowsocks加速方案 - 第6张  | 扩软博客

源码地址:https://git.oschina.net/ragnaroks/KcptunGUI

软件下载:https://git.oschina.net/ragnaroks/KcptunGUI/releases

注意:客户端和服务端参数必须一致的有:

  • datashard
  • parityshard
  • nocomp
  • key
  • crypt

以下为手动创建启动文件的方法:

由于 Kcptun 是控制台程序,所以我选择使用 vbs 脚本,来达到后台运行的目的。

新建 run.vbs

 

新建 client-config.json

  • localaddr 为 kcptun 本地客户端运行的端口,为 12948;
  • remoteaddr 服务器 IP 地址 10.10.10.10,Kcptun 服务端口为 29900
  • key 验证密钥,和服务端一致;
  • conn 单线连接;
  • autoexpire 60 表示一分钟之后重新建立连接;
  • 其他参数说明见上面服务端配置的说明。

新建 stop.bat

然后双击 run.vbs 运行程序,使用 stop.bat 来停止程序,kcptun.log 为输出的日志信息。

开机启动配置:

新建 startUp.bat:

上面的配置过程中出现了多个端口,我在这里画个图,方便各位理解各端口的作用(点击看大图):

小内存福音,Kcptun Shadowsocks加速方案 - 第7张  | 扩软博客

Shadowsocks 客户端配置

在客户端中新建服务器:

  • 服务器 IP 填写本机:127.0.0.1
  • 服务器端口填写:12948

正确填写你的 Shadowsocks 密码,加密方式,协议和混淆方式。

切换到该服务器上,测试是否正确运行。

速度实测

我用的服务器是搬瓦工 512M 内存,费利蒙机房,以此测试加速效果。

  • 按结论看,Kcptun 的加速效果略逊于 Finalspeed,估计需要细调配置。
  • 刚运行 Finalspeed 时,内存占用就达到了 9.1% 也就是接近 47M;而此时 Kcptun 占用 0.4%,也就是 2M左右。
  • YouTube 1440p 满跑情况下,FInalspeed 最高内存占用 15.4%,接近 79M;而此时 Kcptun 占用 3% 左右,即 15.5M。
  • 速度方面,Finalspeed 最大速度达到了10000 Kbps +,Kcptun 6000+ Kbps。

以上结论为本人测试所得,仅作为参考;实际情况请自行测试,如有纰漏,欢迎指出。

多人同时使用

如果想多人使用同一个服务器并同时使用 Kcptun 加速,经博主测试,需要满足以下两个条件:

  • 启动多个 Kcptun 服务端,并使用不同的端口,你可以将 start.sh 拷贝一份,然后修改其中的端口;
  • 各个 Kcptun 加速不同的 Shadowsocks 服务端端口,也就是 Shadowsocks 也需要开多端口。

Android上使用

请看这篇文章:Shadowsocks-Android客户端上的KCP配置说明

在路由器上使用

如果需要在路由器上使用 Kcptun,首先你得有个智能路由器,然后能进入shell。

编译好的客户端文件在这里下载:

https://github.com/bettermanbao/openwrt-kcptun/releases

小米路由器、极路由等一大批国产智能路由器都是 MT7620 的芯片,请下载 ramips 版本。

转自: https://blog.kuoruan.com/102.html

HIWIFI极路由安装SS客户端

28 | 09 | 2016

前奏

1.获取开发者权限参考:开启极路由开发者模式(SSH)
2.准备工具
* 终端 (Mac)
* putty等连接工具 (Win)
* ss账号一枚 (可购买或自己搭建)

连接极路由

Mac直接用终端访问

BCB05973-7B34-4A23-BB6E-90B653A550CC

代码部分

安装

1.使用putty/XShell等工具登陆极路由
2.运行代码
3.登陆极路由后台-高级设置-Shadowsocks设置
6BD66E9D-5B56-418F-AF85-A47AE9A48659

注意

1.请关闭极路由的自动更新功能,要不每次路由器升级后,会删除SS插件。
2.若shadowsocks选项显示的是:{ "msg": "请求的接口不存在.", "code": 560 },请重启路由器。

下一页