Основні можливості WitCom
- Простота та рідне використання: Дизайн WitCom забезпечує інтуїтивно зрозумілу реалізацію. Відмовившись від текстових повідомлень, лямбда-функцій або складних виразів, він спрощує процес розробки, особливо для розробників, які переходять з інших фреймворків. Його рідний підхід означає, що розробники працюють з знайомими інструментами та парадигмами, що зменшує криву навчання.
- Дуплексний зв'язок: WitCom відзначається здатністю забезпечити повний дуплексний зв'язок, дозволяючи безперешкодно здійснювати двосторонні обміни повідомленнями між клієнтом і сервером. Вбудована підтримка подій і зворотних викликів дозволяє працювати з широким спектром делегатів, таких як
PropertyChangedEventHandler
. Цей дуплексний модель ідеально підходить для додатків, що вимагають постійної взаємодії, таких як живі оновлення, синхронізоване обмін даними чи колабораційні системи. - Клієнтський проксі відображає сервер: Визначною рисою WitCom є здатність створювати динамічний проксі на стороні клієнта, який відображає інтерфейс серверного об'єкта. Це означає, що, просто викликаючи методи або отримуючи властивості з проксі клієнта, ви безпосередньо взаємодієте з сервером. Крім того, підписка на події через проксі автоматично викликає серверні події, роблячи всю комунікацію між клієнтом та сервером непомітною та без зусиль для користувача. Розробники працюють природно з інтерфейсом, а WitCom бере на себе всю підготовку зв'язку.
- Архітектура на основі інтерфейсів: Сервісні інтерфейси в WitCom визначені з використанням стандартних інтерфейсів .NET. Це сприяє високій типобезпеці та дозволяє автоматично генерувати динамічні клієнтські проксі, які є точними копіями серверних сервісів, забезпечуючи стабільну поведінку в межах додатка.
- Різноманітність транспортних механізмів: WitCom підтримує різні механізми транспорту, що робить його адаптованим до різних сценаріїв та інфраструктур:
- Пам'яті: Призначено для надшвидкої міжпроцесної комунікації (IPC) на одному комп'ютері.
- Іменовані канали: Ефективні для IPC в межах однієї мережі чи комп'ютера, підтримуючи кілька клієнтів.
- TCP: Забезпечує надійний зв'язок для розподілених систем, що робить його підходящим для масштабних застосунків.
- WebSocket: Дозволяє ефективну, двосторонню комунікацію в реальному часі через веб-платформи.
- REST: Спрощує взаємодію з клієнтами, що не використовують .NET, дозволяючи швидко розгортати RESTful API для зовнішніх інтеграцій.
- Широка кастомізація:
- Повна підтримка загальних функцій та властивостей.
- Гнучкі формати серіалізації, включаючи JSON і MessagePack.
- Опціональні функції безпеки, такі як шифрування з кінця в кінець і авторизація на основі токенів.
- Розробники можуть перевизначити стандартні реалізації для специфічних вимог, що забезпечує адаптацію API під унікальні вимоги проєкту.
Покращена безпека: шифрування та авторизація
Безпека є основою дизайну WitCom, забезпечуючи надійні механізми шифрування та авторизації. Ці можливості побудовані на гнучких, розширюваних інтерфейсах, з стандартними реалізаціями для більшості типових випадків використання.
Шифрування з кінця в кінець: Шифрувальна система WitCom забезпечує безпечну комунікацію між клієнтами та серверами. За замовчуванням, AES (Advanced Encryption Standard) використовується для симетричного шифрування, в той час як RSA забезпечує безпечний обмін ключами. Ця багатошарова безпека гарантує:
- Конфіденційність даних: Забезпечує, що передані дані будуть зашифровані та недоступні для несанкціонованих осіб.
- Цілісність: Перевіряє цілісність даних, запобігаючи їх зміні під час передачі.
Розробники можуть реалізувати власну логіку шифрування, дотримуючись інтерфейсів IEncryptorServer
та IEncryptorClient
, що дозволяє налаштовувати заходи безпеки за потребою.
Приклад конфігурації для увімкнення шифрування:
var server = WitComServerBuilder.Build(options =>
{
options.WithEncryption();
});
var client = WitComClientBuilder.Build(options =>
{
options.WithEncryption();
});
Авторизація на основі токенів: Авторизація інтегрована через систему токенів, що додає додатковий рівень безпеки. За замовчуванням WitCom включає статичні валідатори токенів, які підходять для більшості сценаріїв. Розробники можуть розширювати функціональність, реалізуючи IAccessTokenValidator
для налаштованої логіки авторизації, що дозволяє інтеграцію з розширеними системами управління ідентифікацією.
Приклад:
public class AccessTokenValidator : IAccessTokenValidator
{
private readonly string _validToken;
public AccessTokenValidator(string validToken)
{
_validToken = validToken;
}
public bool IsAuthorizationTokenValid(string token)
{
return token == _validToken;
}
}
var server = WitComServerBuilder.Build(options =>
{
options.WithAccessTokenValidator(new AccessTokenValidator("secure-token"));
});
Опції серіалізації: JSON та MessagePack
Серіалізація в WitCom є гнучкою та ефективною, задовольняючи різноманітні потреби застосунків. Надаються стандартні реалізації серіалізаторів, але розробники можуть налаштувати їх, реалізуючи інтерфейс IMessageSerializer
.
Серіалізація JSON: JSON є стандартним форматом, що забезпечує чудову читаність та широке підтримання на різних платформах. Його зрозумілий формат особливо корисний під час відлагодження та інтеграції з третіми системами.
Приклад конфігурації:
var server = WitComServerBuilder.Build(options =>
{
options.WithJson();
});
var client = WitComClientBuilder.Build(options =>
{
options.WithJson();
});
Серіалізація MessagePack: Для високопродуктивних застосунків MessagePack пропонує компактний бінарний формат серіалізації, який значно зменшує розмір корисного навантаження.
Це ідеально підходить для середовищ, чутливих до пропускної здатності, або систем з жорсткими вимогами до продуктивності.
Приклад конфігурації:
var server = WitComServerBuilder.Build(options =>
{
options.WithMessagePack();
});
var client = WitComClientBuilder.Build(options =>
{
options.WithMessagePack();
});
Налаштування WitCom
Щоб продемонструвати простоту використання WitCom, розглянемо наступний приклад для налаштування базового сервісу:
Оголошення інтерфейсу сервісу:
public interface IExampleService
{
event ExampleServiceEventHandler ProcessingStarted;
event ExampleServiceProgressEventHandler ProgressChanged;
event ExampleServiceProcessingEventHandler ProcessingCompleted;
bool StartProcessing();
void StopProcessing();
}
public delegate void ExampleServiceEventHandler();
public delegate void ExampleServiceProgressEventHandler(double progress);
public delegate void ExampleServiceProcessingEventHandler(ProcessingStatus status);
Реалізація сервісу:
public class ExampleService : IExampleService
{
public event ExampleServiceEventHandler ProcessingStarted = delegate { };
public event ExampleServiceProgressEventHandler ProgressChanged = delegate { };
public event ExampleServiceProcessingEventHandler ProcessingCompleted = delegate { };
private CancellationTokenSource? _cancellationTokenSource;
public bool StartProcessing()
{
if (_cancellationTokenSource != null) return false;
_cancellationTokenSource = new CancellationTokenSource();
Task.Run(Process);
ProcessingStarted();
return true;
}
public void StopProcessing()
{
_cancellationTokenSource?.Cancel();
}
private void Process()
{
for (int i = 1; i <= 100; i++)
{
if (_cancellationTokenSource?.IsCancellationRequested == true)
{
ProcessingCompleted(ProcessingStatus.Interrupted);
return;
}
ProgressChanged(i);
Thread.Sleep(100);
}
ProcessingCompleted(ProcessingStatus.Success);
}
}
Налаштування сервера:
var server = WitComServerBuilder.Build(options =>
{
options.WithService(new ExampleService());
options.WithWebSocket("http://localhost:5000", 10);
options.WithJson();
options.WithEncryption();
});
server.StartWaitingForConnection();
Підключення клієнта:
var client = WitComClientBuilder.Build(options =>
{
options.WithWebSocket("ws://localhost:5000");
options.WithJson();
options.WithEncryption();
});
await client.ConnectAsync(TimeSpan.FromSeconds(5), CancellationToken.None);
var service = client.GetService();
service.ProcessingStarted += () => Console.WriteLine("Обробка розпочата");
service.ProgressChanged += progress => Console.WriteLine($"Прогрес: {progress}%");
service.ProcessingCompleted += status => Console.WriteLine($"Обробка завершена: {status}");
service.StartProcessing();
Приклади та репозиторій на GitHub
Ознайомтесь з повним вихідним кодом та прикладами для WitCom:
- Репозиторій на GitHub: WitCom
- Приклади міжпроцесного зв'язку: Examples/InterProcess
- Приклади мульти-клієнтських сервісів: Examples/Services
Переваги WitCom
- Простота використання: WitCom усуває зайвий код, забезпечуючи інтуїтивно зрозумілий процес налаштування.
- Модель на основі подій: Його орієнтований на події (Event-Driven Model) дизайн робить його ідеальним для реактивних та реальних додатків.
- Продуктивність: Такі функції, як пам'ятні файли, оптимізують продуктивність для локальних міжпроцесних зв'язків (IPC).
- Гнучкість: Різноманітні варіанти транспорту та серіалізації відповідають різним вимогам.
WitCom дає змогу розробникам використовувати потужний, але простий фреймворк для сучасної клієнт-серверної комунікації.
Комбінуючи потужні функції, високу продуктивність та гнучкість, WitCom відповідає вимогам як маломасштабних, так і корпоративних систем. Чи то створення адаптивних додатків, чи керування масштабованими розподіленими системами, WitCom є значним кроком вперед серед фреймворків для комунікації в .NET.
Перекладено з: WitCom: Modernizing Client-Server Communication