1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/stoneson-stone-surging

Клонировать/Скачать
README.md 11 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 20:14 0870f17

surging — это распределённая микросервисная структура, которая обеспечивает высокопроизводительные RPC-вызовы удалённых служб. В качестве регистрационного центра для сервисов surging используются Zookeeper и Consul.

В структуру интегрированы хеш, случайный выбор, циклический перебор и минимальная нагрузка в качестве алгоритмов балансировки нагрузки. Для вызовов RPC можно выбрать netty или thrift, а также использовать асинхронную неблокирующую передачу.

Название surging происходит от английского слова «surging» и китайского выражения «滔滔», которое взято из известного высказывания актёра и режиссёра Чжоу Синьчжи. Название отражает идею о том, что технология .NET Core развивается быстро и мощно, как река, и может оказать значительное влияние на всю экосистему программного обеспечения.

Микросервисы должны быть легко комбинируемыми и разделяемыми, чтобы каждый бизнес-модуль мог быть зарегистрирован как сервис. Каждый сервис должен быть автономным, начиная с разработки и заканчивая развёртыванием. Сервисы выполняют только одну функцию и используют доменно-ориентированный дизайн для более детального разделения на модули.

Границы микросервисов определяются бизнес-потребностями и интеграцией соответствующих сервисных хостов. Для поддержки сервисов могут использоваться промежуточные слои, такие как кэширование, обмен сообщениями и хранение данных. Различные сервисы могут взаимодействовать через надёжные RPC-вызовы.

Что умеет surging?

  1. Упрощать вызовы сервисов, позволяя выполнять удалённые вызовы между сервисами без дополнительных вмешательств, используя правила сервисов.
  2. Автоматически регистрировать и обнаруживать сервисы, не требуя настройки адресов поставщиков услуг. Регистрационные центры используют ServiceId или RoutePath для поиска адресов и метаданных поставщиков услуг, а также могут плавно добавлять или удалять поставщиков услуг.
  3. Обеспечивать мягкую балансировку нагрузки и отказоустойчивость, настраивая внутренние алгоритмы балансировки нагрузки и правила отказоустойчивости.
  4. Предоставлять распределённое кэширование через алгоритм согласованности хэшей и возможность автоматического удаления нездоровых сервисов из списка.
  5. Поддерживать обмен событиями через адаптацию к шинам событий, обеспечивая взаимодействие по модели публикации-подписки.
  6. Предлагать контейнеризацию, непрерывную интеграцию и непрерывное развёртывание, создавая интегрированную платформу DevOps для автоматизации процессов сборки, развёртывания, тестирования и выпуска проектов, повышая надёжность, стабильность, эластичность и безопасность производственной среды.
  7. Предлагать модульное проектирование бизнес-процессов, позволяя гибко и эффективно развертывать различные версии функциональных модулей бизнеса.

Для установки 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}")]

JWT-аутентификация, добавление атрибута к интерфейсным методам:

   [Authorization(AuthType = AuthorizationType.JWT)];

Аутентификация AppSecret, добавление атрибута к интерфейсным методам:

 [Authorization(AuthType = AuthorizationType.AppSecret)];

Подписка:

ServiceLocator.GetService().SubscribeAt();

Добавление стратегий отказоустойчивости, деградации и принудительной деградации:

  • Добавление стратегии отказоустойчивости Injection, скрипт-инъекция:
[Command(Strategy= StrategyType.Injection ,Injection = @"return null;")]
  • Добавление стратегии отказоустойчивости Injection, локальный модуль-инъекция:
[Command(Strategy= StrategyType.Injection ,Injection = @"return 
Task.FromResult(new Surging.IModuleServices.Common.Models.UserModel
         {
            Name=""fanly"",
            Age=18
         });",InjectionNamespaces =new string[] { "Surging.IModuleServices.Common"})] 
  • Добавление стратегии отказоустойчивости Injection, модуль-инъекция:
[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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/stoneson-stone-surging.git
git@api.gitlife.ru:oschina-mirror/stoneson-stone-surging.git
oschina-mirror
stoneson-stone-surging
stoneson-stone-surging
master