Top.Mail.Ru

Клиент-серверная архитектура простыми словами

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

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

Сервер принимает запрос, обрабатывает его и отправляет клиенту (браузеру) ответ с нужной информацией.

Компания Software Cats уже более пяти лет занимается аутстафом и аутсорсом по направлениям

Если у вас есть ИТ-проблема, оставьте ваши контакты, и мы поможем составить план ее решения.

Например, если вы запросили softwarecats.dev, то сервер вернет вам html-код главной страницы сайта SoftwareCats, а браузер (клиент) отрисует ее.

Браузер

Postman

В клиент-серверной архитектуре используется три компонента: клиент, сервер и база данных.
Клиент
Клиент — это программа, которая посылает запросы к серверу. Это может быть не только браузер, но и другая программа, например, Postman.

Если большая часть обработки логики и данных осуществляется на стороне клиента, а сервер является простым хранилищем информации, в таком случае клиент называется “толстым”.
Преимущества

Возможность работы в оффлайн режиме.


Хорошая скорость обработки данных.

Недостатки

Нужны большие аппаратные мощности.


Трудоемкая настройка.


Проблемы в обеспечении безопасности данных.

Если обработка логики и данных осуществляется на стороне сервера, а клиент используется только для отображения, такой клиент называется “тонким”.
Преимущества

Низкие требования к аппаратным мощностям.


Минимален риск возникновения неисправностей.

Недостатки

Нет возможности работы без подключения к Интернету.


Снижение производительности, в случае высоких нагрузок на сервер.

Сервер
Сервер — компьютер, на котором запущено сайт/приложение. Когда мы вводим URL сайта в адресную строку браузера и нажимаем Enter, мы обращаемся к серверу, на котором находится сайт.
База данных
База данных (БД) — это организованное хранилище данных, предназначенное для удобного хранения, управления и обработки информации. Она позволяет структурировать данные, обеспечивать их целостность, быстро выполнять поиск, фильтрацию и анализ. Современные базы данных могут быть реляционными (на основе таблиц и SQL-запросов) или нереляционными (NoSQL, например, документы, графы, ключ-значение).

Типы клиент-серверной архитектуры

Если сервер выполняет функции и приложения и базы данных, то такая архитектура называется двухуровневой.
Если сервер выполняет только функции приложения (в таком случае его называют сервер приложений) и на нем сосредоточена бо́льшая часть бизнес-логики, а база данных вынесена на отдельный сервер (сервер баз данных), то такую архитектуру называют трехуровневой.
Если обработка данных вынесена на несколько отдельных серверов, то есть приложение находится не на одном, а сразу на нескольких серверах (кластер серверов), то такая архитектура называется многоуровневой. Информация на таких серверах дублируется и если один сервер вышел из строя, то его подменяет другой. Чтобы определить, на какой сервер послать запрос, используется балансировщик — сервис, который пропускает все запросы через себя и следит за нагрузкой на сервера.

Способы “общения” программ

API (Application Programming Interface)
API (Application Programming Interface) — это набор инструментов, который позволяет разным программам общаться друг с другом т.е. своего рода посредник, который помогает одной программе запросить информацию или выполнить действие в другой программе.

Делается это не просто так, а в соответствии с определенным контрактом. Контракт в контексте API — это набор правил, которые определяют, как две системы будут взаимодействовать друг с другом. Контракт описывает, какие данные должны быть отправлены, в каком формате они должны быть представлены, а также какие ответы будут получены.

Контракт API включает в себя несколько важных частей:

  1. Методы: Определяют, какие операции можно выполнить через API. Например, с помощью метода GET можно получить данные, а с помощью POST — отправить их. Эти методы прописаны в контракте, и все, кто использует API, должны следовать этим правилам.
  2. Параметры: В контракте указано, какие данные необходимо отправить при запросе. Например, если нужно получить информацию о погоде, то необходимо указать город. Это обязательные параметры, которые должны быть в запросе.
  3. Формат данных: API часто использует стандарты для обмена данными, такие как JSON или XML. Контракт описывает, как данные должны быть представлены, чтобы система смогла их правильно интерпретировать.
  4. Ответы: Контракт также определяет, какой формат и какие данные будет содержать ответ на запрос. Напрмер, если мы хотим получить информацию о погоде, то в ответе ожидаем увидеть температуру, влажность и атмосферное давление.
  5. Ошибки: В контракте указано, что произойдет, если запрос выполнен неправильно или если сервер не может обработать запрос. Например, может быть возвращен код ошибки (например, 404, если не найден ресурс, или 500, если сервер сломался), а также описание ошибки.

