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:
- Определить контракт:
[ServiceContract]
public interface IHelloService
{
[OperationContract]
string SayHello(string name);
}
- Реализовать сервис:
public class HelloService : IHelloService
{
public string SayHello(string name)
{
return $"Привет, {name}!";
}
}
- Хостинг (например, в IIS):
<%@ ServiceHost Language="C#" Service="HelloService" %>
- Настройки в 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 — это фреймворк для разработки масштабируемых кросс-языковых сервисов. Он предоставляет инструменты для определения интерфейсов и генерации кода на различных языках программирования.

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);
}
Разберём вышеприведённый пример.
- Struct User - определяет структуру данных с полями id, name и email. Поля помечены как обязательные (required) или необязательные (optional).
- Enum Status - пределяет набор возможных состояний пользователя.
- Service UserService - описывает методы, которые будут доступны клиенту. Например, метод getUser принимает параметр id и может выбросить исключение Exception.
IDL в Thrift работает по следующим этапам:
- Описание интерфейса. Разработчик создаёт файл .thrift, используя синтаксис IDL. В этом файле описываются все структуры данных, сервисы и методы.
- Генерация кода. Используя компилятор, файл .thrift преобразуется в код на целевом языке программирования. К примеру, создаётся Java-код для клиента и сервера.
- Реализация сервера. На основе сгенерированного кода разработчик реализует логику сервера.
- Интеграция клиента. Клиент также использует сгенерированный код для вызова методов сервера.