Fork me on GitHub

记一次公司 node 实现 BFF 的分享

最近公司有一个团队要搭建 bff 层,顺应了他们的要求,准备了一波分享。

具体从当前业务痛点、BFF 是什么、解决了什么问题、实现一个 BFF 要做哪些事情这几个方面去讲解。

img
img
img
img
img
img
img
img
img
img
img
img
img
img
img
img

项目演示: https://github.com/weiyuan0609/egg-server-template

wrk

ppt 中有提到 wrk 这个工具,这里做个具体的讲解

我用的是 mac, 所以下面都是基于此系统来讲解的

1. wrk 介绍

wrk 是一个用来做 HTTP benchmark 测试的工具。可以产生显著的压力。相比于 Apache ab 功能更为强大,可以使用 lua 脚本来支持更为复杂的测试场景,例如 POST 请求等。在对于 Restful 架构的 API 接口来说,测试起来更加便捷。

2. 下载 wrk

brew install wrk

  • 如果这里卡住,可以调整
1
2
3
4
5
6
7
8
9
# 替换brew.git:
cd "$(brew --repo)"

git remote set-url origin https://mirrors.ustc.edu.cn/brew.git

# 替换homebrew-core.git:
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"

git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
  • 再执行一次 brew install wrk 即可

3. 使用方式

可以使用 wrk -help 查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
使用方法: wrk <选项> <被测HTTP服务的URL>
Options:
-c, --connections <N> 跟服务器建立并保持的TCP连接数量
-d, --duration <T> 压测时间
-t, --threads <N> 使用多少个线程进行压测

-s, --script <S> 指定Lua脚本路径
-H, --header <H> 为每一个HTTP请求添加HTTP头
--latency 在压测结束后,打印延迟统计信息
--timeout <T> 超时时间
-v, --version 打印正在使用的wrk的详细版本信息

<N>代表数字参数,支持国际单位 (1k, 1M, 1G)
<T>代表时间参数,支持时间单位 (2s, 2m, 2h)`

4. 测试

1
wrk -t8 -c500 -d2s --latency "http://localhost:8080/test"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Running 2s test @ http://localhost:8080/test
8 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 40.70ms 9.60ms 83.48ms 66.26%
Req/Sec 640.89 328.89 1.43k 64.29%
Latency Distribution
50% 31.15ms
75% 23.46ms
90% 62.23ms
99% 85.23ms
7920 requests in 2.07s, 2.02MB read
Socket errors: connect 253, read 201, write 0, timeout 0
Requests/sec: 3322.60
Transfer/sec: 1.60MB
  • 可以看出 2s 内完成了 7920 个请求,2.02mb 的数据读取
  • 当然你也可以用 lua 脚本个性化测试,这里不做过度的讲解,有兴趣可以去学习下
  • wrk 使用方便,结果清晰。并且因为非阻塞 IO 的使用,可以在普通的测试机上创建出大量的连接,从而达到较好的压测效果。
  • 同时又做过极限压测,出现了 OOM 的情况,记得 Node.js 版本还是 12.x 版本
-------------本文结束感谢您的阅读-------------