nginx
В реальной жизни этот микросервис работал бы по HTTP. Добавим веб-сервер
nginx в наше окружение и создадим аналогичное
демо. Но как сделать методы Tarantool доступными через REST API?
Используем nginx с модулем Tarantool nginx upstream и создадим
ещё один Lua-скрипт (app.lua),
который экспортирует три игровых метода — add_pokemon(), map() и
catch() — как REST-адреса (endpoints) модуля nginx upstream:
local game = require('pokemon')box.cfg{listen=3301}game:start()-- add, map and catch functions exposed to REST APIfunction add(request, pokemon)return {result=game:add_pokemon(pokemon)}endfunction map(request)return {map=game:map()}endfunction catch(request, pid, player)local id = tonumber(pid)if id == nil thenreturn {result=false}endreturn {result=game:catch(id, player)}end
Простой способ настроить и запустить nginx — создать Docker-контейнер на основе Docker-образа с уже установленными nginx и модулем upstream (см. http/Dockerfile). Возьмём стандартный nginx.conf, в котором определим upstream с запущенным Tarantool-бэкендом (это ещё один Docker-контейнер, подробности ниже):
upstream tnt {server pserver:3301 max_fails=1 fail_timeout=60s;keepalive 250000;}
и добавим некоторые параметры, специфичные для Tarantool (описание см. в
файле README модуля upstream):
server {server_name tnt_test;listen 80 default deferred reuseport so_keepalive=on backlog=65535;location = / {root /usr/local/nginx/html;}location /api {# answers check infinity timeouttnt_read_timeout 60m;if ( $request_method = GET ) {tnt_method "map";}tnt_http_rest_methods get;tnt_http_methods all;tnt_multireturn_skip_count 2;tnt_pure_result on;tnt_pass_http_request on parse_args;tnt_pass tnt;}}
Аналогично поместим сервер Tarantool и всю игровую логику во второй
Docker-контейнер на основе официального образа Tarantool 1.9
(см. src/Dockerfile)
и зададим команду по умолчанию для контейнера — tarantool app.lua.
Это наш бэкенд.