surging — это распределённая микросервисная структура, которая обеспечивает высокопроизводительные RPC-вызовы удалённых служб. В качестве регистрационного центра для сервисов surging используются Zookeeper и Consul.
В структуру интегрированы хеш, случайный выбор, циклический перебор и минимальная нагрузка в качестве алгоритмов балансировки нагрузки. Для вызовов RPC можно выбрать netty или thrift, а также использовать асинхронную неблокирующую передачу.
Название surging происходит от английского слова «surging» и китайского выражения «滔滔», которое взято из известного высказывания актёра и режиссёра Чжоу Синьчжи. Название отражает идею о том, что технология .NET Core развивается быстро и мощно, как река, и может оказать значительное влияние на всю экосистему программного обеспечения.
Микросервисы должны быть легко комбинируемыми и разделяемыми, чтобы каждый бизнес-модуль мог быть зарегистрирован как сервис. Каждый сервис должен быть автономным, начиная с разработки и заканчивая развёртыванием. Сервисы выполняют только одну функцию и используют доменно-ориентированный дизайн для более детального разделения на модули.
Границы микросервисов определяются бизнес-потребностями и интеграцией соответствующих сервисных хостов. Для поддержки сервисов могут использоваться промежуточные слои, такие как кэширование, обмен сообщениями и хранение данных. Различные сервисы могут взаимодействовать через надёжные RPC-вызовы.
Что умеет surging?
Для установки surging можно использовать Docker Hub или NuGet.
Архитектура surging представлена на схеме.
Схема вызова цепочки показана на рисунке.
Конфигурация surging включает использование различных параметров, таких как адреса серверов, стратегии отказоустойчивости, таймауты выполнения, включение кэша и другие параметры, которые можно настроить в соответствии с требованиями проекта. options.ShuntStrategy = AddressSelectorMode.Polling; // Использование стратегии балансировки нагрузки с циклическим перебором.
options.NotRelatedAssemblyFiles = "Centa.Agency.Application.DTO\w|StackExchange.Redis\w" **// Исключение файлов, не требующих регистрации зависимостей.
// Использование log4net для записи журнала .UseLog4net("Configs/log4net.config")
// Использование NLog для записи журнала ошибок .UseNLog(LogLevel.Error, "Configs/NLog.config")
// Использование log4net для записи журнала ошибок .UseLog4net(LogLevel.Error)
// Использование log4net для ведения журнала .UseLog4net()
.Configure(build => build.AddEventBusFile("eventBusSettings.json", optional: false)) // Настройка с использованием файла eventBusSettings.json.
.Configure(build => build.AddCacheFile("cacheSettings.json", optional: false)) // Настройка с использованием файла cacheSettings.json.
.UseProxy() // Использование прокси.
.UseStartup()
.Build();
using (host.Run()) { Console.WriteLine($"Сервер запущен успешно, {DateTime.Now}."); }
{
"ConnectionString": "${Register_Conn}|127.0.0.1:8500", // ${Имя переменной среды} |Значение по умолчанию,
"SessionTimeout": "${Register_SessionTimeout}|50",
"ReloadOnChange": true
}
{
"Ip": "${Server_IP}|127.0.0.1",
"WatchInterval": 30,
"Port": "${Server_port}",
"Token": "true",
"Protocol": "${Protocol}|Tcp", //Поддержка протоколов Http, Tcp,
"RootPath": "${RootPath}",
"RequestCacheEnabled": false
}
{
"Ip": "${Server_IP}|0.0.0.0",//Частный IP-адрес контейнера
"WatchInterval": 30,
"Port": "${Server_port}|98",//Частный порт контейнера
"MappingIp": "${Mapping_ip}",//Публичный IP-адрес хоста
"MappingPort": "${Mapping_Port}",//Публичный порт хоста
"Protocol": "${Protocol}|Tcp", // Поддержка протоколов Http, Tcp
"Token": "true",
"RootPath": "${RootPath}",
"RequestCacheEnabled": false
}
[ServiceBundle("api/{Service}")]
[Authorization(AuthType = AuthorizationType.JWT)];
[Authorization(AuthType = AuthorizationType.AppSecret)];
ServiceLocator.GetService().SubscribeAt();
[Command(Strategy= StrategyType.Injection ,Injection = @"return null;")]
[Command(Strategy= StrategyType.Injection ,Injection = @"return
Task.FromResult(new Surging.IModuleServices.Common.Models.UserModel
{
Name=""fanly"",
Age=18
});",InjectionNamespaces =new string[] { "Surging.IModuleServices.Common"})]
[Command(Strategy= StrategyType.Injection ,Injection = @"return true;")]
В интерфейсных методах бизнес-логики добавьте следующий атрибут:
[Command(Strategy= StrategyType.Failover,FailoverCluster =3,RequestCacheEnabled =true)] //RequestCacheEnabled =true означает включение кэша
Добавьте следующий атрибут в интерфейсные методы бизнес-логики:
[InterceptMethod(CachingMethod.Get, Key = "GetUser_id_{0}", Mode = CacheTargetType.Redis, Time = 480)]
Добавьте следующий атрибут в интерфейсные методы бизнес-логики:
[InterceptMethod(CashingMethod.Remove, "GetUser_id_{0}", "GetUserName_name_{0}", Mode = CacheTargetType.Redis)]
На свойствах модели бизнес-логики можно добавить несколько ключей кэша:
[CacheKey(1)]
.AddClientIntercepted(typeof(CacheProviderInterceptor))
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )