http服务

http服务已经接入了涵曦的wlua,扩展了路由和中间件模式,完整示例请看运行examples/webapp 源码。
默认webapp运行的是webapp_dispatch.lua,想要切换其他示例,只需要更改load_mods.lua中的dispatch即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
return {
web_agent_m = {
launch_seq = 1,
launch_num = 6,
default_arg = {
protocol = 'http',
dispatch = 'apps.webapp_dispatch',
}
},

web_master_m = {
launch_seq = 2,
launch_num = 1,
default_arg = {
protocol = 'http',
port = 80,
}
}
}
  • 处理没有命中路由
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
--初始化一个纯净版
local app = engine_web:new()
--请求处理
M.dispatch = engine_web.dispatch(app)

--初始化
function M.init()
--注册全局中间件
app:use(logger_mid())

--注册没有找到的路径处理函数
app:set_no_route(function(c)
local method = c.req.method
log.error("no route handle begin 1:",method)

c:next()

log.error("not route handle end 1:",c.res.status,c.res.resp_header,c.res.body)
end,
function(c)
local method = c.req.method
log.error("no route handle begin 2:",method)

c:next()

log.error("not route handle end 2:",c.res.status,c.res.resp_header,c.res.body)
end)

app:run()
end

--服务退出
function M.exit()

end
  • params路径方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    --初始化一个纯净版
    local app = engine_web:new()
    --请求处理
    M.dispatch = engine_web.dispatch(app)

    --初始化
    function M.init()
    --注册全局中间件
    app:use(logger_mid())

    --/login 路径不会命中
    --/login/123 会命中
    app:get("/login/:player_id/*",function(c)
    local params = c.params
    local player_id = params.player_id

    log.error("params:",params)
    log.error("path:",c.req.path)
    log.error("body:",c.req.body,c.req.body_raw)

    c.res:set_rsp("hello " .. player_id,HTTP_STATUS.OK)
    end)

    app:run()
    end

    --服务退出
    function M.exit()

    end
  • query 和 post from

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    --初始化一个纯净版
    local app = engine_web:new()
    --请求处理
    M.dispatch = engine_web.dispatch(app)

    --初始化
    function M.init()
    --注册全局中间件
    app:use(logger_mid())

    app:post("/login",function(c)
    local player_id = c.req.query.player_id
    assert(player_id)

    log.error("query:",c.req.query)
    log.error("post from:",c.req.body)

    c.res:set_rsp("hello " .. player_id,HTTP_STATUS.OK)
    end)

    app:run()
    end

    --服务退出
    function M.exit()

    end
  • json请求

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    --初始化一个纯净版
    local app = engine_web:new()
    --请求处理
    M.dispatch = engine_web.dispatch(app)

    --初始化
    function M.init()
    --注册全局中间件
    app:use(logger_mid())

    app:post("/login",function(c)
    local player_id = c.req.query.player_id
    assert(player_id)

    log.error("query:",c.req.query)
    log.error("json body:",c.req.body)

    local rsp = {
    msg = "hello " .. player_id
    }
    c.res:set_json_rsp(rsp)
    end)

    app:run()
    end

    --服务退出
    function M.exit()

    end
  • 自定义中间件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    --初始化一个纯净版
    local app = engine_web:new()
    --请求处理
    M.dispatch = engine_web.dispatch(app)

    --初始化
    function M.init()
    --注册全局中间件
    app:use(logger_mid())

    --自定义中间件
    app:use(function(c)
    log.info("process begin :",c.req.path,c.req.method)

    --执行下一个中间件
    c:next()

    log.info("process end :",c.req.path,c.req.method)
    end)

    app:get("/",function(c)
    log.info("end point process ",c.req.path,c.req.method)
    c.res:set_rsp("hello skynet_fly",HTTP_STATUS.OK)
    end)

    app:run()
    end

    --服务退出
    function M.exit()

    end
  • 多路由组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    --初始化一个纯净版
    local app = engine_web:new()
    --请求处理
    M.dispatch = engine_web.dispatch(app)

    --初始化
    function M.init()
    --注册全局中间件
    app:use(logger_mid())
    do
    local v1 = app:group("v1")
    v1:get('/login',function(c)
    log.info("v1 login ")
    end)

    v1:get('/logout',function(c)
    log.info("v1 logout ")
    end)
    end

    do
    local v2 = app:group("v2")
    v2:get('/login',function(c)
    log.info("v2 login ")
    end)

    v2:get('/logout',function(c)
    log.info("v2 logout ")
    end)
    end

    app:run()
    end

    --服务退出
    function M.exit()

    end
  • 多路由组中间件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
--初始化一个纯净版
local app = engine_web:new()
--请求处理
M.dispatch = engine_web.dispatch(app)

--初始化
function M.init()
--注册全局中间件
app:use(logger_mid())
do
local v1 = app:group("v1")
--注册v1路由组的中间件
v1:use(function(c)
log.info("process begin v1 mid ",c.req.path,c.req.method)
c:next()
log.info("process end v1 mid ",c.req.path,c.req.method)
end)
v1:get('/login',function(c)
log.info("v1 login ")
end)

v1:get('/logout',function(c)
log.info("v1 logout ")
end)
end

do
local v2 = app:group("v2")
--注册v2路由组的中间件
v2:use(function(c)
log.info("process begin v2 mid ",c.req.path,c.req.method)
c:next()
log.info("process end v2 mid ",c.req.path,c.req.method)
end)
v2:get('/login',function(c)
log.info("v2 login ")
end)

v2:get('/logout',function(c)
log.info("v2 logout ")
end)
end

app:run()
end

--服务退出
function M.exit()

end
  • 单文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    --初始化一个纯净版
    local app = engine_web:new()
    --请求处理
    M.dispatch = engine_web.dispatch(app)

    --初始化
    function M.init()
    --注册全局中间件
    app:use(logger_mid())

    app:static_file('/login/test.webp','./static/test.webp')

    app:run()
    end

    --服务退出
    function M.exit()

    end
  • 资源文件夹

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    --初始化一个纯净版
    local app = engine_web:new()
    --请求处理
    M.dispatch = engine_web.dispatch(app)

    --初始化
    function M.init()
    --注册全局中间件
    app:use(logger_mid())

    app:static_dir("/login","./static/imgs")

    app:run()
    end

    --服务退出
    function M.exit()

    end
  • Benchmark

skynet_fly

1
2
3
4
5
6
7
30 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 43.07ms 5.32ms 423.34ms 95.72%
Req/Sec 761.97 93.59 1.00k 82.94%
680746 requests in 30.10s, 52.60MB read
Requests/sec: 22619.75
Transfer/sec: 1.75MB

gin

1
2
3
4
5
6
7
30 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 10.91ms 10.15ms 421.71ms 82.49%
Req/Sec 3.43k 1.09k 30.39k 77.92%
3051430 requests in 30.11s, 325.93MB read
Requests/sec: 101354.20
Transfer/sec: 10.83MB

http服务
https://huahua132.github.io/2023/02/25/skynet_fly_word/word_3/M_http/
作者
huahua132
发布于
2023年2月25日
许可协议