Сервіс відкриттів
Сервіс управління конфігурацією відповідає за обробку конфігураційних файлів та доступ до конфігураційних параметрів. Це ключовий сервіс, оскільки забезпечує всю інформацію, необхідну для запуску компонентів системи. Конфігураційні дані витягуються по ієрархічній ланці, що дозволяє встановлювати пріоритети та узгоджувати параметри на різних рівнях системи. Крім того, сервіс надає можливість змінювати конфігурацію окремих структурних елементів без перезавантаження ядра обчислень, що забезпечує гнучкість та ефективність управління конфігураціями.
Архітектура
Сервіс відкриттів є обов'язковим елементом і не може бути вимкненим за допомогою конфігураційних налаштувань, оскільки він відповідає за завантаження цих конфігурацій. Послідовність запуску з'єднувачів починається з з'єднувача обчислень, а першим сервісом, який запускається в цьому з'єднувачі, є сервіс відкриттів. Таким чином, всі компоненти системи завжди мають доступ до своїх власних конфігураційних значень. Важливо відзначити, що сервіс відкриттів вимагає передачі абстрактного сервісу.
Опис, перелік параметрів конфігурацій, які підтримуються ядром обчислень, а також значення за замовчуванням дивись в розділ "Давайте почнем".
Застосування
Сервіс відкриттів використовується як основний елемент для обробки конфігурацій та налаштування кінцевих модулів,
таких як сервіси, адаптери, стратегії тощо. Цей сервіс також використовується в агенті функціональності fnAgent,
який має власний простір імен discovery. Цей простір імен відповідає за доступ до конфігураційних даних бізнес-схеми.
1.Використання в ядрі обчислень
import { inversify, ioredis } from '~packages';
import { AbstractConnector } from './abstract.connector';
import type { NRedisConnector } from '~types'
const { injectable } = inversify;
@injectable()
export class RedisConnector extends AbstractConnector implements IRedisConnector {
private _config: NRedisConnector.Config | undefined;
private _connection: IoRedis.IoRedis | undefined;
constructor(
// ... inject elements
) {
super();
}
private _setConfig(): void {
this._config = {
enable: this._discoveryService.getBoolean(
'connectors.redis.enable',
false
),
protocol: this._discoveryService.getString(
'connectors.redis.connect.protocol',
'redis'
)
// ... other configuration variables
}
}
}
де:
RedisConnector- клас зʼєднувача зRedisз частковим описом.IRedisConnector- інтерфейсRedisConnector.NRedisConnector- простір імен типіп, який описує перелік типів, які відносяться доRedisConnector._config- конфігураціяRedis._setConfig- приватна функція заповнення конфігураціїRedisзначеннями.enable- зміннаbooleanтипу, яка відповідає за приєднанняRedisдо роботи ядра обчислень.protocol- тип протоколу адресної строки доступу до серверуRedisсховища.
2.Використання в бізнес-схемі
import { setRouter } from '@x-fiber/calculator';
export const BusUsersAggRouter = setRouter<'get-one'>({
'get-one': {
GET: {
scope: 'private:user',
params: ['userId'],
handler: async (request, agents, context) => {
const { discovery } = agents.fnAgent;
type Config = {
integrations: {
system1: {
enable: boolean;
path: string;
fallbackPath: string;
};
};
urls: {
callbackUrl: string;
robinUrls: string[]
};
retryNumber: number;
certificatePath: string
};
const path = discovery.getMandatory<string, Config>('integrations.system1.path');
console.log(path) // string environment or throw e
},
},
},
});
де:
setRouterє вбудованою функцією ядра обчислень, що відповідає за створення опису документаМаршрутизатор.BusUsersAggRouter- це опис документаМаршрутизаторв прикладній областіBusUsersAgg.discovery- простір імен для доступу до методів з сервісу відкриттів DiscoveryService для агента функціональностіfnAgent.Config- тип опису конфігураційних параметрів бізнес-схеми.path- змінна строкового типу, яка отримує значення з конфігурації або викликає помилку у разі відсутності значення або ключа.
Завантаження конфігурацій
Ця ієрархія конфігураційних файлів встановлює пріоритет для використання налаштувань. Вона діє за принципом "перемагає той, хто має вищий пріоритет". Це означає, що у випадку конфлікту між параметрами, с истема віддасть перевагу тим, які мають більший пріоритет. Наприклад, налаштування, збережені у домашній папці користувача, будуть використані натомість тих, що розташовані у папці проекту.
Рівень 1. Зовнішній файл:
Доступ до зовнішнього файлу: /{homedir}/.fiber. Повний шлях до конкретної конфігурації:
/{homedir}/.fiber/{profile}/{kind}.{env}.config.json
де:
{homedir}- домашня директорія користувача..fiber- резервована директорія для профілів конфігураційX-Fiber.{profile}- профіль конфігурації, пов'язани й з веб-застосунком.{kind}.{env}.config.json- конфігураційний файл, де:{kind}- тип ядра (може бути,calculator,display,visualizer).{env}- тип середовища (наприклад,development,alpha-testing,productionтощо).
Рівень 2. Внутрішній файл:
Доступ до внутрішнього файлу: /{processdir}/config. Повний шлях до конкретної конфігурації:
`/{processdir}/config/{kind}.{env}.config.json`
де:
{processdir}- коренева директорія, з якої запущений процес (шлях доpackage.json).{kind}.{env}.config.json- конфігураційний файл, де:{kind}- тип ядра (може бути,calculator,display,visualizer).{env}- тип середовища (наприклад,development,alpha-testing,productionтощо).
Конфігурація ядра обчислень
Конфігурація ядра обчислень поділяється на простори імен, детальний опис який вказаний в розділі "Давайте почнем".
Приклад заповнення конфігураційого файлу має наступний вигляд:
{
"adapters": {
"http": {
"port": 12000
}
},
"services": {
"logger": {
"enable": true
}
}
}
Конфігурація бізнес-схеми
X-Fiber підтримує опис власних конфігураційних значень, які в подальшому є можливість використовувати при написані
бізнес-схеми завдяки простору імен discovery в агенті функціональності fnAgent, який надається в обробниках http
запитів та ws подій.
Загальний опис власної конфігурації повинен мати такий вигляд:
{
"application": {
"SysAdmin": {
"callbackUrl": "http://localhost:38012"
}
}
}
Доступ до поля можливий завдяки простору імен discovery агента функціональності fnAgent:
// ...
const url = agents.fnAgent.discovery.getMandatory('SysAdmin.callbackUrl')
console.log(url) // http://localhost:38012
// ...
Для опису та реєстрації власних конфігураційних даних сервіс відкриттів DiscoveryService використовує об'єкт
application у загальній структурі конфігураційного файлу. Ці дані можуть мати будь-який рівень вкладеності.
Під час завантаження конфігураційних файлів, сервіс відкриттів DiscoveryService використовує лише ті значення,
які описані в цьому об'єкті, і додає їх до пам'яті ядра обчислень.
Щодо використання власних змінних, не потрібно додавати application до ключів, оскільки після завантаження
конфігураційних файлів ядро обчислень автоматично відокремлює конфігураційні дані ядра обчислень від
конфігураційних даних бізнес-схеми.