# Client-Server Architecture

**Клиент-серверная архитектура** - это модель взаимодействия компонентов системы, где клиент (потребитель услуг) отправляет запросы серверу (поставщику услуг), который в свою очередь обрабатывает эти запросы и возвращает результаты обратно клиенту.

![SimpleClientServerArchitecture](/pictures/Common/SimpleClientServerArchitecture.png?raw=true)

Клиент-серверная архитектура подразумевает разделение обязанностей выполнения тех или иных функций на различные части ПО.

В этой архитектуре выделяются 3 основных компонента:

* Клиент;
* Сервер;
* База данных;

**Клиент** – это та часть ПО, с которой взаимодействует пользователь. Например, когда Вы читаете этот текст в браузере или в мобильном приложении, Вы работаете с клиентской частью ПО.

Более формально - клиентом является любая программа способная отправлять запросы на сервер.

Обязанности клиента:

* отправка запроса на сервер
* получение ответа от сервера
* визуализация ответа
* хранение данных

Примеры клиентов:

* браузер ПК
* браузер смартфона
* мобильные приложения
* десктопные приложения
* умные часы и т.д.

**Сервер** – это компонент ПО, ответственная за логику обработки запросов от клиента. Сервер - это невидимая для пользователя часть ПО. В клиент-серверной архитектуре логика исполняется серверной частью.

Обязанности сервера:

* получение запроса от клиента
* обработка данных и запросов
* обращение в базу данных для получения, внесения, обновления, удаления информации

**База данных** — это компонент ПО, отвечающий за хранение данных. Также как и сервер, она невидима для пользователя. База данных получает от сервера запросы и возвращает ответы. Сервер обращается к реляционной базе данных и получает от неё ответ посредством языка структурированных запросов SQL.

Базы данных делятся на два основных типа:

* Реляционные: данные хранятся в таблицах и строках. Взаимодействие осуществляется при помощи SQL.
* Нереляционные (NoSQL): данные могут храниться в различных форматах, таких как "ключ-значение", документные, графовые и другие.

Основные функции баз данных:

* хранение данных;
* обработка запросов от сервера;
* отправка ответов серверу.

Для наглядности:

![Client-Server-DataBase](/pictures/ComputerScience/Client-Server-DataBase.jpg?raw=true)

Выше перечислены основные сущности в клиент-серверной архитектуре. В клиент-серверную архитектуру также могут быть интегрированы прокси-серверы, CDN, балансировщики, кэши и иные компоненты.

## Необходимые условия

Для такой системы характерно:

* наличие центрального агрегата обслуживания – **сервера**;
* присутствие удаленных **компьютеров-клиентов**, с которых отправляются запросы;
* применение дружественного **интерфейса** для удобства работы пользователей.

Чтобы построить такую архитектуру, необходимо купить **сервер, компьютеры, вспомогательное оборудование, установить ПО, выполнить настройки**.

## Разновидности клиент-серверной архитектуры

* **Классическая** – пользовательский интерфейс, отображение данных и взаимодействие с пользователем со стороны клиентской составляющей, обработка запросов, бизнес-логика – за серверной частью;

* Тонкий и толстый клиент с перевесом в сторону одного или другого основного компонента системы:

    * **1) Тонкий клиент (Thin Client)**. При таком подходе предоставляются ограниченные возможности. Сервер производит все расчеты и передает их клиенту;

        Пример: Толстый клиент (**Outlook/Photoshop desktop приложение**) использует больше ресурсов компьютера и работает в автономном режиме.

    2) Бывают исключения, когда клиент использует мощности устройства (оперативная память, процессор и т.п.):

    * Такие клиенты называются **Толстыми клиентами (Fat Client / Heavy Client)**. Предусматривается более высокая вычислительная мощность. Клиент выполняет сложные задачи независимо от сервера, но обращается к нему для получения дополнительных данных.

        Пример: Тонкий клиент (**Gmail/Online-Photoshop в браузере**) полагается на ресурсы сервера и требует подключения к интернету.



## Какие уровни существуют в клиент-серверной архитектуре?

В системе представлено несколько уровней:

* уровень клиента – программное приложение, http запросы, веб-браузер или устройство, которое отправляет запросы на сервер и получает ответы;
* уровень сервера – компьютер, физическая или виртуальная машина, которая обрабатывает запросы и отправляет ответы;
* уровень базы данных – система СУБД – принимает запросы для выполнения операций, хранит информацию, обеспечивает ее безопасность, целостность.

![ClientServerArchitectureTier](/pictures/Common/Client-ServerTierArchitecture.jpg?raw=true)

Используется также классификация, на основании которой выделяется одно (tier-1), двух (tier-2), трех (tier-3) и многоуровневая архитектура (tier-n) в зависимости от компонентов и характера их взаимодействия.

### Одноуровневая архитектура (1-Tier)

Для одноуровневой системы характерны следующие отличительные особенности:

* клиент и сервер находятся на одном физическом уровне;
* программное обеспечение работает непосредственно на клиентском компьютере без промежуточных серверных узлов;
* все операции – получение, обработка данных, вывод результатов – выполняются локально на клиентском устройстве.

Такая архитектура проста в реализации, позволяет быстро откликаться на запросы клиентов. Однако способна вызывать проблемы синхронизации, так как данные на разных рабочих машинах часто сохраняются в собственных вариантах.

Пример: локальный Obsidian

### Двухуровневая архитектура (2-Tier)

Двухуровневая клиент-серверная архитектура предполагает:

* обязательно присутствует серверный уровень между клиентским устройством и базой данных;
* клиент отправляет запросы на серверный узел, там осуществляется их обработка и доступ к базе данных;
* сервер отвечает за бизнес-логику, хранение данных и взаимодействие с БД;
* клиентский уровень обеспечивает визуализацию и интерактивность пользовательского интерфейса.

В такой среде обычно легко ориентироваться, работать, получать информацию. Система легко обновляется, масштабируется, обеспечивает высокую производительность.

### Трехуровневая архитектура (3-Tier)

Для такого типа архитектуры характерно:

* есть три взаимосвязанных уровня – клиентский, серверный, баз данных;
* клиентский предоставляет пользовательский интерфейс, взаимодействует с потребителем;
* серверный отвечает за обработку бизнес-логики, управляет доступом к данным;
* уровень базы данных отвечает за их хранение и управление.

Трехуровневая система гарантирует целостность потока, защищает информацию от проникновения злоумышленников. К недостаткам относится наличие промежуточного программного обеспечения, которое усложняет структуру взаимодействий клиентов с сервером.

### Многоуровневая архитектура (N-Tier)

Многоуровневая клиент-серверная архитектура имеет следующие отличительные особенности:

* обладает более сложной структурой с несколькими серверными и клиентскими уровнями;
* каждый из них отвечает за определенные функции и способен быть физически разделен на разные компоненты;
* позволяет более гибко масштабировать систему и распределять нагрузку между серверами.

Коммуникация между уровнями происходит по определенным протоколам и интерфейсам. Это обеспечивает высокую надежность, гибкость системы, возможность использовать в разных комбинациях. Усложнением для работы является ее комплексный характер.

> Сейчас все чаще используется облачная архитектура. В ней клиентская часть представлена веб-браузером или приложением, серверная находится в облаке.

--------

[2.4.1 Architectural Dimensions: Application, Network, Infrastructure Theme](./2.4.1%20ArchitecturalDimensions(Application,%20Network,%20Infrastructure).md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [2.4.3 Web App Patterns Theme](./2.4.3%20WebAppPatterns.md)