Перейти к основному содержимому

2.09. Реализация интеграции

Всем

Реализация интеграции

Веб-сервисы

Веб-сервис — это компонент, который предоставляет функциональность через сеть (обычно HTTP), используя стандартные протоколы, такие как SOAP, REST или XML/JSON. Пример: сервис погоды, который возвращает данные о температуре по HTTP-запросу.

SOAP-веб-сервисы используют протокол SOAP, строгую структуру данных и WSDL для описания контрактов. RESTful API это уже более легковесный стиль, основанный на HTTP-методах (GET, POSTи т.д.), часто возвращают JSON.

WCF (Windows Communication Foundation) — это унифицированная платформа Microsoft для создания подключаемых сервисов, поддерживающая различные протоколы передачи данных (HTTP, TCP, MSMQ и др.) и форматы (SOAP, JSON, XML). WCF был анонсирован как «единое решение» для всех видов коммуникаций между сервисами.

WCF включает в себя: Service Contract - интерфейс, описывающий доступные методы сервиса. OperationContract - метод, доступный клиентам. DataContract / DataMember - атрибуты для сериализации объектов. Binding - описание того, как сервис общается (протокол, кодирование, транспорт). Endpoint - конечная точка, через которую клиент взаимодействует с сервисом. Hosting - способ размещения сервиса (сервис можно хостить в IIS, Windows Service, Console App и т.д.).

Чтобы реализовать сервис, к примеру, можно использовать как раз WCF:

  1. Определить контракт:
[ServiceContract]
public interface IHelloService
{
[OperationContract]
string SayHello(string name);
}
  1. Реализовать сервис:
public class HelloService : IHelloService
{
public string SayHello(string name)
{
return $"Привет, {name}!";
}
}

  1. Хостинг (например, в IIS):
<%@ ServiceHost Language="C#" Service="HelloService" %>
  1. Настройки в web.config:
<system.serviceModel>
<services>
<service name="HelloService">
<endpoint address="" binding="basicHttpBinding" contract="IHelloService"/>
</service>
</services>
</system.serviceModel>

Теперь сервис доступен по адресу /HelloService.svc.

System.ServiceModel - основное пространство имён для работы с WCF. Как раз там и используются основные атрибуты:

[ServiceContract], обозначает интерфейс как контракт сервиса;

[OperationContract], метод, который будет доступен удалённо;

[DataContract], класс, который может быть сериализован для передачи;

[DataMember], свойство класса, которое участвует в сериализации;

ServiceHost, класс для запуска и управления сервисом;

ChannelFactory<T> для создания клиента WCF-сервиса программно;

BasicHttpBinding, WsHttpBinding, NetTcpBinding - разные типы привязок для разных сценариев.

Другой популярный тип сервисов - Web API. Если WCF использует SOAP, HTTP, TCP, MSMQ, и довольной сложный, то Web API использует в основном HTTP и предпочтителен для REST API и микросервисов. Сейчас вместо WCF используют:

  • ASP.NET Web API — для RESTful-сервисов.
  • gRPC — для высокопроизводительных RPC-вызовов.
  • SignalR — для реального времени (чаты, обновления).
  • MassTransit / NServiceBus — для шины сообщений и распределённых систем.

Веб-интерфейс

Веб-формы — это интерфейс, который позволяет пользователям вводить данные через браузер. Эти данные затем отправляются на сервер для обработки. В контексте интеграций веб-формы часто используются для взаимодействия между разными системами. К примеру, пользователь заполняет форму на сайте, и данные передаются в CRM-систему. Это тот самый тег form в HTML с атрибутом отправки submit.

Такой подход очень удобен для пользователей, и можно собирать любые данные, необходимые для интеграции. Форма может напрямую отправлять данные в API другой системы, используя, к примеру, GET или POST запросы.

iFrame (inline frame) — это HTML-элемент, который позволяет встраивать внешний контент (например, веб-страницу) внутрь текущей страницы. iFrame создаёт изолированное окно, которое загружает содержимое независимо от родительской страницы. Это тоже вариант интеграции, к примеру, для встраивания платёжных форм, виджетов или интерактивных карт.

Apache Thrift

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

image-19.png

Thrift использует собственный диалект языка для описания сервисов и данных - IDL. Для передачи данных используется бинарный формат, что делает его быстрее JSON или XML. Разработчик описывает интерфейс сервиса в IDL-файле. Это описание включает методы и типы данных. Компилятор Thrift преобразует IDL-файл в код на целевых языках программирования (например, Java, Python, C++).

Клиентский код используется для вызова методов удаленного сервиса. Серверный код реализует логику методов, которые будут вызываться клиентом. Оба они генерируются.

Клиент и сервер обмениваются данными через сетевое соединение, используя протокол Thrift (например, JSON, Binary). Клиент отправляет запросы, а сервер обрабатывает их и возвращает ответы.

Про Thrift можно почитать здесь https://thrift.apache.org/

IDL (Interface Definition Language) — это язык, предназначенный для описания интерфейсов, данных и взаимодействий между компонентами программного обеспечения. Он используется для определения структуры данных и методов взаимодействия в распределённых системах, где компоненты могут быть написаны на разных языках программирования. Этот язык позволяет определить:

  • Структуры данных (structs) - аналог классов или объектов в языках программирования.
  • Перечисления (enums) - наборы констант.
  • Сервисы (services) - интерфейсы для вызова удалённых процедур (RPC).
  • Исключения (exceptions) - обработка ошибок.
  • Типы данных - базовые типы (например, строки, числа) и сложные типы (например, списки, карты).
struct User {
1: required string id;
2: required string name;
3: optional string email;
}
enum Status {
ACTIVE = 1,
INACTIVE = 2,
DELETED = 3
}
service UserService {
User getUser(1: string id) throws (1: Exception ex);
bool updateUser(1: User user);
}

Разберём вышеприведённый пример.

  1. Struct User - определяет структуру данных с полями id, name и email. Поля помечены как обязательные (required) или необязательные (optional).
  2. Enum Status - пределяет набор возможных состояний пользователя.
  3. Service UserService - описывает методы, которые будут доступны клиенту. Например, метод getUser принимает параметр id и может выбросить исключение Exception.

IDL в Thrift работает по следующим этапам:

  1. Описание интерфейса. Разработчик создаёт файл .thrift, используя синтаксис IDL. В этом файле описываются все структуры данных, сервисы и методы.
  2. Генерация кода. Используя компилятор, файл .thrift преобразуется в код на целевом языке программирования. К примеру, создаётся Java-код для клиента и сервера.
  3. Реализация сервера. На основе сгенерированного кода разработчик реализует логику сервера.
  4. Интеграция клиента. Клиент также использует сгенерированный код для вызова методов сервера.