Сервисы, лежащие в основе взаимодействия: HTTP, SMTP, SSH
Сетевые сервисы — основа взаимодействия
- В современных проектах основная часть взаимодейтсвия проходит по сети
- Даже если разработчики находятся локально, всё равно есть некая сетевая составляющая. Если же разработка ещё и территориально распределена, то это единственный эффективный способ регулярного взаимодействия.
- Сеть представляет из себя набор стеков протоколов, из которых нас интересуют, фактически, самые верхние: TCP/IP и ряд прикладных протоколов.
Сетевой сервис
- Сетевой сервис — нечто, доступное по сети (в интересном нами случае — по протоколу TCP/UDP) и отвечающее на клиентские запросы.
- Отметим, что TCP представляет нам транспорт, соответственно, взаимодейтсвие клиента и сервера на прикладном уровне можно представить как обмен последовательностями байт. Что, в свою очередь, есть фактически взаимодействие по stdin/stdout.
- Соответственно, для ряда простых сетевых сервисов можно не заниматься адом реализации многопоточного сетевого сервера на люббимом языке программирования, вместо этого написав приложения вида текстовый фильтр, реализуя только собственно логику приложения.
- Эта идея не нова, как следствие, существуют мета-сервер, позволяющий сервить подобные текстовые фильтры как сетевые сервисы. Он имеет несколько реализаций, среди них можно отметить те, что называются inetd и xinetd. Из существенной для их использования разницы — xinet.d хранит конфигурацию в отдельных файлах для каждого сервиса и имеет для этих сервисов ручек поболе, в то время как inetd — в одном и ручек у него поменьше.
- В качестве примера создадим репозиторий и предоставим возможность забирать его содержимое по внутреннему сетевому протоколу Git.
- Git для взаимодействия по сети может использовать несколько протоколов: свой собственный, туннелироваться по ssh, rsync или HTTP WebDAV.
- Для работы по собственному протоколу (который, к слову, является бинарным) с git поставляется сервер git-daemon.
- Помимо собственной реализации tcp-сервера у себя внутре, также может работать с режиме текстового фильтра совместно с inetd.
server$ git init server$ git add server$ git commit # в этот момент у нас появился репозиторий, в котором что-то есть server$ cat /etc/xinetd.d/git # default: off # description: The git server offers access to git repositories. service git { disable = no socket_type = stream type = UNLISTED port = 9418 wait = no user = esyr nice = 10 rlimit_as = 256M server = /usr/bin/git server_args = daemon --inetd --syslog --verbose --base-path=/home/esyr/git-test/.git } server$ sudo /etc/init.d/xinetd restart client$ git clone server$ touch .git/git-daemon-export-ok client$ git clone client$ git commit client$ git push server$ cat .git/ [daemon] uploadpack = true client$ git push
HTTP
- Протокол
- Программный стек
- CGI
- Идея аналогичная той, что у других сервисов с inetd
- cgit
- WSGI
- Аутентификация
SMTP, XMPP, SIP
SSH
- Суть — безопасный транспорт, поверх которого можно запускать разное (в том числе, shell)
- Юзкейсы: предоставление различных сервисов на удалённой машине
- Пример: авторизованная работа с git
- gitolite
root@server\# useradd git client\$ ssh-keygen -f ~/.ssh/gitolite client\$ ssh-copy-id -i ~/.ssh/gitolite.pub git@server client\$ git clone git://github.com/sitaramc/gitolite gitolite client\$ cd gitolite/src client\$ ./gl-easy-install git server git-admin client\$ tail -31 ./gl-easy-install client\$ cd ~/gitolite-admin/