В многопользовательской среде, используя. Net Core, как настроить службу Windows для целевой базы данных - PullRequest
0 голосов
/ 02 апреля 2020

Быстрая версия вопроса:

Как настроить службу. Net Core windows для целевой базы данных в мультитенантной среде, где у каждого арендатора есть собственная база данных, и все они работать на том же самом сервере?

Некоторая справочная информация:

Я работаю над новой windows службой и, поскольку она совершенно новая, мы собираемся использовать. Net Core. Я прочитал эту страницу и в ней говорится о том, как установить переменную среды в приложении IIS, azure, глобально, для каждого командного окна, но на самом деле не упоминается служба windows, azure Devops или как работать с мультитенантной средой.

Лучшее, что я могу понять, это то, что вы должны установить переменную окружения в параметрах запуска для windows службы, как только она будет создана, но это выглядит как fr agile. Это становится большей проблемой, когда вы смотрите на 25 с потенциалом 100 или более (мы небольшая развивающаяся компания). Мысль о необходимости go вернуть назад и установить все эти переменные вручную, если мы решим перенести службы на другой сервер, не очень приятна.

Поэтому более длинная версия вопроса такова: я на правильном пути? или есть какой-то лучший способ настроить это так, чтобы это не стало таким ручным процессом? Возможно, установка переменной, когда служба развернута на сервере, сработает? Как бы я это сделал с azure devops?

Edit 1

Вот представление среды, в которой мы запускаем эти сервисы.

Databases (separate machine):
Shared1
Db1
Db2
Db3

Machines:
Server1

Windows Services:
Service1
Service2
Service3

базы данных работают на сервере БД. Для каждой службы существует одна база данных, и есть общая база данных, в которой хранится некоторая общая информация (не думаю, что это актуально для вопроса). Есть один сервер. На этом сервере есть копии кода, который должен работать как windows сервис. Количество копий сервиса соответствует количеству баз данных. Таким образом, для приведенного выше сценария: Serivce1 подключается к Db1, Service2 подключается к Db2, Service3 подключается к Db3, и т.д. c ...

Так как у меня есть только на одной машине, если я установлю переменную окружения на что-то вроде ASPNETCORE_DB1, тогда все три службы будут читать эту переменную и подключаться к Db1, что не должно происходить.

Если я установлю несколько переменных окружения: ASPNETCORE_Db1, ASPNETCORE_Db2, ASPNETCORE_Db2, как каждая из служб узнает, какую переменную среды читать?

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

У меня такое ощущение, что вы смешиваете здесь немногое.

  1. Если вы хотите иметь разные настройки для каждой среды, вам просто нужно использовать метод CreateHostBuilder. Вы можете прочитать об этом здесь . Затем вам нужно установить переменную окружения ASPNETCORE_ENVIRONMENT на компьютере, где вы размещаете приложение. При таком подходе приложение во время выполнения выбирает правильную конфигурацию. Однако, пожалуйста, не храните конфиденциальные данные в ваших конфигурационных файлах. При таком подходе у вас есть один скомпилированный код для всех клиентов.
  2. Вы можете передать конфигурацию при создании приложения. Для этого вы должны определить группы переменных (на Azure DevOps) (по одной на тенат) и flu sh свои секреты в конфигурационном файле. Кроме того, вы можете использовать параметры времени выполнения для определения целевого арендатора. Все еще недостаточно защищен, так как в артефакте (скомпилированном коде) вы можете найти секреты. При таком подходе у вас есть один скомпилированный код для каждого арендатора.
  3. Если вы можете использовать Azure KeyVault, я бы порекомендовал этот подход. Вы можете создать одно KeyVault для каждого тената, а затем в CreateHostBuilder загрузить секреты из правильного KeyVault (если вы назовете KeyVault именем арендатора, это упростит выбор правильного KeyVault). Вы можете прочитать об этом здесь .

По вашему вопросу я предположил, что ваш tenat = envrionemnt. Если нет, то вы можете иметь одно KeyVault на env, такое как Dev, QA и PROD. Затем вы должны назвать свои секреты следующим образом: {tenant_name} _ {secret_name}. Вы должны загрузить все секреты при запуске приложения, а затем во время выполнения (на основе идентификатора арендатора) выбрать правильный секрет.

Надеюсь, это поможет вам принять правильное решение.

0 голосов
/ 15 апреля 2020

Лучший способ получить соответствующую строку подключения к базе данных для каждой переменной среды. Простые шаги:

  1. Определите одну и ту же переменную среды с разными значениями (строка подключения) в каждой среде / машине вручную
  2. Получите значение этой переменной среды в приложении-сервисе windows и используйте его значение в качестве строки подключения к базе данных, если не ноль, в противном случае используйте строку подключения по умолчанию.

Редактировать: Для нескольких служб windows на одном компьютере я предлагаю указать строку подключения в соответствии с именем текущей службы.

Как служба Windows может определить свое имя службы?

...