В этой статье мы будем говорить о RESTful API.

REST (Representational State Transfer) — это стиль архитектуры для создания веб-сервисов. RESTful API использует HTTP-протокол для обмена данными, и работает по принципу "клиент-сервер", где клиент посылает запросы (например, GET, POST, PUT, DELETE) к серверу, который возвращает нужные данные. REST API обычно работает с форматами JSON, предоставляя простой и удобный способ для общения между приложениями через Интернет.
Существуют и другие способы обмена данными между клиентом и сервером.

SOAP — это тоже способ общения программ, но более старый и сложный. В отличие от REST, SOAP использует XML для передачи данных и может поддерживать более сложные сценарии, например, безопасность и транзакции.

GraphQL — это гибкий и современный способ общения между клиентом и сервером, разработанный Facebook.

gRPC (Google Remote Procedure Call) — это фреймворк для удаленного вызова процедур, который используется для обмена сообщениями между клиентом и сервером.

WebSocket — это протокол для двусторонней связи между клиентом и сервером в реальном времени. Он отличается от HTTP тем, что поддерживает постоянное соединение, что позволяет серверу отправлять данные клиенту по мере их появления без необходимости клиента постоянно запрашивать их.

И другие, каждый из которых имеет свои особенности и области применения, и выбор подходящего зависит от конкретных требований проекта.
HTTP и HTTPS
Мы уже говорили о том, что RESTful API использует HTTP-протокол для обмена данными между веб-браузером (или другим клиентом) и веб-сервером.

HTTP (Hypertext Transfer Protocol) — это стандартный протокол для передачи данных через Интернет. Когда ты открываешь сайт в браузере, например, https://softwarecats.dev/, браузер использует HTTP для того, чтобы отправить запрос на сервер и получить веб-страницу.

HTTPS (Hypertext Transfer Protocol Secure) — это защищенная версия HTTP. Он добавляет шифрование данных с помощью SSL/TLS, чтобы обеспечить безопасность общения между клиентом и сервером.

Как это работает.

HTTP. Когда ты вводишь URL в адресную строку браузера, браузер отправляет запрос на сервер, который хранит сайт. Сервер отправляет обратно HTML-страницу, изображения, стили и другие файлы, которые ты видишь в браузере.

HTTPS. Когда ты заходишь на сайт с HTTPS, браузер устанавливает защищенное соединение с сервером с помощью шифрования. Это значит, что все данные, которые передаются между твоим браузером и сервером, защищены и не могут быть легко перехвачены или прочитаны кем-то другим. SSL (Secure Sockets Layer) и TLS (Transport Layer Security) — это протоколы, которые используются для шифрования данных и защиты связи.

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

DNS-запросы и поиск IP-адреса:

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

Доменные имена придуманы исключительно для того, чтобы людям было удобнее их запоминать. Машины же оперируют не доменными именами, а IP-адресами.

IP-адрес (Internet Protocol address) — уникальный числовой идентификатор устройства в сети. И именно IP-адреса используется в Интернете для связи между различными устройствами.

IP-адрес — это строка чисел, разделенных точками; набор из четырех чисел, где каждое число принадлежит интервалу от 0 до 255. Таким образом, полный диапазон IP-адресации — это адреса от 0.0.0.0 до 255.255.255.255.
DNS
Для соотнесения IP-адресов устройств в сети и более удобных для человеческого восприятия доменных имен существует система доменных имен — DNS (Domain Name System), которая является одной из фундаментальных технологий современной интернет-среды. Она представляет собой распределенную систему хранения и обработки информации о доменных зонах.

Проще говоря, это сервера (DNS-сервера), на которых хранятся IP-адреса сайтов.
Отдельно взятый DNS-сервер не может хранить вообще всю информацию об именах сайтов и связанных с ними IP-адресами. Поэтому, сначала запрос отправляется на локальный DNS-сервер интернет-провайдера, который, в свою очередь взаимодействует с другими DNS-серверами.
Помимо DNS-серверов, IP-адреса можно хранить локально (например, в файле hosts), а порядок поиска задать в конфигурационном файле.

Например вы ввели в адресной строке своего браузера https://softwarecats.dev/ и нажали Enter:

1. Браузер “понял”, что это доменное имя.
2. Браузер ищет на локальном компьютере файл hosts.
3. Если в файле hosts имеется запись для введенного доменного имени, то браузер формирует запрос к серверу с этим IP-адресом.
4. Если записи нет, то браузер, через специальную программу — resolver, обращается к локальному DNS-серверу интернет-провайдера*.
* IP-адрес локального DNS-сервера прописывается в настройках сетевого подключения при настройке сети.
5. Локальный DNS-сервер ничего не знает о данном IP-адресе и посылает запрос одному из корневых серверов. Корневой сервер перенаправляет запрос серверу первого уровня, а тот отправляет запрос серверу второго уровня. Процесс продолжается до тех пор, пока совпадение не будет найдено. То есть, ”.” -> “.ru” -> “https://softwarecats.dev/ ”.
6. Resolver, получив нужный IP-адрес, возвращает его браузеру.
7. Браузер формирует и отправляет запрос к серверу с этим IP-адресом.
Кэширование
Кэширование — это сохранение ранее полученных данных.

Кэш — это временная база данных, которая содержит записи обо всех последних посещениях сайтов.

Основная функция кэширования — ускорение процесса извлечения данных. Оно избавляет от необходимости повторно обращаться к серверу для получения одних и тех же данных.

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

При получении IP-адреса, клиент может оперировать:

  1. Кэшем локального DNS-сервер (DNS-сервер вашего интернет-провайдера), который однажды “узнав” IP-адрес сайта в течение некоторого времени хранит его.
  2. Локальным кэшем компьютера. Кэширование на локальном компьютере обеспечивает быстрый доступ к любому домену и снижает нагрузку на DNS-сервер т.к. уменьшается количество обращений к нему.

По сути, запоминаются ответы на последние пришедшие запросы и когда приходит аналогичный запрос просто высылается тот же самый ответ. То есть если открыть в браузере сайт https://softwarecats.dev/ первый раз, то присланный DNS сервером IP запомнится и будет некторое время использоваться при повторных запросах https://softwarecats.dev/ без обращения к DNS серверу.

Отправка HTTP-запроса и получение ответа:

Как браузер отправляет запросы к серверу и обрабатывает полученные ответы.
Когда клиент (например, браузер) получает IP-адрес нужного сервера, он формирует HTTP-запрос и отправляет его на сервер. HTTP-запрос состоит из нескольких компонентов:

  • Метод запроса — определяет тип операции, которую нужно выполнить (например, получение данных, отправка данных и т. д.).
  • URL — адрес ресурса, к которому выполняется запрос.
  • Заголовки (Headers) — дополнительная информация, такая как тип передаваемых данных, данные аутентификации и кодировка.
  • Тело запроса (Body) — передаваемая информация (используется не во всех типах запросов).
Основные виды HTTP-запросов
HTTP поддерживает несколько методов, но наиболее часто используются:
  • GET — запрашивает данные с сервера (например, загрузка веб-страницы).
  • POST — отправляет данные на сервер для обработки (например, отправка формы авторизации).
  • PUT — обновляет существующие данные на сервере.
  • DELETE — удаляет ресурс на сервере.
  • PATCH — частично обновляет ресурс.
  • HEAD — запрашивает только заголовки ответа без тела (используется для проверки доступности ресурса).
Например, если пользователь вводит в браузере https://softwarecats.dev/, браузер отправляет GET-запрос к серверу по этому адресу. Если же пользователь заполняет форму на сайте и отправляет ее, браузер отправляет POST-запрос с введенными данными.

После обработки запроса сервер формирует и отправляет клиенту HTTP-ответ. Ответ содержит:
  • Код состояния (Status Code) — числовой код, указывающий результат обработки запроса.
  • Заголовки (Headers) — метаданные, такие как тип контента, кодировка и время кеширования.
  • Тело ответа (Body) — данные, которые запрашивал клиент (HTML-страница, JSON, изображение и т. д.).
Основные коды состояния HTTP
Коды состояния состоят из трех цифр и делятся на пять классов, каждый код имеет свое описание, которое помогает понять возникла ли какая-то проблема при передаче данных и если да, то какая.

  • 1xx (Информационные) — запрос получен, обработка продолжается.
