SA: Webservices and achitecture 1
- Трехуровневая архитектура
- Отличие ФП от ООП
- Толстый и тонкий клиент
- Свойства микросервисной архитектуры
- Пути оптимизации производительности нагруженной системы
- Веб-сервисы
- Открытый и закрытый API
- Какие функции у API
- Подходы и протоколы для имплементации API
- Принципы REST
- Rest vs SOAP преимущества и недостатки
- Как данные веб-сервисов транспортируются
- JSON-schema и XML-schema
- Методы HTTP протокола
- HTTP ошибки и их коды
- HTTP vs HTTPS
- REST API Auth methods
- Разница между SOA и микросервисами
- Отличие шины ESB от брокера
- Отличие Monolith от микросервиса
Трехуровневая архитектура
- это распространенный архитектурный шаблон в разработке программного обеспечения. Она делит приложение на три отдельных уровня или слоя, каждый из которых выполняет определенную функцию. Вот краткое описание каждого из них:
- Уровень представления (пользовательский интерфейс):
- Уровень представления - это верхний слой, который непосредственно взаимодействует с пользователем.
- Он отвечает за обработку ввода пользователя, отображение информации и предоставление удобного интерфейса.
- В веб-приложениях этот уровень часто включает веб-страницы, пользовательские интерфейсы и клиентский код (HTML, CSS, JavaScript).
- Уровень приложения (логический уровень):
- Уровень приложения, также известный как логический уровень или уровень бизнес-логики, содержит основные функции приложения.
- Он обрабатывает запросы пользователя, выполняет вычисления и применяет бизнес-правила.
- На этом уровне обычно находится серверный код, API и логика приложения, реализованная на языках программирования, таких как Python.
- Уровень данных (хранение данных):
- Уровень данных отвечает за управление и хранение данных, используемых приложением.
- Он включает в себя базы данных или другие системы хранения данных, в которых информация хранится, извлекается и управляется.
- Распространенными системами управления базами данных на этом уровне являются MySQL, PostgreSQL или NoSQL-базы данных, такие как MongoDB.
Трехуровневая архитектура разделяет задачи и способствует модульности, масштабируемости и удобству обслуживания в разработке программного обеспечения. Она позволяет вносить изменения в один уровень без влияния на другие, что упрощает обновление или замену конкретных компонентов приложения. Эта архитектура широко используется в веб-приложениях, где уровень представления работает в веб-браузерах, уровень приложения - на сервере, а уровень данных управляет базой данных на бекэнде.
Отличие ФП от ООП
Функциональное программирование (ФП):
- Основная идея: Функциональное программирование ориентировано на работу с функциями как основными строительными блоками программы. Программы строятся путем комбинирования и применения функций к данным.
- Состояние и изменяемость: ФП поддерживает неизменяемость данных и избегает изменяемого состояния. Это означает, что данные, как только они созданы, не могут быть изменены, и операции над ними создают новые данные.
- Объекты и классы: ФП не использует объекты и классы как в ООП. Вместо этого, данные обычно представлены как структуры данных, а функции оперируют ими.
- Составление программ: В ФП программы составляются путем создания и композиции функций. Операции выполняются последовательно, и результаты передаются от одной функции к другой.
Объектно-ориентированное программирование (ООП):
- Основная идея: ООП ориентировано на моделирование реального мира с помощью объектов, которые являются экземплярами классов. Каждый объект содержит данные (атрибуты) и методы (функции), которые могут работать с этими данными.
- Состояние и изменяемость: В ООП данные могут изменяться через методы объектов. ООП подразумевает изменяемость состояния объектов.
- Объекты и классы: ООП центрировано вокруг объектов и классов. Классы определяют структуру объектов, включая их атрибуты и методы. Объекты создаются на основе классов.
- Составление программ: В ООП программы создаются путем создания классов и объектов, а затем вызова методов объектов для выполнения операций. Программы часто организованы вокруг взаимодействия между объектами.
Вкратце, основное различие между ФП и ООП заключается в подходе к программированию. ФП сосредотачивается на функциях и неизменяемых данных, тогда как ООП сосредотачивается на объектах, которые имеют состояние и методы для взаимодействия с данными. Выбор между ними зависит от конкретных задач и предпочтений разработчика.
Толстый и тонкий клиент
Толстый клиент (thick client):
- Локальная обработка: Толстый клиент выполняет значительную часть вычислений и обработки данных локально на клиентской стороне. Это означает, что большая часть бизнес-логики и интерфейса находятся на клиенте.
- Требует установки: Толстые клиенты обычно требуют установку на устройстве пользователя. Это может включать в себя установку приложения или программы, которая обеспечивает функциональность клиента.
- Высокие требования к ресурсам: Толстые клиенты часто требуют более мощных вычислительных ресурсов на стороне клиента, так как они обрабатывают данные и выполняют вычисления локально.
- Большая нагрузка на сеть: Толстые клиенты могут отправлять только необходимые данные на сервер, что снижает объем сетевого трафика. Однако они обычно требуют более широкой полосы пропускания для обеспечения своей работы.
- Минимальная локальная обработка: Тонкий клиент выполняет минимальные вычисления и обработку данных на стороне клиента. Большая часть бизнес-логики и обработки происходит на сервере.
- Не требует установки: Тонкие клиенты, как правило, не требуют установки на клиентском устройстве. Они могут работать через веб-браузер или специальные приложения для доступа к серверу.
- Низкие требования к ресурсам: Тонкие клиенты обычно требуют меньше вычислительных ресурсов на стороне клиента, так как большая часть обработки происходит на сервере.
- Меньшая нагрузка на сеть: Тонкие клиенты могут передавать больший объем данных на сервер для обработки, что может создавать более высокую нагрузку на сеть. Однако они не выполняют сложных вычислений на клиентской стороне.
В итоге, толстый клиент представляет собой более автономный и требовательный к ресурсам элемент архитектуры клиент-сервер, в то время как тонкий клиент обычно более легковесен и основывается на сервере для выполнения большей части работы. Выбор между ними зависит от конкретных требований проекта и бюджета.
Свойства микросервисной архитектуры
- Декомпозиция на микросервисы (Decomposition): Система разбивается на небольшие, независимые микросервисы, каждый из которых выполняет конкретную функцию или служит определенной бизнес-задаче.
- Независимость (Independence): Микросервисы являются независимыми компонентами, что означает, что изменения в одном сервисе не должны затрагивать другие. Это обеспечивает изолированность и гибкость.
- Самостоятельность (Autonomy): Каждый микросервис может быть разработан, развернут и масштабирован независимо от других сервисов. Это позволяет командам работать над сервисами параллельно.
- Ответственность за данные (Data Ownership): Каждый микросервис отвечает за свои данные и хранит их локально. Другие сервисы могут получать доступ к данным через API этого сервиса.
- Коммуникация через API (API Communication): Микросервисы общаются друг с другом через API, предоставляя возможность для стандартизированного взаимодействия. Обычно используется HTTP REST или gRPC.
- Отказоустойчивость (Resilience): Система должна быть спроектирована с учетом возможных сбоев в работе отдельных микросервисов. Возможность обработки ошибок и восстановления важна для стабильной работы.
- Масштабируемость (Scalability): Микросервисы могут масштабироваться независимо, что позволяет управлять ресурсами более эффективно и реагировать на изменяющуюся нагрузку.
- Контейнеризация (Containerization): Часто микросервисы разворачиваются в контейнерах, таких как Docker, что облегчает управление и развертывание.
- Управление конфигурацией (Configuration Management): Каждый микросервис имеет свои настройки и конфигурацию, которые могут управляться централизованно.
- Мониторинг и отчетность (Monitoring & Reporting): Надежное мониторинг, логирование и отчетность необходимы для отслеживания состояния микросервисов и быстрого реагирования на проблемы.
- DevOps-ориентированность (DevOps Focus): Архитектура микросервисов способствует практикам DevOps, где разработчики и операторы работают совместно над развертыванием и обслуживанием сервисов.
- Скорость разработки и развертывания (Agility): Микросервисы позволяют быстрее разрабатывать, тестировать и внедрять новые функции и обновления системы.
Эти свойства делают архитектуру микросервисов мощным инструментом для разработки и обслуживания сложных и гибких приложений.
Пути оптимизации производительности нагруженной системы
- Анализ и мониторинг: Начните с тщательного анализа текущей производительности системы. Используйте инструменты мониторинга и профилирования, чтобы выявить бутылочные горлыши и слабые места.
- Оптимизация кода: Проведите ревизию кода и выявите места, где можно улучшить производительность. Это может включать в себя оптимизацию запросов к базе данных, устранение утечек памяти, кеширование данных и улучшение алгоритмов.
- Масштабирование: Рассмотрите возможности масштабирования системы, чтобы справиться с высокой нагрузкой. Это может включать в себя вертикальное масштабирование (увеличение ресурсов на одной машине) или горизонтальное масштабирование (добавление новых серверов).
- Кеширование: Используйте кеширование для хранения часто запрашиваемых данных, чтобы уменьшить нагрузку на базу данных и ускорить ответы на запросы.
- Оптимизация базы данных: Оптимизируйте схему базы данных, индексы, и используйте оптимизированные запросы. Рассмотрите разделение базы данных для улучшения масштабируемости.
- Асинхронная обработка: Перенесите некоторые операции на фоновую обработку, чтобы основной процесс не блокировался. Это особенно полезно для операций, которые могут занимать много времени.
- Балансировка нагрузки: Используйте балансировщики нагрузки для равномерного распределения запросов между серверами и обеспечения отказоустойчивости.
- Оптимизация сети: Учтите задержки сети и минимизируйте количество запросов между клиентами и серверами. Используйте сжатие данных и передачу данных в нескольких потоках (multiplexing).
- Использование CDN: Если ваши веб-страницы содержат статические ресурсы (картинки, стили, скрипты), рассмотрите возможность использования Content Delivery Network (CDN) для ускорения доставки этих ресурсов.
- Тестирование нагрузки: Проведите тестирование нагрузки, чтобы определить, как система ведет себя при пиковых нагрузках, и оптимизируйте ее на основе результатов.
Веб-сервисы
Веб-сервисы (Web Services) представляют собой программные компоненты, которые позволяют различным приложениям и системам взаимодействовать между собой через Интернет. Они обеспечивают стандартизированный способ обмена данными и функциональностью между различными программами, независимо от того, на каком языке программирования они написаны или какой операционной системой они используются.
- A web service is any piece of software that makes itself available over the internet and uses a standardized XML messaging system. XML is used to encode all communications to a web service. For example, a client invokes a web service by sending an XML message, then waits for a corresponding XML response. As all communication is in XML, web services are not tied to any one operating system or programming language—Java can talk with Perl; Windows applications can talk with Unix applications.
To summarize, a complete web service is, therefore, any service that −
Для Чего Нужны Веб-Сервисы
- Интеграция Систем: Веб-сервисы позволяют различным системам и приложениям взаимодействовать друг с другом, даже если они были разработаны на разных языках программирования и работают на разных платформах.
- Обмен Данными: Они обеспечивают удобный способ обмена данными в форматах, таких как XML или JSON, что делает их идеальными для создания распределенных систем и приложений.
- Создание Распределенных Приложений: Веб-сервисы могут использоваться для построения сложных, распределенных приложений, где различные компоненты приложения могут быть развернуты на разных серверах или даже в разных географических регионах.
- Совместимость и Стандартизация: Веб-сервисы часто используют стандартизированные протоколы, такие как SOAP (Simple Object Access Protocol) и REST (Representational State Transfer), что обеспечивает их совместимость и возможность взаимодействия.
Примеры Использования Веб-Сервисов
- Платежные Системы: Интеграция онлайн-магазина с платежной системой через веб-сервисы для обработки транзакций.
- CRM-Системы: Обмен данными между CRM-системой и другими бизнес-приложениями для синхронизации информации о клиентах.
- Погодные Сервисы: Веб-сайты и приложения могут использовать веб-сервисы для получения актуальной информации о погоде от сторонних поставщиков.
- Социальные Сети: Интеграция функциональности социальных сетей в другие приложения через веб-сервисы для обмена информацией и взаимодействия пользователей.
Основные характеристики веб-сервисов:
- Протокол независимости: Веб-сервисы могут работать на разных платформах и операционных системах, так как они используют стандартные протоколы коммуникации, такие как HTTP, SOAP, REST и другие.
- Интероперабельность: Веб-сервисы позволяют разным системам обмениваться данными и выполнять операции, даже если они разработаны на разных языках программирования или используют разные технологии.
- Универсальный доступ: Веб-сервисы доступны через Интернет, что позволяет приложениям взаимодействовать удаленно и даже через глобальную сеть.
- Стандартизированные протоколы: Веб-сервисы используют стандартизированные протоколы и форматы данных, такие как XML и JSON, для обмена информацией.
- Сервисно-ориентированный подход: Веб-сервисы предоставляют функциональность, которая может быть использована другими приложениями как независимые сервисы.
- RESTful API для социальных сетей: Сервисы, такие как Facebook Graph API и Twitter API, предоставляют возможность взаимодействия с социальными сетями, отправки сообщений, получения данных о пользователях и многое другое через стандартизированный RESTful интерфейс.
- Платежные веб-сервисы: Платежные шлюзы, такие как PayPal и Stripe, предоставляют API для обработки онлайн-платежей и переводов денег между пользователями и магазинами.
- Геолокационные службы: Сервисы, такие как Google Maps API и Mapbox, предоставляют возможность интегрировать карты, геокодирование (преобразование адресов в координаты) и маршрутизацию в ваши веб-приложения.
- Погодные сервисы: Сервисы, предоставляющие информацию о погоде, такие как OpenWeatherMap API, позволяют получать текущую погоду и прогнозы для разных регионов.
- Сервисы аутентификации и авторизации: Популярные сервисы аутентификации, такие как OAuth и OpenID Connect, позволяют веб-приложениям аутентифицировать пользователей через сторонние платформы, такие как Google и Facebook.
- Электронная почта и мессенджеры: Сервисы, такие как SendGrid и Twilio, предоставляют API для отправки электронных писем и SMS-сообщений.
- Блокчейн-сервисы: Сервисы, такие как Ethereum и Bitcoin, предоставляют API для работы с блокчейн-технологией, создания и управления криптовалютными кошельками и выполнения смарт-контрактов.
- Облачные вычисления: Облачные платформы, такие как Amazon Web Services (AWS) и Microsoft Azure, предоставляют широкий спектр веб-сервисов для развертывания и управления инфраструктурой и приложениями в облаке.
Открытый и закрытый API
Открытый API (Public API) - это интерфейс программирования приложений, который предоставляется разработчикам для использования и интеграции с другими сервисами или приложениями. Он доступен для широкой публики и часто бесплатен, хотя может иметь ограничения по использованию.
Пример открытого API: API Википедии. Представь, ты разрабатываешь приложение или веб-сайт, который должен показывать информацию из Википедии по запросу пользователя. Используя открытый API Википедии, ты можешь запрашивать статьи, изображения и другую информацию прямо в своем приложении, не заходя на сайт Википедии.
Закрытый API (Private API) - это API, который используется внутри компании или организации для улучшения продуктов и сервисов. Этот тип API не предназначен для широкой публики, и доступ к нему строго ограничен.
Пример закрытого API: внутренний API банка для работы с клиентскими аккаунтами. Представь, что банк разработал систему для управления счетами клиентов, которая позволяет сотрудникам банка проводить операции, такие как переводы денег, проверка баланса и так далее. Этот API закрыт для внешнего мира и используется только внутренними системами банка для обеспечения безопасности и конфиденциальности данных клиентов.
Таким образом, главное отличие между открытым и закрытым API заключается в доступности: открытый API доступен для всех желающих разработчиков, в то время как закрытый API используется внутри компании или организации для определенных целей.
Принцип открытости/закрытости (Open/Closed Principle, OCP) - это один из принципов SOLID в объектно-ориентированном программировании и проектировании.
Принцип открытости/закрытости гласит, что когда у вас уже есть какой-то код или интерфейс (например, API), то его можно расширять и добавлять новые возможности, не меняя при этом уже существующий код. Другими словами, код открыт для добавления нового функционала, но закрыт от изменений.
Пример:
Представьте, что у вас есть класс "Фигура", и в этом классе есть метод "рассчитать_площадь".
Если вы хотите добавить новые фигуры, вы не должны изменять код метода "рассчитать_площадь" в классе "Фигура". Вместо этого, вы создаете новый класс для новой фигуры (например, "Круг") и добавляете в него свой собственный метод "рассчитать_площадь". Таким образом, вы расширяете функциональность без изменения существующего кода.
Он утверждает, что "программные сущности (классы, модули, функции и т. д.) должны быть открытыми для расширения, но закрытыми для изменения." В контексте API (интерфейсов программирования приложений) принцип открытости/закрытости означает следующее:
- Открытыми для расширения: Эта часть принципа предполагает, что вы должны проектировать свои API так, чтобы их можно было расширять или дополнять без изменения существующего кода. Иными словами, вы можете добавлять новые функции или возможности в API, не изменяя его существующего поведения. Это способствует гибкости и поддерживаемости.
- Закрытыми для изменения: Эта часть подчеркивает, что после того, как API определено и используется клиентским кодом, вы должны избегать изменения существующего API, которые могли бы нарушить существующие клиентские реализации. Существующий код, зависящий от API, должен продолжать работать без изменений. Это помогает предотвратить разрывы и уменьшает риск введения ошибок в существующий код.
На практике соблюдение принципа открытости/закрытости побуждает использование таких техник, как наследование, интерфейсы и полиморфизм, для расширения функциональности с помощью новых классов или модулей, без изменения существующих. Это способствует модульному и гибкому проектированию, позволяя строить на основе существующего кода, а не изменять его непосредственно.
Соблюдая принцип открытости/закрытости, можно добиться более поддерживаемого, менее подверженного ошибкам и легче масштабируемого кода, поскольку новые функции могут добавляться к вашему программному обеспечению без изменения существующего. Это фундаментальное понятие в проектировании и архитектуре программного обеспечения, способствующее созданию надежных и адаптируемых систем.
Какие функции у API
API (Application Programming Interface) - это набор правил и соглашений, которые позволяют различным программам взаимодействовать друг с другом. API определяет, как именно приложения могут отправлять запросы и получать ответы для доступа к функциям или данным другого приложения, сервиса или библиотеки.
Функции API включают в себя следующее:
- Интеграция: API позволяет приложениям обмениваться данными и функциональностью между собой. Например, веб-сайт может использовать API социальной сети для показа актуальных новостей или комментариев.
- Расширение функциональности: При помощи API разработчики могут добавлять новые функции к существующим приложениям. Это позволяет расширять возможности программы без изменения ее основного кода.
- Упрощение разработки: API предоставляют готовые функции и сервисы, которые могут быть использованы в приложении. Это упрощает разработку, так как разработчики могут использовать уже готовые решения.
- Управление доступом: API может ограничивать доступ к определенным функциям или данным в зависимости от прав и разрешений, что обеспечивает безопасность и конфиденциальность.
- Стандартизация: Использование API позволяет стандартизировать способы взаимодействия между разными системами, что делает их более совместимыми и интероперабельными.
Принципы REST
REST (Representational State Transfer) — это архитектурный стиль взаимодействия компонентов в распределённой системе, который широко используется для построения сетевых приложений, в особенности веб-сервисов. Принципы REST были введены Роем Филдингом в его докторской диссертации в 2000 году и оказали значительное влияние на разработку современных веб-API. Вот основные принципы REST:
1. Клиент-серверная архитектура
REST предполагает разделение ответственности между клиентом и сервером. Серверы предоставляют услуги (ресурсы), а клиенты их потребляют. Это разделение упрощает компоненты, делая их более независимыми и улучшая их масштабируемость.
2. Без сохранения состояния (Stateless)
Каждый запрос от клиента к серверу должен содержать всю информацию, необходимую серверу для понимания и обработки запроса. Сервер не должен сохранять состояние клиента между запросами. Это упрощает архитектуру и повышает надёжность системы.
3. Кеширование
Ответы должны быть явно помечены как кешируемые или некешируемые, чтобы клиенты знали, можно ли их повторно использовать. Эффективное кеширование уменьшает количество запросов к серверу, что снижает задержку и улучшает масштабируемость.
4. Единообразие интерфейса
Один из ключевых аспектов REST — строгое соблюдение единообразия интерфейса между компонентами, что упрощает и обобщает архитектуру. Включает в себя:
- Идентификация ресурсов: каждый ресурс должен иметь свой уникальный URI.
- Манипуляция ресурсами через представления: клиенты взаимодействуют с ресурсами через представления, которые передаются в формате, понятном клиенту (например, JSON, XML).
- Самоописательные сообщения: каждое сообщение содержит достаточно информации для его обработки.
- Гипермедиа как двигатель состояния приложения (HATEOAS): клиенты переходят от одного состояния к другому исключительно через действия, доступные в текущем ресурсе, т.е. динамически обнаруживаемые ссылки предоставляются в ответах.
5. Слои
Система может быть организована в слои. Каждый слой не знает о существовании других слоев, кроме слоя, с которым он непосредственно взаимодействует. Это улучшает безопасность и позволяет компонентам независимо масштабироваться.
6. Код по требованию (необязательный)
Серверы могут временно расширять или настраивать функциональность клиента, передавая ему исполняемый код (например, JavaScript). Это позволяет создавать более адаптивные и гибкие приложения.
Подходы и протоколы для имплементации API
- REST (Representational State Transfer): REST - это архитектурный стиль, который использует HTTP в качестве протокола передачи данных. Он известен своей простотой и широко используется для создания веб-сервисов. RESTful веб-сервисы используют стандартные методы HTTP (GET, POST, PUT, DELETE) для выполнения операций CRUD (Create, Read, Update, Delete) над ресурсами, представленными в виде URL-адресов. JSON и XML часто используются в качестве форматов данных для RESTful API.
- SOAP (Simple Object Access Protocol): SOAP - это протокол, который определяет набор правил для структурирования сообщений в формате XML. Он известен своей строгой стандартизацией и используется для создания веб-сервисов, которые требуют высокой надежности и безопасности. Веб-сервисы на основе SOAP используют XML для описания данных и операций, а также обеспечивают дополнительные уровни безопасности и надежности.
- JSON-RPC и XML-RPC: Эти протоколы позволяют вызывать удаленные процедуры и передавать параметры и результаты в форматах JSON или XML. Они являются простыми и понятными для использования, и широко применяются в создании веб-сервисов.
- GraphQL: GraphQL - это язык запросов и среда выполнения для вашего API, который позволяет клиентам запросить только те данные, которые им нужны. Это делает его более гибким по сравнению с REST, где клиенты часто получают избыточные данные.
- gRPC: gRPC - это высокопроизводительный и эффективный протокол для взаимодействия между микросервисами. Он использует Protocol Buffers (protobuf) для определения структуры данных и RPC (Remote Procedure Call) для вызова удаленных функций.
gRPC
Что такое gRPC?
gRPC позволяет одной программе вызывать функцию или метод, который находится на другом сервере и выполнен в другой программе. Это как если бы ты мог позвонить другу и попросить его что-то сделать для тебя, и он быстро выполнял эту задачу.
Как это работает?
- Определение сервиса: Сначала ты описываешь, какие функции ты хочешь, чтобы другие программы могли вызывать. Это делается на языке описания интерфейса (IDL), который в gRPC называется Protocol Buffers (protobuf). Это как написать список заданий, которые ты хочешь поручить.
- Протоколы: Затем gRPC использует специальный формат для этих "заданий" (protobuf), который очень компактный и быстрый, чтобы данные быстро передавались между программами, даже если они находятся далеко друг от друга.
- Транспорт: Для связи между программами gRPC использует технологию под названием HTTP/2. Это современная версия протокола, которым обычно пользуются браузеры для загрузки веб-страниц. HTTP/2 позволяет отправлять множество запросов и ответов одновременно через одно и то же соединение, что делает общение более эффективным и быстрым.
Преимущества gRPC
- Быстрота: Благодаря использованию HTTP/2 и protobuf, gRPC работает очень быстро и эффективно.
- Поддержка множества языков: Ты можешь писать сервисы на одном языке (например, на Java), а клиенты на другом (например, на Python), и они будут легко общаться.
- Надежность: gRPC поддерживает продвинутые функции, такие как аутентификация, мониторинг и балансировка нагрузки, что делает систему более устойчивой к ошибкам и перегрузкам.
Недостатки
- Барьер вхождения: Для работы с gRPC нужно научиться пользоваться Protocol Buffers и понимать основы HTTP/2.
- Ограниченная поддержка браузеров: Так как gRPC использует HTTP/2, который не все браузеры поддерживают полностью, это может стать проблемой для разработки клиентских приложений, работающих непосредственно в браузере.
В общем, gRPC — это мощный инструмент для построения распределенных приложений, где важна скорость и эффективность обмена данными между различными компонентами системы.
gRPC предлагает четыре основных типа методов для удаленного вызова процедур, каждый из которых обеспечивает различные модели общения между клиентом и сервером. Эти методы позволяют оптимизировать обмен данными в зависимости от требований приложения. Вот они:
1. Унарный RPC (Unary RPC)
Это самый базовый и часто используемый тип вызова в gRPC, где клиент отправляет один запрос серверу и получает один ответ. Это похоже на обычный функциональный вызов в программировании.
Пример: Клиент запрашивает детали пользователя по его ID, сервер обрабатывает запрос и возвращает информацию о пользователе.
2. Серверный потоковый RPC (Server streaming RPC)
В этом методе клиент отправляет один запрос, а сервер в ответ отправляет серию сообщений. Это полезно, когда сервер должен отправить большое количество данных или данные должны быть отправлены по мере их готовности.
Пример: Клиент запрашивает список всех операций по счёту, и сервер последовательно отправляет информацию об каждой операции, пока не будут переданы все данные.
3. Клиентский потоковый RPC (Client streaming RPC)
Здесь клиент отправляет серию сообщений серверу, который после получения всех данных отправляет обратно один ответ. Это полезно, когда клиенту нужно передать большой объем данных, который удобнее или эффективнее отправлять по частям.
Пример: Клиент отправляет серию изображений для обработки, и после обработки всех изображений сервер отправляет итоговый результат.
4. Двунаправленный потоковый RPC (Bidirectional streaming RPC)
Этот метод позволяет клиенту и серверу одновременно отправлять серии сообщений друг другу. Порядок сообщений может быть любым, и оба участника могут начать отправку сообщений независимо друг от друга.
Пример: Клиент и сервер обмениваются сообщениями в реальном времени в рамках интерактивной сессии, например, в системе онлайн-консультаций или мониторинга.
Каждый из этих методов поддерживает разные сценарии использования и может быть интегрирован в различные архитектуры приложений, предоставляя разработчикам гибкость в создании эффективных и масштабируемых систем.
GraphQL
GraphQL — это язык запросов для API и среда выполнения для выполнения этих запросов с вашими существующими данными. GraphQL предоставляет полный и понятный описание данных в вашем API, дает клиентам возможность запрашивать именно то, что им нужно, и ничего больше, упрощает агрегацию данных из множества источников и позволяет API развиваться с течением времени без влияния на существующие запросы.
Ключевые особенности GraphQL:
- Точная спецификация запросов: В отличие от традиционных REST API, где сервер определяет структуру возвращаемых данных, GraphQL позволяет клиентам точно указывать, какие данные им нужны. Это может существенно уменьшить объем передаваемых данных.
- Один конечный пункт (endpoint): В GraphQL обычно используется один URL, через который проходят все запросы. Это упрощает маршрутизацию и может улучшить производительность благодаря уменьшению количества необходимых HTTP-запросов.
- Сильная типизация: Схема GraphQL является строго типизированной. Это означает, что система может проверять запросы еще до их выполнения, гарантируя, что клиенты получают только данные, которые могут обрабатываться.
- Интроспекция: GraphQL API позволяют клиентам исследовать типы и возможности API, которые они используют. Это очень полезно для разработки инструментов и клиентских библиотек.
- Агрегация данных из различных источников: GraphQL может объединять данные из разных источников, таких как базы данных или другие API, в одном запросе.
Как работает GraphQL:
- Запросы: Клиенты отправляют запросы на сервер для получения данных. Запросы могут быть простыми (например, получение списка пользователей) или сложными (например, получение пользователей вместе с информацией о каждом из их друзей и последних постах).
- Мутации: В GraphQL мутации используются для создания, обновления или удаления данных. Это похоже на методы POST, PUT и DELETE в REST.
- Подписки: GraphQL также поддерживает подписки, которые позволяют клиентам получать данные в реальном времени. Клиент "подписывается" на определенные данные, и сервер отправляет обновления всякий раз, когда эти данные изменяются.
Преимущества и недостатки GraphQL:
- Эффективность данных и сокращение необходимого количества запросов.
- Гибкость и мощная адаптивность к изменяющимся требованиям клиентов.
- Улучшенная возможность работы с типами данных и структурами.
- Сложность запросов, особенно при больших вложениях.
- Высокая нагрузка на сервер, так как обработка сложных запросов требует значительных ресурсов.
- Сложность кеширования по сравнению с REST, где каждый запрос обычно является стандартным и предсказуемым.
В целом, GraphQL предлагает мощные инструменты для работы с API, которые могут значительно улучшить как разработку, так и использование приложений.
Rest vs SOAP преимущества и недостатки
- Строгая структура данных: SOAP использует XML для описания сообщений, что обеспечивает строгую структуру данных и схему, что может быть полезно в приложениях, требующих высокой надежности и точной валидации данных.
- Безопасность: SOAP предоставляет встроенные механизмы безопасности, такие как WS-Security, для обеспечения конфиденциальности и целостности данных.
- Интеграция с разными протоколами: SOAP может работать поверх разных протоколов, включая HTTP, SMTP и другие, что обеспечивает широкую совместимость.
- Сложность: SOAP-сообщения могут быть громоздкими из-за XML-структуры, что делает их менее читаемыми и медленнее обрабатываемыми.
- Медленный и большой объем данных: SOAP-запросы и ответы могут быть объемными и медленными, что не всегда подходит для веб-сервисов с высокой нагрузкой.
- Меньшая гибкость: SOAP обычно предоставляет жесткий контракт (WSDL), что может ограничивать гибкость при изменении API.
- Простота: RESTful API использует стандартные HTTP-методы, такие как GET, POST, PUT и DELETE, что делает их легкими для понимания и использования.
- Быстрота и эффективность: RESTful API обычно работают быстрее из-за меньшего объема данных и отсутствия лишних накладных расходов, таких как парсинг XML.
- Гибкость: REST позволяет более гибко определять структуру данных и ресурсы, что упрощает изменение и расширение API.
- Совместимость с браузерами: RESTful API легко доступны через браузер, что делает их удобными для создания веб-приложений и работы с веб-страницами.
- Отсутствие стандарта безопасности: REST не предоставляет стандартизированных механизмов безопасности, что означает, что разработчики должны реализовывать свои собственные меры безопасности.
- Менее строгая структура данных: REST позволяет большую свободу в определении структуры данных, что может привести к несогласованности между клиентами и серверами.
Выбор между SOAP и REST зависит от конкретных требований вашего проекта. SOAP подходит для приложений, где требуется строгая структура данных и высокая безопасность, в то время как REST лучше подходит для простых и быстрых веб-сервисов, где важна производительность и гибкость.
Методы SOAP и REST не одинаковы. Давайте разберемся в основных отличиях.
SOAP (Simple Object Access Protocol):
SOAP — это протокол, использующий XML для обмена сообщениями между системами. SOAP работает независимо от транспортного протокола, хотя чаще всего используется HTTP или HTTPS. В SOAP сообщения обернуты в XML-структуру, которая содержит не только сами данные, но и информацию о том, как эти данные должны быть обработаны.
SOAP определяется через WSDL (Web Services Description Language) — язык описания веб-сервисов, который детально описывает, какие операции доступны через веб-сервис, какие данные необходимы для каждой операции и какие данные будут возвращены.
В SOAP нет строгих "методов" в том смысле, в каком они существуют в REST. Вместо этого, SOAP опирается на операции, определенные в WSDL. Каждая операция описывает конкретное действие, которое может быть вызвано клиентом.
REST (Representational State Transfer):
REST — это архитектурный стиль, а не протокол, который использует стандартные HTTP-методы для взаимодействия с ресурсами. RESTful веб-сервисы обмениваются данными через HTTP, используя стандартные HTTP-методы, такие как:
- GET для получения данных.
- POST для создания новых ресурсов.
- PUT для обновления существующих ресурсов.
- DELETE для удаления ресурсов.
- PATCH для частичного обновления ресурсов.
REST использует простые форматы обмена данными, такие как JSON или XML, для сериализации данных, но JSON стал более популярным благодаря своей компактности и легкости в использовании.
Основные отличия:
- Формат сообщений: SOAP использует XML для всех сообщений, в то время как REST может использовать JSON, XML или другие форматы.
- Транспорт: Хотя оба могут работать поверх HTTP/HTTPS, SOAP также может использовать другие протоколы, такие как SMTP. REST же строго связан с HTTP-методами.
- Операции vs Методы: В SOAP операции определяются в WSDL и не ограничиваются стандартными HTTP-методами. REST же использует стандартные HTTP-методы для операций над ресурсами.
Таким образом, методы SOAP и REST различаются по своей структуре, подходу к описанию операций и используемым форматам данных. SOAP предлагает более формализованный и строгий подход с использованием XML и WSDL, в то время как REST ориентирован на простоту и гибкость, опираясь на стандартные HTTP-методы и различные форматы данных.
Как данные веб-сервисов транспортируются
- WSDL (Web Services Description Language):
- Описание: WSDL - это язык описания веб-сервисов, который определяет структуру и доступные операции веб-сервиса.
- Преимущества:
- Формальное описание: WSDL предоставляет формальное и строгое описание структуры данных и операций, что облегчает интеграцию и автоматическую генерацию кода клиента.
- Поддержка разных протоколов: WSDL позволяет описывать веб-сервисы, работающие поверх разных протоколов, включая SOAP и HTTP.
- Недостатки:
- XML (Extensible Markup Language):
- Описание: XML - это универсальный формат данных, который широко используется для передачи информации между веб-сервисами. Данные в XML представлены в виде дерева с тегами и значениями.
- Преимущества:
- Универсальность: XML поддерживается многими языками программирования и платформами, что делает его универсальным.
- Читаемость: XML-данные легко читаемы и понятны для человека, что облегчает отладку и разработку.
- Недостатки:
- JSON (JavaScript Object Notation):
- Описание: JSON - это легкий и компактный формат данных, который часто используется для обмена информацией между веб-сервисами. Данные в JSON представлены в виде пар ключ-значение.
- Преимущества:
- Компактность: JSON обычно занимает меньше места по сравнению с XML, что улучшает производительность и экономит пропускную способность сети.
- Читаемость: JSON-данные также легко читаемы, что упрощает отладку и разработку.
- Популярность: JSON является популярным форматом данных и широко поддерживается множеством языков и библиотек.
- Недостатки:
Выбор между WSDL, XML и JSON зависит от конкретных требований вашего проекта. WSDL предоставляет формальное описание веб-сервисов, XML удобен для читаемости, а JSON компактен и популярен. Каждый из них имеет свои преимущества и недостатки, и выбор должен быть сделан с учетом конкретных потребностей вашего приложения и экосистемы.
Второй вариант ответа
- SOAP (Simple Object Access Protocol):
- Что это такое: SOAP — это протокол для обмена структурированными данными в распределенной среде, чаще всего используется в веб-сервисах.
- Как работает: SOAP использует XML для кодирования сообщений, которые затем передаются, обычно, через HTTP.
- WSDL (Web Services Description Language): Это формат XML для описания веб-сервисов как набора конечных точек, оперирующих сообщениями.
- XML Schema:
- Что это такое: XML Schema определяет структуру и типы данных XML-документа.
- Зачем нужен: Он используется для валидации структуры и содержимого XML-документов.
- XML (eXtensible Markup Language):
- Что это такое: XML — это язык разметки, предназначенный для хранения и передачи данных.
- Особенности: XML поддерживает иерархические структуры данных и является очень гибким, но может быть избыточным по размеру.
- REST (Representational State Transfer):
- Что это такое: REST — это архитектурный стиль для разработки веб-сервисов.
- Как работает: REST использует стандартные HTTP-методы (GET, POST, PUT, DELETE и т.д.) и обычно основан на использовании ресурсов с URL-адресами.
- JSON (JavaScript Object Notation):
JSON-schema и XML-schema
JSON-schema и XML-schema - это инструменты для описания структуры и проверки данных, представленных в форматах JSON и XML соответственно.
JSON Schema — один из языков описания структуры JSON-документа, используя синтаксис JSON. Определяет структуру и тип данных в в JSON файлах.
JSON-schema и XML-schema - это инструменты для описания структуры и правил данных в форматах JSON и XML соответственно. Проще говоря, они помогают определить, как должны выглядеть данные и какие правила им следует соответствовать.
JSON-schema
- Что Это: JSON-schema - это способ описания структуры и формата данных в формате JSON. Он определяет, какие поля должны быть в JSON-объекте, их типы данных (например, строка, число), обязательные поля и другие правила.
- Для Чего Используется: Используется для проверки данных на соответствие определенной структуре. Например, при получении данных от веб-API можно использовать JSON-schema, чтобы убедиться, что данные соответствуют ожидаемому формату.
XML-schema
- Что Это: XML-schema (или XSD) - это способ описания структуры и формата данных в формате XML. Он определяет, какие элементы и атрибуты могут присутствовать в XML-документе, их типы данных, последовательность элементов и так далее.
- Для Чего Используется: Используется для валидации XML-документов. Это важно, например, при обмене данными между разными системами, чтобы убедиться, что данные корректны и соответствуют ожидаемой структуре.
- JSON-schema: Это мощный инструмент для валидации и аннотирования структур данных JSON. JSON-schema описывает формат, тип данных, и другие ограничения JSON-документов. Например, вы можете определить, что определенное поле должно быть строкой, другое - числом, а третье - массивом с определенной структурой. JSON-schema используется для автоматической проверки данных на соответствие заранее заданному шаблону, что полезно при валидации данных, полученных от API, или при проверке конфигурационных файлов.
- XML-schema (XSD): Это аналогичный инструмент, но для XML-документов. XML-schema определяет структуру и тип данных в XML-файлах. Она позволяет задать правила для элементов XML: их последовательность, количество, атрибуты и типы данных. Это полезно для обеспечения согласованности данных, обмена данными между различными системами и для валидации XML-документов.
В своей основе JSON построен на следующих структурах данных:
{ "key1": "value1", "key2": "value2" }
[ "first", "second", "third" ]
42 3.1415926
"This is a string"
true false
null
И JSON-schema, и XML-schema служат для обеспечения целостности и правильности структуры данных, что особенно важно в разработке ПО, интеграции систем и в области обработки больших объемов данных.
см. ссылки:
https://timmson.github.io/java-interview/061-ml.html
Методы HTTP протокола
- GET: Запрашивает представление ресурса. GET-запросы должны быть только для извлечения данных и не должны вызывать изменения на сервере.
- POST: Используется для отправки данных на сервер, например, при отправке формы. Данные отправляются в теле запроса. POST-запросы могут вызвать изменения на сервере.
- PUT: Заменяет все текущие представления ресурса данными запроса. Это используется для обновления содержимого ресурса полностью.
- DELETE: Удаляет указанный ресурс.
- HEAD: Аналогичен GET, но сервер в ответ отправляет только заголовки и статус-код без тела сообщения. Используется для извлечения метаданных.
- OPTIONS: Используется для описания параметров связи с ресурсом. Часто применяется для определения возможностей веб-сервера или для проверки возможностей безопасности при CORS-запросах.
- PATCH: Применяется для частичного изменения ресурса. В отличие от PUT, PATCH обновляет только те части ресурса, которые указаны в теле запроса.
- CONNECT: Используется для преобразования соединения запроса в прозрачный TCP/IP-туннель, обычно для обеспечения защищенного соединения через незащищенный прокси.
- TRACE: Выполняет вызов обратно к клиенту для тестирования или диагностики, возвращая в теле ответа полученный запрос.
HTTP ошибки и их коды
- 4xx - Ошибки клиента:
400 Bad Request
: Неверный запрос из-за некорректного синтаксиса.401 Unauthorized
: Для доступа к ресурсу необходима аутентификация.403 Forbidden
: Сервер понял запрос, но отказывает в доступе.404 Not Found
: Ресурс не найден на сервере.405 Method Not Allowed
: Метод, указанный в запросе, не разрешен для ресурса.406 Not Acceptable
: Ресурс не может удовлетворить критерии, указанные в заголовке запроса.408 Request Timeout
: Время ожидания запроса сервером истекло.409 Conflict
: Конфликт из-за противоречия запроса с текущим состоянием ресурса.410 Gone
: Ресурс был удален и более недоступен.429 Too Many Requests
: Клиент отправил слишком много запросов за короткий промежуток времени.- 5xx - Ошибки сервера:
500 Internal Server Error
: Общая ошибка сервера, когда сервер сталкивается с непредвиденными обстоятельствами.501 Not Implemented
: Сервер не поддерживает функционал, необходимый для выполнения запроса.502 Bad Gateway
: Сервер, выступающий в качестве шлюза или прокси, получил неверный ответ от вышестоящего сервера.503 Service Unavailable
: Сервер временно недоступен, обычно из-за перегрузки или технического обслуживания.504 Gateway Timeout
: Сервер в роли шлюза или прокси не смог вовремя получить ответ от вышестоящего сервера.- 200 OK: Успешный запрос. Если клиент сделал запрос GET, ответ содержит запрашиваемые данные.
- 201 Created: Запрос был успешен, и в результате был создан новый ресурс. Обычно следует за успешными POST-запросами.
- 202 Accepted: Запрос был принят к обработке, но обработка еще не завершена. Этот код указывает, что запрос принят, но может быть не обработан или обработка может быть отложена.
- 203 Non-Authoritative Information: Сервер успешно обработал запрос, но возвращает информацию, которая может быть из другого источника.
- 204 No Content: Запрос был успешно обработан, но в ответе нет содержимого. Это часто используется в ответах на DELETE-запросы.
- 205 Reset Content: Указывает, что клиенту следует сбросить содержимое представления документа, которое вызвало запрос.
- 206 Partial Content: Сервер успешно обработал часть GET-запроса, используя заголовок Range, который позволяет загружать части большого документа.
HTTP vs HTTPS
HTTP (Hypertext Transfer Protocol) и HTTPS (HTTP Secure) являются протоколами передачи данных в Интернете, но между ними есть ключевые различия, связанные с безопасностью:
- Безопасность:
- HTTP не использует шифрование, что делает передаваемые данные уязвимыми для перехвата или изменения посредниками.
- HTTPS использует шифрование (обычно TLS или SSL), чтобы защитить передаваемые данные. Это обеспечивает конфиденциальность и целостность данных, а также подтверждение подлинности сервера.
- Порты по умолчанию:
- URL-префикс:
- Сертификаты:
- HTTP не требует использования SSL/TLS сертификатов.
- HTTPS требует SSL/TLS сертификат для установления защищенного соединения. Сертификаты должны быть выданы доверенным центром сертификации и используются для подтверждения подлинности веб-сайта.
- Приложения:
Использование HTTPS становится стандартом для большинства веб-сайтов, особенно после того, как поисковые системы и браузеры начали маркировать сайты, использующие HTTP, как "не защищенные". Это повышает доверие пользователей и защищает данные в Интернете.
REST API AUTH methods
REST API Authentication: Securing Your Data in the Modern Web
In today's interconnected world, REST APIs form the backbone of countless applications and services. But with great power comes great responsibility - especially when it comes to security. Let's dive deep into four crucial authentication methods for REST APIs:
1. Basic Authentication:
• The simplest form, sending base64-encoded username and password with each request.
• Pros: Easy to implement, widely supported.
• Cons: Credentials sent with every call, vulnerable if not used with HTTPS.
• Best for: Internal APIs or dev environments, not recommended for production.
2. Token Authentication:
• Uses temporary tokens instead of credentials for each request.
• Workflow: Client authenticates once, receives a token, uses it for subsequent requests.
• Pros: More secure than Basic Auth, tokens can be revoked, reduced load on server.
• Cons: Requires token management, potential security risks if tokens are compromised.
• Best for: Most web and mobile applications, Single Page Applications (SPAs).
3. OAuth Authentication:
• Allows third-party applications to access resources without sharing passwords.
• Complex workflow involving multiple steps: request, grant, access token, refresh token.
• Pros: Highly secure, great for third-party integrations, fine-grained access control.
• Cons: Complex to implement, overkill for simple APIs.
• Best for: APIs that need to integrate with multiple services or allow third-party access.
4. API Key Authentication:
• Uses a unique key to identify and authenticate API requests.
• Simple workflow: Client includes the API key in headers or query parameters.
• Pros: Easy to implement and use, good for tracking API usage.
• Cons: Less secure if keys are exposed, limited in terms of access control.
• Best for: Public APIs, developer-focused services, or when you need to track API usage.
Choosing the right authentication method depends on your specific use case, security requirements, and target audience. Many modern applications use a combination of these methods for different scenarios.
Key Takeaways:
• Always use HTTPS to encrypt data in transit, regardless of the auth method.
• Consider the trade-offs between security and ease of use.
• Implement proper token/key management and rotation policies.
• Stay updated on security best practices and emerging standards.