little service in 2h

42
Пишем веб-сервис за два часа Алексей Южаков

Upload: alexei-yuzhakov

Post on 16-Jun-2015

221 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: Little Service in 2h

Пишем веб-сервис за два часа

Алексей Южаков

Page 2: Little Service in 2h

2

ПредысторияОжидание вылета домой

Page 3: Little Service in 2h

3

• Пропадание связи на короткие интервалы (очень регулярно)• Нарушение SLA не докажешь, но работать невозможно

ПредысторияВсе пропало – сервер не отвечает, клиенты негодуют

Page 4: Little Service in 2h

4

• Пропадание связи на короткие интервалы (очень регулярно)• Нарушение SLA не докажешь, но работать невозможно

ПредысторияВсе пропало – сервер не отвечает, клиенты негодуют

Page 5: Little Service in 2h

5

• Nagios, Cacti, Zabbix, Pingdom – не то• «Велосипед» будет решать только нашу задачу, но так как надо

ПредысторияПишем свой «велосипед»

Page 6: Little Service in 2h

6

• За 5 минут пишем все мысли в Evernote• До реализации дойдет процентов 10 из всего списка• Позволяет не забыть интересные идеи• Не надо тратить время на формальности project tracking систем

ПланированиеУ нас же серьезный проект?

Page 7: Little Service in 2h

7

ПланированиеВизуализация идей (в голове)

• Сервис создания mock-up’ов – https://moqups.com

Page 8: Little Service in 2h

8

ПланированиеАрхитектура

Агент Агент Агент

Веб-интерфейс

Управляющий демон

База данных

Page 9: Little Service in 2h

9

• Знать множество shortcut’ов в любимой IDE – обязательно• Один инструмент на задачу (Unix way)• Прогресс не стоит на месте – ищите новые удобные инструменты• Чего-то не хватает? Попробуйте автоматизировать• Верный выбор – думаете о задаче, а не об инструментах

ИнструментыУдобные инструменты – залог продуктивности

Page 10: Little Service in 2h

10

ИнструментыУдобный терминал iTerm2 и vi

Page 11: Little Service in 2h

11

• Полная виртуализация ОС• Бесплатно• Управление из консоли• Удобен для создания development окружений

ИнструментыVirtualBox и Vagrant

Page 12: Little Service in 2h

12

Реклама Parallels Desktop 8 for Mac тоже клевая штука

Page 13: Little Service in 2h

13

• Создание и запуск виртуальной машины в 3 команды

$ vagrant box add base http://files.vagran…/lucid32.box$ vagrant init$ vagrant up

• Готовое к работе окружение• Headless-машинка с управлением из консоли• Конфигурационный файл Vagrantfile• Уже настроенный shared folder - /vagrant• Скорость создания и повторяемость результата

ИнструментыНастраиваем Vagrant

Page 14: Little Service in 2h

14

• Почему Node.js?• Ново и интересно• Знаком с JavaScript• Нужно написать сетевое приложение

• Нюансы• Асинхронность

РазработкаПишем агента на Node.js

Page 15: Little Service in 2h

15

• Иcпользуем JSON для API• Ровно один метод – «хост доступен?»• Используем модуль net для работы с сокетами

var net = require('net');

net.createServer(function(socket) { socket.on('data', function(data) { // ... }}).listen(6000);

РазработкаПишем агента на Node.js

Page 16: Little Service in 2h

16

• Для проверки доступности хоста используем exec ping’а

var child_ps = require("child_process")var ping = child_ps.spawn("ping", ['-W', 2, '-c', 1, ip]);ping.on('exit', function(code) { var result = (0 == code) ? 'ok' : 'fail'; socket.end(JSON.stringify({ 'result': result }));});

• Весь код – 30 строк вместе с отладочной информацией• Даже работает

РазработкаПишем агента на Node.js

Page 17: Little Service in 2h

17

• Время поджимает – пишем на Ruby• Читаем из базы список агентов• Опрашиваем по списку хостов каждого из агентов• Сохраняем результаты проверок в базе

РазработкаПишем демона по опросу агентов

Page 18: Little Service in 2h

18

• Весь код - 60 строчек (подключены mongo, socket, json)

db = Mongo::Connection.new.db('checks’)loop do sockets = get_sockets(db.collection('agents').find) sockets.each do |socket| db.collection('hosts').find.each do |host| db.collection('checks').insert({ :host_id => host['_id'], :status => ping(socket, host['ip']), :timestamp => Time.now.to_i,...

РазработкаПишем демона по опросу агентов

Page 19: Little Service in 2h

19

РазработкаСохраняем данные в MongoDB

• Данных будет много – 35К для одного хоста в день• Для записи – 3-4 поля (по сути документ)• Смотрим в сторону NoSQL баз• MongoDB – уже знакомое решение• Опять JavaScript (интерфейс управления) – просто и удобно

Page 20: Little Service in 2h

20

• На стороне сервера – Sinatra• На стороне клиента – Twitter Bootstrap

РазработкаСоздаем UI

Page 21: Little Service in 2h

21

• Sinatra – микрофреймворк для веб-приложений• Написан на Ruby• Очень лаконичный и понятный DSL• Есть все, что нужно для веб-приложения

• Идеально для небольших веб-приложений• Можно выделить views/layouts• Весь нужный код в одном файле

Пример:

get '/agents' do @agents = @db.collection('agents').find haml :agents, :format => :html5end

РазработкаSinatra

Page 22: Little Service in 2h

22

• Вы о нем уже наверное слышали? • Front-end фреймворк

• HTML болванка и наборы сниппетов• CSS для pretty look• JavaScript-свистелки• Немного иконок

• Интерфейс, который не стыдно показать не только своей кошке• Минимум усилий для того, чтобы подключить и начать использовать

РазработкаTwitter Bootstrap

Page 23: Little Service in 2h

23

Внешний видТак обычно выглядит типичный внутренний проект

Page 24: Little Service in 2h

24

Внешний видНа самом деле скорее даже вот так

Page 25: Little Service in 2h

25

Внешний видТоже самое, но с Twitter Bootstrap

Page 26: Little Service in 2h

26

РазметкаТрадиционный HTML + embedding (лет 10 уже)

<div class='navbar navbar-fixed-top'> <div class='navbar-inner'> <div class='container’> <div class='nav-collapse'> <ul class='nav'> <li><%= link_to .. %></li> <li><%= link_to .. %></li> </ul> </div> </div> </div> </div>

Page 27: Little Service in 2h

27

РазметкаЗакрывающиеся теги - лишнее

<div class='navbar navbar-fixed-top'> <div class='navbar-inner'> <div class='container’> <div class='nav-collapse'> <ul class='nav'> <li><%= link_to .. %></li> <li><%= link_to .. %></li> </ul> </div> </div> </div> </div>

Page 28: Little Service in 2h

28

РазметкаСлова div и class – тоже лишние

<div class='navbar navbar-fixed-top'> <div class='navbar-inner'> <div class='container’> <div class='nav-collapse'> <ul class='nav'> <li><%= link_to .. %></li> <li><%= link_to .. %></li> </ul> </div> </div> </div> </div>

Page 29: Little Service in 2h

29

РазметкаИспользуем HAML

.navbar.navbar-fixed-top .navbar-inner .container .nav-collapse %ul.nav %li= link_to .. %li= link_to ..

Page 30: Little Service in 2h

30

• Меньше кода – меньше ошибок• Меньше кода – быстрее писать• Меньше лишних символов – легче читать• Аккуратность кода форсирована на уровне языка (как в Python)

РазметкаПлюсы перехода на HAML

Page 31: Little Service in 2h

31

РазметкаПример результирующего layout-файла

Page 32: Little Service in 2h

32

• Решил поэкспериментировать – сделал ветку• Полезно даже для внутреннего проекта и одного разработчика• Контроль версий работает и локально• Решили поделиться с миром – можно отправить на GitHub

Система контроля версийВспоминаем про Git

Page 33: Little Service in 2h

33

• Не усложняем – Capistrano не нужен• Ставим агента на удаленный сервер (просто scp)

Деплой

Page 34: Little Service in 2h

34

• Для запуска нужен node, но пакетов нет в репозиториях ОС • WTF, надо собрать node, а на одной машине gcc нет • Аналогичной машинки, но с gcc – тоже нет

Деплой

Page 35: Little Service in 2h

35

• В этот раз проверяем наличие Ruby на машинах-агентах• Кода мало – легко переписать полностью за 10 минут

server = TCPServer.new 6000loop do Thread.start(server.accept) do |client| while (data = client.gets ...) do request = JSON.parse(data.chomp) `ping -W 2 -c 1 #{request['ip']}` result = $?.success? ? 'ok' : 'fail' client.puts({ 'result' => result }.to_json)...

РазработкаПишем агента на Ruby

Page 36: Little Service in 2h

36

• Агент поставлен на все нужные машины• Нет острой необходимости переписывать агент на С

• Не делаем лишней работы

• Все заработало как задумывалось!• Весьма мотивирующий фактор

ДеплойПовторяем процедуру

Page 37: Little Service in 2h

37

• Создавая проект, напоминайте себе цель как можно чаще• Экспериментируйте и изучайте новые технологии

• Сэкономит время в будущем

• Если результат или срок критичен – заканчивайте эксперименты• И возвращайтесь к использованию проверенных инструментов

• Ошиблись – обязательно разберитесь почему• И как избежать той же ошибки в дальнейшем

• Добивайтесь рабочего прототипа как можно быстрее• И переходите к наращиванию функционала итерациями

Выводы

Page 38: Little Service in 2h

38

• Работающий проект или прототип лучше:• Рассказов• Графиков• Презентаций

Выводы

Page 39: Little Service in 2h

39

• Работающий проект или прототип лучше:• Рассказов• Графиков• Презентаций

Выводы

Page 40: Little Service in 2h

40

• https://github.com/sibprogrammer/checks• http://nodejs.org/• http://www.sinatrarb.com/• http://vagrantup.com/• https://www.virtualbox.org/• http://www.iterm2.com/• http://twitter.github.com/bootstrap/• http://haml.info/• http://www.mongodb.org/• https://moqups.com/

Ссылки

Page 41: Little Service in 2h

41

Вопросы?

E-mail: [email protected]

Page 42: Little Service in 2h

42

Спасибо!