Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

Глазырин Евгений Веб-разработчик “Центр Высоких Технологий” [email protected] https://github.com/genhoi

Slide 3

Slide 3 text

Приложение состоит из нескольких сервисов У приложения есть API

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

● 4 запроса для агрегации ● Клиентский код сложнее ● Как осуществлять контроль доступа? ● Как быть с протоколами AMPQ, binary RPC?

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

API Gateway - точка входа в систему - Похож на паттерн Фасад в ООП - Инкапсулирует внутреннюю архитектуру системы - Разные обязанности (контроль доступа, кэширование, балансировка и т.д.)

Slide 8

Slide 8 text

Варианты реализации ● Готовые решения ○ Kong (https://getkong.org) написан на Lua ○ API Umbrella (https://apiumbrella.io) написан на Lua ○ Tyk (https://tyk.io) написан на Go ● Своя реализация ○ Openresty (nginx + Lua) ○ PHP7 (nginx + php-fpm) ○ PHP7 (reactphp, kraken-php, Workerman) ○ NET Core ○ Go ○ и т.д.

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Почему Nginx + Lua? Много хороших отзывов о связке Nginx + Lua (2ГИС, Parallels) https://github.com/mindreframer/nginx-lua-stuff http://techno.2gis.ru/lectures/8 http://www.slideshare.net/profyclub_ru/openresty-nginx-parallels Высокая скорость работы Уже давно все используют :)

Slide 11

Slide 11 text

OpenResty Веб платформа интегрирующая Nginx, LuaJIT и различные библиотеки на Lua. Создан, чтобы помочь в разработке веб-сервисов и динамических шлюзов

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

lua-nginx-module Встраивает Lua в Nginx Event loop у nginx используется для всех асинхронных действий, включая HTTP запросы и запросы к БД. 


Slide 14

Slide 14 text

server { listen 80; lua_code_cache on; location / { content_by_lua_block {
 ngx.say("hello, world")
 }; } }

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

Lapis http://leafo.net/lapis Веб фреймворк, основанный на Openresty. local lapis = require "lapis"
 local app = lapis.Application()
 
 app:match("/", function(self)
 return "Hello world!"
 end)
 
 return app

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

… http { include mime.types; server { listen ${{PORT}}; lua_code_cache ${{CODE_CACHE}}; location / { resolver ${{DNS_SERVER}}; content_by_lua_block { require("lapis").serve("app") } } } nginx.conf

Slide 19

Slide 19 text

local config = require("lapis.config") config({"development", "production"}, { port = "80", dns_server = "127.0.0.11", num_workers = "1", email_enabled = false, code_cache = "off", }) config("production", { email_enabled = true, code_cache = "on" }) config.lua

Slide 20

Slide 20 text

local lapis = require("lapis") local http = require("lapis.nginx.http") local app = lapis.Application() app:match("/", function(self) local buf = {}; buf[1] = http.simple("http://openresty_hello"); buf[2] = ", "; buf[3] = http.simple("http://openresty_world"); return { table.concat(buf), status = 200, headers = {}, render = false, layout = false } end) return app app.lua

Slide 21

Slide 21 text

$ lapis server

Slide 22

Slide 22 text

PHP Простой API gateway на базе PHP и Lumen Ваша реализация :)

Slide 23

Slide 23 text

require __DIR__ . '/vendor/autoload.php'; $client = new GuzzleHttp\Client(); $promises = [ $client->getAsync('http://openresty_hello'), $client->getAsync('http://openresty_world'), ]; /** @var \GuzzleHttp\Psr7\Response[] $results */ $results = GuzzleHttp\Promise\unwrap($promises); $responseContent = $results[0]->getBody() . ', ' . $results[1]->getBody(); Guzzle 6

Slide 24

Slide 24 text

Инструменты тестирования docker Yandex Tank

Slide 25

Slide 25 text

В течении 5 минут нагрузка повышалась линейно от 1000 RPS до 3000 RPS Приложение выводит строку “Hello, World” в теле ответа Test #1

Slide 26

Slide 26 text

Test #2 Test #3

Slide 27

Slide 27 text

Нагрузка 5 минут - 500 RPS Test #2 Среднее время ответа в мс.

Slide 28

Slide 28 text

Где NET Core?

Slide 29

Slide 29 text

Test #3 Нагрузка 5 минут - 1000 RPS Среднее время ответа в мс.

Slide 30

Slide 30 text

Исходники сервисов https://github.com/genhoi/api-gateway

Slide 31

Slide 31 text

Вопросы?