Клієнт – серверна архітектура (Client-Server Architecture)
Last updated
Last updated
Клієнт - сервер - обчислювальна чи мережева архітектура, у якій завдання чи мережне навантаження розподілені між постачальниками послуг, званими серверами, та замовниками послуг, званими клієнтами. Фактично клієнт та сервер - це програмне забезпечення. Зазвичай ці програми розташовані на різних обчислювальних машинах і взаємодіють між собою через обчислювальну мережу за допомогою мережевих протоколів, але можуть бути розташовані також і на одній машині. Програми-сервери очікують від клієнтських програм запити та надають їм свої ресурси у вигляді:
даних (наприклад, завантаження файлів за допомогою HTTP, FTP, BitTorrent, потокове мультимедіа або робота з базами даних);
сервісних функцій (наприклад, робота з електронною поштою, спілкування через системи миттєвого обміну повідомленнями або перегляд веб-сторінок у всесвітньому павутинні).
Оскільки одна програма-сервер може виконувати запити від багатьох програм-клієнтів, її розміщують на спеціально виділеній обчислювальній машині, налаштованій особливим чином, як правило, спільно з іншими програмами-серверами, тому продуктивність цієї машини повинна бути високою. Через особливу роль такої машини в мережі, специфіки її обладнання та програмного забезпечення її також називають сервером, а машини, що виконують клієнтські програми, відповідно, клієнтами.
Архітектуру «клієнт-сервер» прийнято розділяти на три класи: одно-, дво- та трирівневу. Однак, не можна сказати, що у питанні про такий поділ у співтоваристві ІТ-фахівців існує повний консенсус. Багато хто називає однорівневу архітектуру дворівневою і навпаки, те саме можна сказати про співвідношення дво- і трирівневої архітектури.
Однорівнева архітектура (1-Tier)
Однорівнева архітектура "клієнт-сервер" (1-Tier) - така, де всі прикладні програми розосереджені по робочих станціях, які звертаються до спільного сервера баз даних або загального файлового сервера. Жодних прикладних програм сервер при цьому не виконує, лише надає дані.
В цілому, така архітектура дуже надійна, однак, їй складно керувати, оскільки в кожній робочій станції дані будуть присутні у різних варіантах. Тому виникає проблема їхньої синхронізації на окремих машинах. Загалом, як можна бачити з малюнка, у цій архітектурі проглядається ще один рівень – бази даних, що дає привід у багатьох випадках називати її дворівневою.
Дворівнева архітектура (2-Tier)
До дворівневої архітектури клієнт-сервер слід відносити таку, в якій прикладні програми зосереджені на сервері додатків (Application Server), наприклад, сервері 1С або сервері CRM, а в робочих станціях знаходяться програми-клієнти, які надають для користувачів інтерфейс для роботи з додатками на загальному сервері.
Така архітектура є найбільш логічною для архітектури «клієнт-сервер». У ній, проте, можна назвати два варіанта. Коли загальні дані зберігаються на сервері, а логіка їх обробки та бізнес-дані зберігаються на клієнтській машині, то така архітектура має назву "fat client thin server" (товстий клієнт, тонкий сервер). Коли дані, а й логіка їх обробки та бізнес-дані зберігаються на сервері, це називається “thin client fat server” (тонкий клієнт, товстий сервер). Така архітектура стала прообразом хмарних обчислень (Cloud Computing).
Трирівнева архітектура (3-Tier)
У трирівневій архітектурі сервер баз даних, файловий сервер та інші є окремим рівнем, результати роботи якого використовує сервер додатків. Логіка даних та бізнес-логіка знаходяться на сервері додатків. Всі звернення клієнтів до бази даних відбуваються через проміжне програмне забезпечення (middleware), яке знаходиться на сервері програм. Внаслідок цього, підвищується гнучкість роботи та продуктивність.
Багаторівнева архітектура (N-Tier)
В окремий клас архітектури «клієнт-сервер» можна винести багаторівневу архітектуру, де кілька серверів додатків використовують результати роботи один одного, а також дані від різних серверів баз даних, файлових серверів та інших видів серверів.
По суті, попередній варіант, трирівнева архітектура - не більше ніж окремий випадок багаторівневої архітектури.
Перевагою багаторівневої архітектури є гнучкість надання послуг, які можуть бути комбінацією роботи різних додатків серверів різних рівнів та елементів цих додатків.
Очевидним недоліком є складність, багатокомпонентність такої архітектури.
Характеристики архітектури «клієнт-сервер»
Асиметричність протоколів. Між клієнтами та сервером існують стосунки «один до багатьох». Ініціатором діалогу із сервером зазвичай є клієнт.
Інкапсуляція послуг. Після отримання запиту на послугу від клієнта сервер вирішує, як повинна бути виконана дана послуга. Модифікація ("апгрейд") сервера може проводитися без впливу на роботу клієнтів, оскільки це не впливає на опублікований інтерфейс взаємодії між ними. Іншими словами, максимум, що при цьому може відчути користувач - незначна затримка відгуку сервера протягом невеликого часу апгрейду.
Цілісність. Програми та загальні дані для сервера управляються централізовано, що знижує вартість обслуговування та захищає цілісність даних. У той же час дані клієнтів залишаються персоніфікованими і незалежними.
Місцева прозорість. Сервер - це програмний процес, який може виконуватися на тій самій машині, що і клієнт, або на іншій машині, що підключена до мережі. Програмне забезпечення клієнт-сервер зазвичай приховує розташування сервера від клієнтів, перенаправляючи запит на послуги через мережу.
Обмін на основі повідомлень. Клієнти та сервер є нежорстко пов'язаними («loosely-coupled») процесами, які обмінюються повідомленнями: запитами на послуги та відповідями на них.
Модульний дизайн, здатний до розширення. Модульний дизайн програмної платформи «клієнт-сервер» надає їй стійкості до відмов, тобто відмова в якомусь модулі не викликає відмови всієї програми. У такій системі один або більше серверів можуть відмовити без зупинки всієї системи в цілому, до тих пір, поки послуги сервера, що відмовив, можуть бути надані з резервного сервера. Інша перевага модульності в тому, що програма «клієнт-сервер» може автоматично реагувати на підвищення або зниження навантаження на систему шляхом додавання або відключення послуг або серверів.
Незалежність від платформи. Ідеальна програма «клієнт-сервер» не залежить від платформ обладнання або операційної системи. Клієнти та сервери можуть розгортатися на різних апаратних платформах та різних операційних системах.
Масштабованість. Системи «клієнт-сервер» можуть масштабуватися як горизонтально (за кількістю серверів та клієнтів), так і вертикально (за продуктивністю та спектром послуг).
Розподіл функціоналу. Система «клієнт-сервер» - це співвідношення між процесами, що працюють на одній або різних машинах. Сервер – це процес надання послуг. Клієнт – це споживач послуг.
Загальне використання ресурсів. Один сервер може надавати послуги безлічі клієнтів одночасно, і регулювати їх доступ до спільно використовуваних ресурсів.
Практичні застосування архітектури «клієнт-сервер»
Архітектура «клієнт-сервер» - один із основних принципів роботи мережі Інтернет. Будь-який веб-сайт, або додаток до Інтернету працює на сервері, а його користувачі є клієнтами. Соціальні мережі (Фейсбук, ВК та ін.), сайти електронної комерції (Amazon, Озон та ін.), мобільні додатки (Instagram і т.д.), пристрої Інтернету речей (розумні колонки або смарт-годинники) працюють на основі клієнт- серверної архітектури.
Хорошим прикладом роботи системи клієнт-сервер є автомобільний навігатор. Програма навігації на сервері збирає дані з багатьох смартфонів користувачів, на яких встановлені клієнти програми. Крім того, додаток навігації використовує ще й дані з сервера бази даних - геоінформаційної системи, який надає дані, наприклад, про поточні ремонти доріг, про появу нових доріг та ін. смартфони користувачів у вигляді інформації про середню швидкість руху по тій чи іншій ділянці маршруту.
Практично будь-яка корпоративна мережа чи ІТ-система підприємства, як правило, будується за архітектурою «клієнт-сервер». У невеликих мережах (3-5 комп'ютерів у компанії) функції сервера може виконувати один із робочих комп'ютерів. Якщо кількість машин в організації більше 10, то краще зробити виділений сервер (поштовий сервер, додатків, баз даних тощо), який займатиметься обслуговуванням клієнтів - комп'ютерів та телефонів співробітників організації.
У домашніх мережах архітектура клієнт-сервер теж використовується досить часто. Наприклад, у домашню мережу можуть бути об'єднані комп'ютери членів сім'ї, один з яких виконує функції сервера. До домашньої мережі також можуть бути включені такі пристрої, як розумні колонки, розумні домашні пристрої (пилососи-роботи, фотоапарати, DVD-плеєри тощо), а також «розумні» лічильники (вода, електрика) тощо. Тоді в системі керування сервера будуть видно всі параметри, дані та медіа файли (музика, відео, фото), а також «розумні пристрої».
В даний час можна зустріти термін Serverless Architecture, т.зв. "Безсерверна архітектура". Однак, по суті, це процес отримання функцій сервера у вигляді хмарної послуги. Тобто, сервери у хмарі теж є, але для кінцевого користувача вони не видно, і він отримує їх сервіси у вигляді абстрактної функції як послуги FaaS (Function as a Service).
Архітектура «клієнт-сервер» є основою більшості корпоративних мереж і бере початок від перших обчислювальних машин, т.зв. "Мейнфреймів".
Примітка. Можна зустріти такі поняття:
"Товстий" клієнт: на сервері реалізовані головним чином функції доступу до баз даних, а основні прикладні обчислення виконуються на стороні клієнта;
"Тонкий клієнт": на сервері виконується основна частина прикладної обробки даних, а на клієнтські робочі станції передаються вже результати обробки даних для перегляду та аналізу користувачем з можливістю їх подальшої обробки (у мінімальному обсязі).
"Гарячий/теплий" клієнт: з кешем та куками;
"Холодний" клієнт: чистий, без чи очищений від кук та кешу.
Статичні та динамічні сайти
Статичний сайт - це той, який повертає той же жорсткий кодований контент із сервера щоразу, коли запитується конкретний ресурс. Наприклад, якщо у вас є сторінка про товар у /static/myproduct1.html, ця ж сторінка буде повернена кожному користувачеві. Якщо ви додасте ще один подібний товар на свій сайт, вам потрібно буде додати ще одну сторінку (наприклад, myproduct2.html) і таке інше. Це може стати справді неефективним – що відбувається, коли ви потрапляєте на тисячі сторінок товарів? Ви повторювали б багато коду на кожній сторінці (основний шаблон сторінки, структуру і т. д.), і якби ви захотіли змінити щось у структурі сторінки - наприклад, додати новий розділ «пов'язані товари» - тоді вам доведеться міняти кожну сторінку окремо.
На замітку: Статичні сайти чудові, коли у вас невелика кількість сторінок і ви хочете надіслати той самий контент кожному користувачеві. Однак, їх обслуговування може вимагати значних витрат у міру збільшення кількості сторінок.
Коли користувач хоче перейти на сторінку, браузер відправляє HTTP-запит GET із зазначенням URL-адреси його HTML-сторінки. Сервер витягує запитаний документ зі своєї файлової системи і повертає відповідь HTTP, що містить документ і код стану HTTP Response status code 200 OK (успіх). Сервер може повернути інший код стану, наприклад, 404 Not Found, якщо файл відсутній на сервері або 301 Moved Permanently, якщо файл існує, але був переміщений в інше місце.
Серверу для статичного сайту потрібно буде лише обробляти GET-запити, тому що сервер не зберігає жодних даних, що модифікуються. Він також не змінює свої відповіді на основі даних HTTP-запиту (наприклад, URL-адрес або файлів cookie).
Розуміння того, як статичні сайти працюють, проте корисно при вивченні програмування на стороні сервера, оскільки динамічні сайти так само обробляють запити для статичних файлів (CSS, JavaScript, статичні зображення і т. д.).
Динамічний сайт - це той, який може генерувати та повертати контент на основі конкретної URL-адреси запиту та даних (а не завжди повертати той самий жорсткий код для певної URL-адреси). Використовуючи приклад сайту товару, сервер зберігатиме «дані» товару в базі даних, а не окремі HTML-файли. При отриманні GET-запиту товару сервер визначає ідентифікатор товару, витягує дані з бази даних і потім створює HTML-сторінку для відповіді, вставляючи дані в HTML-шаблон. Це має великі переваги перед статичним сайтом:
Використання бази даних дозволяє ефективно зберігати інформацію про товар за допомогою легко розширюваного, змінного та доступного для пошуку способу.
Використання HTML-шаблонів дозволяє легко змінити структуру HTML, тому що це потрібно робити тільки в одному місці, в одному шаблоні, а не через потенційно тисячі статичних сторінок.
Анатомія динамічного запиту : щоб не віддалятися від практики, ми будемо використовувати контекст веб-сайту менеджера спортивної команди, де тренер може вибрати ім'я своєї команди та розмір команди в HTML-формі та повернутися до пропонованого «кращого складу» для наступної гри.
На наведеній нижче діаграмі показані основні елементи веб-сайту "team coach", а також пронумеровані ярлики для послідовності операцій, коли тренер звертається до списку "кращих команд". Частинами сайту, які роблять його динамічним, є веб-додаток (так ми будемо посилатися на серверний код, що обробляє HTTP-запити та повертають HTTP-відповіді), база даних, яка містить інформацію про гравців, команди, тренерів та їх стосунки, та HTML -шаблони.
Після того, як тренер відправить форму з ім'ям команди та кількістю гравців, послідовність операцій буде наступною:
Веб-браузер відправить HTTP-запит GET на сервер з використанням базової URL-адреси ресурсу (/best) та кодування номера команди та гравця у формі URL-параметрів (наприклад, /best?team=my_team_name&show=11) або як частина URL-адреси (наприклад, /best/my_team_name/11/). Запит GET використовується, тому що йдеться лише про запит вибірки даних (а не про їх зміну).
Веб-сервер визначає, що запит є «динамічний» і пересилає його до веб-додатку для обробки (веб-сервер визначає, як обробляти різні URL-адреси на основі правил зіставлення шаблонів, визначених у його конфігурації).
Веб-додаток визначає, що ціль запиту полягає в тому, щоб отримати «кращий список команд» на основі URL (/best/) і дізнатися ім'я команди та кількість гравців з URL-адреси. Потім веб-додаток отримує необхідну інформацію з бази даних (використовуючи додаткові «внутрішні» параметри, щоб визначити, які гравці є «найкращими», і, можливо, визначаючи особистість зареєстрованого тренера з файлу cookie на стороні клієнта).
Веб-додаток динамічно створює HTML-сторінку, поміщаючи дані (з бази даних) заповнювачі всередині HTML-шаблону.
Веб-додаток повертає згенерований HTML у веб-браузер (через веб-сервер) разом із кодом стану HTTP 200 («успіх»). Якщо що-небудь перешкоджає поверненню HTML, веб-додаток поверне інший код, наприклад, 404, щоб вказати, що команда не існує.
Потім веб-браузер почне обробляти повернутий HTML, надіславши окремі запити, щоб отримати будь-які інші файли CSS або JavaScript, на які він посилається (див. крок 7).
Веб-сервер завантажує статичні файли з файлової системи і повертає їх безпосередньо в браузер (знову ж таки, правильна обробка файлів заснована на правилах конфігурації та зіставленні шаблонів URL).
Операція з оновлення запису в базі даних буде оброблятися аналогічним чином, за винятком того, що, як і будь-яке оновлення бази даних, HTTP-запит із браузера має бути закодований як запит POST.
Виконання іншої роботи : завдання веб-програми - отримувати HTTP-запити та повертати HTTP-відповіді. Хоча взаємодія з базою даних для отримання або оновлення інформації є дуже поширеним завданням, код може робити інші речі одночасно або взагалі не взаємодіяти з базою даних.
Хорошим прикладом додаткового завдання, яке може виконувати веб-програма, є надсилання електронної пошти користувачам для підтвердження їх реєстрації на сайті. Сайт також може виконувати протоколювання чи інші операції.
Повернення чогось іншого, крім HTML : серверний код сайту може повертати не тільки HTML-фрагменти та файли у відповіді. Він може динамічно створювати та повертати інші типи файлів (текст, PDF, CSV тощо) або навіть дані (JSON, XML тощо).
Ідея повернути дані у веб-браузер, щоб він міг динамічно оновлювати свій власний контент (AJAX), існує досить давно. Нещодавно «Односторінкові програми» стали популярними, де весь сайт написаний з одним HTML-файлом, який динамічно оновлюється в міру необхідності. Веб-сайти, створені з використанням таких програм, переносять великі обчислювальні витрати з сервера на веб-браузер і призводять до того, що веб-сайти, ведуть себе більше як нативні програми (дуже чуйні і т. д.).
Джерела:
Дод. матеріал: