Запровадження Multi-Tenancy у Laravel
Гнучкість фреймворку Laravel дозволяє нам також реалізувати мультитенантну архітектуру.
Багатокористувацький доступ — це архітектура програмного забезпечення, в якій один екземпляр програми обслуговує кілька програм клієнтів.
У цій публікації ми розглянемо концепцію багатокористування в Laravel, її переваги та способи її реалізації. Ми також розглянемо необхідні конфігурації, практичні приклади коду та кроки, які допоможуть забезпечити безперебійну роботу вашої мультитенантної програми.
Кожного орендаря можна розглядати як окремого клієнта зі своїми власними даними, ізольованими від інших орендарів.
Приблизний час читання: 5 хвилин
Що таке Multi-Tenancy?
Мультитенантність — це архітектура, яка дозволяє одній програмі розміщувати кількох орендарів (клієнтів) із їхніми даними та конфігураціями. Дані кожного орендаря ізольовані від інших, що забезпечує конфіденційність і безпеку даних. Мультиоренда може бути реалізована різними способами, зокрема:
- Сінґоло база даних, Schema спільний доступ: усі
tenant
вони поділяють те саме база даних e le stesse tabelle. - Database singolo, Schemi відокремлено: i
tenant
вони поділяють те саме база даних ma hanno il proprio schema. - Database multipli: ogni tenant ha il proprio база даних.
Переваги моделі
- Масштабованість: простіше масштабувати додаток для нових
tenant
без серйозних змін. - Економічна ефективність: зменшує витрати на інфраструктуру та обслуговування за рахунок спільного використання ресурсів
tenant
. - Централізоване обслуговування: спрощує оновлення та обслуговування, оскільки існує лише один екземпляр програми.
- Досвід користувача покращено: настроювані середовища для різних
tenant
.
Впровадження MultiTenancy Laravel
Для Laravel було розроблено декілька інструментів, які допомагають реалізувати мультитенантні архітектури, наприклад:
hyn/multi-tenant
- Керуйте архітектурою програмного забезпечення, в якій один екземпляр програми обслуговує кілька клієнтів (або облікових записів користувачів), забезпечуючи безпеку даних і конфіденційність для кожної групи користувачів. Цей інструмент часто використовується для надання послуг SaaS (програмне забезпечення як послуга).tenancy/tenancy
: гнучке рішення для багатоквартирність Laravel. Давайте розглянемо деякі функції нижче:- Автоматична оренда: Invece di modificare la configurazione del tuo progetto, il pacchetto avvia automaticamente il multi-tenancy in background. Cambia le connessioni al база даних, separa le cache, aggiunge prefissi ai filesystem e altro ancora;
- Автоматичне розділення даних: Il pacchetto rende automaticamente tenant-aware: база даних, cache, filesystem, code e store Redis. Non devi modificare nulla se hai già scritto il tuo progetto;
- Інтеграція з іншими пакетами: Poiché la modalità automatica cambia la connessione al база даних predefinita, molti altri pacchetti utilizzeranno questa connessione. Ad esempio, puoi utilizzare Laravel Nova у програмі орендаря для керування ресурсами орендаря;
- Архітектура, керована подіями: Логіка запуску з кількома орендарями, логіка створення після орендаря та інші операції відбуваються через події. Ви можете налаштувати кожен аспект;
- Оренда кількох баз даних: якщо ви не бажаєте використовувати підхід бази даних для кожного клієнта, пакет пропонує шаблони для обмеження шаблонів поточним клієнтом, навіть для шаблонів, які безпосередньо не пов’язані з орендарем;
У цій статті ми будемо використовувати інструмент tenancy/tenancy
, що забезпечує міцну основу для багатокористувацького використання в Laravel. Отже, давайте крок за кроком подивимося, як реалізувати багатокористування в Laravel.
Крок 1: Встановіть пакет
Спочатку давайте встановимо пакет tenancy/tenancy
з композитором:
composer require tenancy/оренда
Крок 2. Опублікуйте свою конфігурацію
Давайте тепер приступимо до публікації файлів конфігурації пакета:
php artisan vendor:publish --tag=tenancy
Крок 3: Встановіть Tenancy
Тепер приступимо до налаштування файлу tenancy.php
, який знаходиться в каталозі config
для задоволення потреб програми.
Отже, наступні параметри:
- сховище_драйвер, сховище: puoi configurare il driver per lo storage dei tenant. Ad esempio, puoi scegliere tra Redis o un база даних. Leggi di più sulla pagina dei драйвери зберігання.
- простір імен tenant_route: встановлює простір імен контролера, який використовується для маршрутів
routes/tenant.php
. - exempt_domains: якщо відвідується ім’я хоста, яке є в цьому масиві, маршрути в
tenant.php
вони не будуть записані, що дозволить вам використовувати ті самі маршрути, що містяться в цьому файлі. - база даних: Imposta la connessione al база даних per i dati del tenant.
- радіс: Налаштуйте підключення Redis для ваших даних клієнта.
- cache: замінює примірник
CacheManager
підтримувати багатоквартирність. - файлова система: налаштуйте місце зберігання файлів для орендарів.
Для повного посібника читайте документацію.
Крок 4. Створіть шаблон орендаря
Створіть шаблон Tenant
представляти кожного орендаря у вашій заявці:
php artisan make:model Tenant -m
У файлі міграції визначте структуру таблиці tenants
:
Schema::create('tenants', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('domain')->unique();
$table->timestamps();
});
Крок 5. Визначте свого орендаря
Визначте свого орендаря за доменом або субдоменом. Потім ми оновлюємо модель Tenant
включити логіку ідентифікації орендаря:
простір імен App\Models;
використовуйте Illuminate\Database\Eloquent\Model;
використовуйте Tenancy\Identification\Contracts\Tenant як TenantContract;
використовувати Tenancy\Affects\Connections\Contracts\ProvidesDatabase;
class Tenant extends Model implements TenantContract, ProvidesDatabase
{
protected $fillable = ['name', 'domain'];
публічна функція getTenantKey(): рядок
{
повернути «домен»;
}
публічна функція getConnectionName(): рядок
{
return 'tenant';
}
публічна функція configureDatabase($event): void
{
$event->useConnection('tenant', [
'database' => 'tenant_' . $this->id,
]);
}
}
Отже, є три методи: getTenantKey
ідентифікувати домен, getConnectionName
визначити зв'язок e configureDatabase
щоб налаштувати підключення до правильної БД.
Крок 6: Налаштуйте проміжне програмне забезпечення
Ми створюємо проміжне програмне забезпечення che si occuperà di cambiate la connessione del база даних in base al tenant:
php artisan make:проміжне програмне забезпечення TenantMiddleware
Nel middleware, identifichiamo il tenant e impostiamo la connessione al база даних:
простір імен App\Http\Middleware; використовувати Closure; використовуйте Tenancy\Identification\Contracts\Tenant; class TenantMiddleware { публічна функція handle($request, Closure $next) { $hostname = $request->getHost(); $tenant = Tenant::where('domain', $hostname)->first(); if ($tenant) { tenant($tenant); } return $next($request); }}
Тож запишемо middleware TenantMiddleware
in app/Http/Kernel.php
:
protected $middlewareGroups = [
'web' => [
// other middleware...
\App\Http\Middleware\TenantMiddleware::class,
],
];
Крок 7: Migration
з Tenant
Створіть міграції для окремих клієнтів, указавши підключення клієнта:
php artisan make:migration create_posts_table --create=posts --path=database/migrations/tenant
У файлі міграції визначте структуру таблиці клієнта:
Schema::connection('tenant')->create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->timestamps();
});
Крок 8: Переміщення орендарів
Створіть команду для виконання міграцій для конкретних клієнтів:
php artisan make:command MigrateTenants
У командному файлі запустіть міграції для кожного клієнта:
простір імен App\Console\Commands;
використовуйте Illuminate\Console\Command;
використовувати App\Models\Tenant;
клас MigrateTenants розширює Command
{
protected $signature = 'migrate:tenants';
protected $description = 'Запускати міграції для всіх орендарів';
публічна функція handle()
{
Tenant::all()->each(function (Tenant $tenant) {
орендар ($ орендар);
$this->call('migrate', [
'--database' => 'тенант',
'--path' => 'database/migrations/tenant',
'--force' => правда,
]);
});
$this->info('Міграції клієнта завершено успішно.');
}
}
Крок 9: Seed
Дель Tenant
Створіть засівач для заповнення даних про орендаря:
php artisan make:seeder TenantSeeder
У сівальнику визначте дані для посіву:
простір імен Database\Seeders;
використовуйте Illuminate\Database\Seeder;
використовувати App\Models\Tenant;
клас TenantSeeder розширює Seeder
{
публічна функція run()
{
Tenant::create([
'name' => 'Орендар один',
'domain' => 'tenant1.example.com',
]);
Tenant::create([
'name' => 'Орендар два',
'domain' => 'tenant2.example.com',
]);
}
}
Запустіть бік:
php artisan db:seed --class=TenantSeeder
Практичні сценарії
Додатки SaaS
Multi-tenance ідеально підходить для програм SaaS, де кільком клієнтам (орендарям) потрібно використовувати одну програму, зберігаючи свої дані окремо.
Великі організації
Організації з декількома відділами можуть використовувати багатокористування для окремого керування даними відділів в одній програмі.
Керований хостинг
Хостинг-провайдери можуть використовувати мультиорендування, щоб пропонувати керовані послуги кільком клієнтам із ізольованим середовищем.