Например, 100 Continue — сервер получил начальную часть запроса и ждет оставшуюся.

  • 2xx (Успешные) — запрос успешно обработан.
Например, 200 OK — запрос выполнен успешно, сервер передает запрашиваемые данные, 201 Created — ресурс успешно создан.

  • 3xx (Перенаправления) — клиенту нужно выполнить дополнительное действие.
Например, 301 Moved Permanently — запрашиваемый ресурс навсегда перемещен, 302 Found — ресурс временно перемещен.

  • 4xx (Ошибки клиента) — проблема на стороне клиента.
Например, 400 Bad Request — запрос некорректен., 401 Unauthorized — требуется авторизация, 403 Forbidden — доступ запрещен, 404 Not Found — ресурс не найден.

  • 5xx (Ошибки сервера) — сервер не смог обработать запрос.
Например, 500 Internal Server Error — внутренняя ошибка сервера, 502 Bad Gateway — сервер получил недопустимый ответ от другого сервера, 503 Service Unavailable — сервер временно недоступен (например, из-за перегрузки).
Форматы данных в ответе
Ответ сервера может содержать данные в различных форматах. Наиболее распространенные:

  • HTML — используется для отображения веб-страниц.
  • JSON (JavaScript Object Notation) — легковесный формат передачи данных, удобный для API.
  • XML (Extensible Markup Language) — старый формат передачи данных, используется в некоторых системах.
  • Текстовые файлы (CSV, TXT) — передача табличных или текстовых данных.
  • Медиафайлы (изображения, видео, аудио) — передаются в двоичном формате.
Обработка HTTP-ответа
Когда клиент, например браузер, получает HTTP-ответ от сервера, он анализирует его заголовки и тело. Первым делом он проверяет код состояния. Если код указывает на успешное выполнение запроса (2xx), браузер обрабатывает содержимое ответа в зависимости от его типа. Например:

  • Если это HTML, браузер рендерит страницу.
  • Если это JSON, данные могут быть обработаны скриптами на странице.
  • Если это изображение, оно отображается в интерфейсе.
  • Если это перенаправление (3xx), браузер автоматически запрашивает новый адрес.
  • Если это ошибка (4xx или 5xx), пользователь может увидеть сообщение об ошибке или страницу с описанием проблемы.
Кэширование в HTTP-запросах
Чтобы ускорить загрузку страниц и снизить нагрузку на сервер, браузеры используют кеширование. Сервер может передавать специальные заголовки, управляющие хранением данных в кеше, такие как:

  • Cache-Control — определяет, как долго и где можно хранить ответ.
  • Expires — указывает время, до которого ответ считается актуальным.
  • ETag — уникальный идентификатор версии ресурса, который позволяет избежать загрузки неизмененных данных.
  • Last-Modified — дата последнего изменения ресурса, помогает проверить актуальность данных.

Если ресурс закеширован, браузер может загружать его из памяти без повторного запроса к серверу, что значительно ускоряет работу.

Заключение
Клиент-серверная архитектура — это фундаментальный принцип работы современных компьютерных систем, обеспечивающий взаимодействие между устройствами и приложениями. Мы разобрали основные компоненты архитектуры, способы обмена данными и принципы работы сетевых запросов.
Однако важно понимать, что клиент-серверная модель постоянно развивается. Сегодня широко применяются облачные вычисления, микросервисная архитектура и серверы без состояния (stateless), что позволяет распределять нагрузку, повышать отказоустойчивость и масштабируемость систем.

Наша команда уже более пяти лет занимается реализацией проектов на Java и усилением команд по направлениям

За время существования компании, мы принимали участие в работе над более чем 100 проектами различного объема и длительности.

Если перед вами стоят вызовы, при которых вам может пригодится наша экспертиза, просто напишите нам,

Мы договоримся с вами об онлайн-встрече, чтобы подробнее обсудить ваш проект и вашу проблему.

Еще почитать по теме:

    Обсудить проект_
    Если у вас есть ИТ-проблема, оставьте ваши контакты, и мы поможем составить план ее решения. Обещаем не слать спам.
    Нажимая, я говорю «Да»
    политике конфиденциальности
    hello@softwarecats.dev
    Новосибирск, ул. Демакова
    23/5, оф.308
    Контакты_

    Выполненные проекты:

      Руководитель отдела тестирования Software Cats