Службы KIS. Разработка — различия между версиями
Admin (обсуждение | вклад) (→Документация) |
Admin (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | + | Этот файл продублирован на svn | |
| + | = Общие требования = | ||
| + | |||
| + | == Структура файлов == | ||
| − | |||
* каждая служба живет в своем каталоге | * каждая служба живет в своем каталоге | ||
* имена каталогов в '''ВЕРХНЕМ''' регистре | * имена каталогов в '''ВЕРХНЕМ''' регистре | ||
| Строка 10: | Строка 12: | ||
* имя исполняемого файла по управлению службой должно заканчиваться на '''_ctl''' | * имя исполняемого файла по управлению службой должно заканчиваться на '''_ctl''' | ||
* настройка подключения к БД должна храниться в файле kis.ini | * настройка подключения к БД должна храниться в файле kis.ini | ||
| − | * настройки службы должны храниться в | + | * настройки службы должны храниться в <имя''службы>.ini файле рядом с исполнимыми файлами. см. [Конфигурационные файлы KIS](Конфигурационные''файлы_KIS "wikilink") |
| + | Пример расположения служб | ||
| − | + | <pre class="">KIS_SRV | |
| − | <pre> | ||
| − | KIS_SRV | ||
├─KIS_MQTT | ├─KIS_MQTT | ||
│ ├──kis_mqtt_srv.exe | │ ├──kis_mqtt_srv.exe | ||
| Строка 27: | Строка 28: | ||
├──kis.ini | ├──kis.ini | ||
├──kis_ehr_connector.ini | ├──kis_ehr_connector.ini | ||
| − | └──LOG | + | └──LOG</pre> |
| − | </pre> | ||
| − | |||
Именования файлов | Именования файлов | ||
| Строка 36: | Строка 35: | ||
* _app.EXE в виде отдельного приложения (на этапе разработки) | * _app.EXE в виде отдельного приложения (на этапе разработки) | ||
| − | + | == Имя службы windows == | |
Имя службы должно быть латинскими буквами в нижнем регистре (с подчеркиваниями). Примеры названий служб: | Имя службы должно быть латинскими буквами в нижнем регистре (с подчеркиваниями). Примеры названий служб: | ||
| Строка 46: | Строка 45: | ||
* kis_simi_epic | * kis_simi_epic | ||
| + | == Взаимодействие с postgresql == | ||
| + | |||
| + | === Аутентификация в БД === | ||
| − | |||
* каждая служба должна работать под своим уникальным пользователем (для того чтобы можно было мониторить работу службы со стороны БД) | * каждая служба должна работать под своим уникальным пользователем (для того чтобы можно было мониторить работу службы со стороны БД) | ||
| − | * имя пользователя должно быть | + | * имя пользователя должно быть |
| − | ** большими буквами | + | ** большими буквами |
** совпадать с именем службы | ** совпадать с именем службы | ||
| − | ** заканчиваться на | + | ** заканчиваться на "SRV" |
| + | |||
| + | логин пароль храним в открытом виде в файле ini (<имя службы>.ini) | ||
| − | |||
* [Postgresql] | * [Postgresql] | ||
** user | ** user | ||
| Строка 60: | Строка 62: | ||
** password_crypt | ** password_crypt | ||
| − | === application_name в сессии | + | === application_name в сессии postgresql === |
| − | Любая сессия должна себя идентифицировать установив application_name в формате | + | Любая сессия должна себя идентифицировать установив application_name в формате <имя файла> (версия). Например: |
| − | + | kis_mqtt.exe (1.0.0.1) | |
Ниже пример кода: | Ниже пример кода: | ||
| − | <source> | + | <source > |
procedure TdmMain.conAfterConnect(Sender: TObject); | procedure TdmMain.conAfterConnect(Sender: TObject); | ||
var | var | ||
| Строка 79: | Строка 81: | ||
</source> | </source> | ||
| + | === Требования к работоспособности при потере соединения === | ||
| + | * Служба должна корректно отрабатывать ошибки, связанные с потерей соединения с БД и пытаться восстановить соединение самостоятельно. | ||
| − | === | + | === Размер work_mem === |
| − | + | для сессии которая слушает pg_listen (и только для нее) нужно проставить | |
| + | |||
| + | set session work_mem='64kB' | ||
| − | + | == Зависимость от другого ПО == | |
* служба не должна зависеть от стороннего ПО, такого как | * служба не должна зависеть от стороннего ПО, такого как | ||
| Строка 92: | Строка 98: | ||
** клиент БД | ** клиент БД | ||
| − | == Диагностика работы службы == | + | == Диагностика работы службы == |
| + | |||
* служба должна писать информацию о событиях в файл лога. Рекомендуется использовать SynLog из библиотеки Synopse mORMot framework | * служба должна писать информацию о событиях в файл лога. Рекомендуется использовать SynLog из библиотеки Synopse mORMot framework | ||
* файлы логов должны быть легко просматриваемы сторонними программами. | * файлы логов должны быть легко просматриваемы сторонними программами. | ||
| − | == WEB API == | + | == WEB API == |
| + | |||
Здесь описаны методы http, которые должна реализовать служба, чтобы можно было мониторить состояние службы. Эти методы будут вызвать сторонние приложения (админка kis_z, или другие сторонние программы) для отображения статуса работы службы | Здесь описаны методы http, которые должна реализовать служба, чтобы можно было мониторить состояние службы. Эти методы будут вызвать сторонние приложения (админка kis_z, или другие сторонние программы) для отображения статуса работы службы | ||
| − | === | + | === GET /checkstatus === |
Метод возвращает 1 в теле ответа, если сервис работает правильно | Метод возвращает 1 в теле ответа, если сервис работает правильно | ||
| Строка 105: | Строка 113: | ||
=== GET /info === | === GET /info === | ||
| − | возвращает json, в котором есть настройки, текущий статус сервера (есть подключение к БД и т.п.) | + | возвращает json, в котором есть настройки, текущий статус сервера (версия сервиса, есть подключение к БД и т.п.) Пример |
| − | Пример | ||
| − | < | + | <pre class=""> {"FileVer": "1.0.0.6", |
| − | + | "StartDT": "2018-10-17T16:08:16.867+03:00", | |
| − | + | "AppExe": "C:\\KIS_SRV\\KIS_MQTT_SRV\\kis_mqtt_srv.exe", | |
| − | + | "DBInfo": { | |
| − | + | "ConnectStr": "192.168.1.16:7432\/emiac1", | |
| − | + | "ConnectStatus": "connected", | |
| − | + | "lastMessageRecivedDT": "2019-02- 04T08:20:58.302+03:00", | |
| − | + | "MeessageCount": 35024, | |
| − | + | "ListenState": "Active" | |
| − | + | }, | |
| − | + | "MQTTInfo": { | |
| − | + | "ConnectStr": "192.168.1.16:1883", | |
| − | + | "ConnectStatus": "active", | |
| − | + | "ClientID": "V5nZpiOiintKZ1wgeg2K1f1", | |
| − | + | "LastSendDT": "2019-02-04T08:20:58.302+03:00", | |
| − | + | "MessageCount": 35008 }</pre> | |
| − | + | === GET /stat === | |
| − | |||
| − | </ | ||
| − | |||
| − | === GET /stat === | ||
Возвращает json со статистикой работы за период. Для построения графика нагрузки службы (метод необязателен и делается в последнюю очередь) | Возвращает json со статистикой работы за период. Для построения графика нагрузки службы (метод необязателен и делается в последнюю очередь) | ||
Пример: | Пример: | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | === GET /showlog === | + | <pre class="">{ |
| + | "last10hour": [{ | ||
| + | "dt": "2019-02-04T08:20:00.000+03:00", | ||
| + | "Count": 10 | ||
| + | }, | ||
| + | { | ||
| + | "dt": "2019-02-04T08:21:00.000+03:00", | ||
| + | "Count": 12 | ||
| + | }, | ||
| + | { | ||
| + | "dt": "2019-02-04T08:22:00.000+03:00", | ||
| + | "Count": 9 | ||
| + | }] | ||
| + | }</pre> | ||
| + | === GET /showlog === | ||
Показывает лог работы программы | Показывает лог работы программы | ||
| Строка 156: | Строка 157: | ||
Обычная html страница, которая показывает файл лог, который лежит на сервере | Обычная html страница, которая показывает файл лог, который лежит на сервере | ||
| − | === GET /admin | + | === GET /admin === |
Возвращает html страницу управления | Возвращает html страницу управления | ||
| − | === GET /checkupdate === | + | === GET /checkupdate === |
| − | Проверить наличие обновления (в БАЗЕ) | + | |
| − | * если обновление не найдено, то возвращает пустую строку | + | Проверить наличие обновления (в БАЗЕ) |
| + | |||
| + | * если обновление не найдено, то возвращает пустую строку | ||
* если обновление найдено, то возвращает версию обновления | * если обновление найдено, то возвращает версию обновления | ||
| − | === GET /curversion === | + | === GET /curversion === |
| − | возвращает строку, текущая версия сервиса | + | |
| + | возвращает строку, текущая версия сервиса | ||
| + | === POST /update === | ||
| + | Обновиться | ||
| − | |||
| − | |||
* проверить есть ли доставленное обнове в БД | * проверить есть ли доставленное обнове в БД | ||
* вызвать утилиту обновления для сервиса | * вызвать утилиту обновления для сервиса | ||
== Документация == | == Документация == | ||
| − | В исходных кодах в каталоге | + | |
| + | В исходных кодах в каталоге '''DOC''' обязательно должен быть файл readme.md в формате markdown (для редактирования можно использовать Typora). В нем должны быть следующие разделы: | ||
* Назначение | * Назначение | ||
| + | * Описание работы | ||
* Состав (список файлов с описанием) | * Состав (список файлов с описанием) | ||
* Установка | * Установка | ||
Версия 07:07, 22 октября 2019
Этот файл продублирован на svn
Содержание
Общие требования
Структура файлов
- каждая служба живет в своем каталоге
- имена каталогов в ВЕРХНЕМ регистре
- все имена файлов в нижнем регистре
- имя исполняемого файла службы должно заканчиваться на _srv
- имя службы должно начинаться с kis
- имя исполняемого файла по управлению службой должно заканчиваться на _ctl
- настройка подключения к БД должна храниться в файле kis.ini
- настройки службы должны храниться в <имяслужбы>.ini файле рядом с исполнимыми файлами. см. [Конфигурационные файлы KIS](Конфигурационныефайлы_KIS "wikilink")
Пример расположения служб
KIS_SRV
├─KIS_MQTT
│ ├──kis_mqtt_srv.exe
│ ├──kis_mqtt_ctl.exe
│ ├──kis.ini
│ │ kis_mqtt.ini
│ └──LOG - Папка с логами
└─KIS_EHR_CONNECTOR
├──kis_ehr_connector_srv.exe
├──kis_ehr_connector_ctl.exe
├──kis.ini
├──kis_ehr_connector.ini
└──LOG
Именования файлов
- _srv.exe севрис
- _ctl.exe управляющая программ
- _app.EXE в виде отдельного приложения (на этапе разработки)
Имя службы windows
Имя службы должно быть латинскими буквами в нижнем регистре (с подчеркиваниями). Примеры названий служб:
- kis_mqtt
- kis_ehr_connector (может сократить до kis_ehr)
- kis_pg_rest
- kis_supp
- kis_simi_epic
Взаимодействие с postgresql
Аутентификация в БД
- каждая служба должна работать под своим уникальным пользователем (для того чтобы можно было мониторить работу службы со стороны БД)
- имя пользователя должно быть
- большими буквами
- совпадать с именем службы
- заканчиваться на "SRV"
логин пароль храним в открытом виде в файле ini (<имя службы>.ini)
- [Postgresql]
- user
- password
- password_crypt
application_name в сессии postgresql
Любая сессия должна себя идентифицировать установив application_name в формате <имя файла> (версия). Например:
kis_mqtt.exe (1.0.0.1)
Ниже пример кода:
procedure TdmMain.conAfterConnect(Sender: TObject);
var
S : String;
begin
S := ExtractFileName(FSrvInfo.AppExe);
S := S+ ' (' + FSrvInfo.FileVer + ')';
con.ExecSQL('SET application_name = ''' + S + ''''); // устанваливаем переменную application_name (pg_stat_activity)
end;Требования к работоспособности при потере соединения
- Служба должна корректно отрабатывать ошибки, связанные с потерей соединения с БД и пытаться восстановить соединение самостоятельно.
Размер work_mem
для сессии которая слушает pg_listen (и только для нее) нужно проставить
set session work_mem='64kB'
Зависимость от другого ПО
- служба не должна зависеть от стороннего ПО, такого как
- вебсерверы (IIS, APACH)
- Net framework
- клиент БД
Диагностика работы службы
- служба должна писать информацию о событиях в файл лога. Рекомендуется использовать SynLog из библиотеки Synopse mORMot framework
- файлы логов должны быть легко просматриваемы сторонними программами.
WEB API
Здесь описаны методы http, которые должна реализовать служба, чтобы можно было мониторить состояние службы. Эти методы будут вызвать сторонние приложения (админка kis_z, или другие сторонние программы) для отображения статуса работы службы
GET /checkstatus
Метод возвращает 1 в теле ответа, если сервис работает правильно
GET /info
возвращает json, в котором есть настройки, текущий статус сервера (версия сервиса, есть подключение к БД и т.п.) Пример
{"FileVer": "1.0.0.6",
"StartDT": "2018-10-17T16:08:16.867+03:00",
"AppExe": "C:\\KIS_SRV\\KIS_MQTT_SRV\\kis_mqtt_srv.exe",
"DBInfo": {
"ConnectStr": "192.168.1.16:7432\/emiac1",
"ConnectStatus": "connected",
"lastMessageRecivedDT": "2019-02- 04T08:20:58.302+03:00",
"MeessageCount": 35024,
"ListenState": "Active"
},
"MQTTInfo": {
"ConnectStr": "192.168.1.16:1883",
"ConnectStatus": "active",
"ClientID": "V5nZpiOiintKZ1wgeg2K1f1",
"LastSendDT": "2019-02-04T08:20:58.302+03:00",
"MessageCount": 35008 }
GET /stat
Возвращает json со статистикой работы за период. Для построения графика нагрузки службы (метод необязателен и делается в последнюю очередь)
Пример:
{
"last10hour": [{
"dt": "2019-02-04T08:20:00.000+03:00",
"Count": 10
},
{
"dt": "2019-02-04T08:21:00.000+03:00",
"Count": 12
},
{
"dt": "2019-02-04T08:22:00.000+03:00",
"Count": 9
}]
}
GET /showlog
Показывает лог работы программы
Обычная html страница, которая показывает файл лог, который лежит на сервере
GET /admin
Возвращает html страницу управления
GET /checkupdate
Проверить наличие обновления (в БАЗЕ)
- если обновление не найдено, то возвращает пустую строку
- если обновление найдено, то возвращает версию обновления
GET /curversion
возвращает строку, текущая версия сервиса
POST /update
Обновиться
- проверить есть ли доставленное обнове в БД
- вызвать утилиту обновления для сервиса
Документация
В исходных кодах в каталоге DOC обязательно должен быть файл readme.md в формате markdown (для редактирования можно использовать Typora). В нем должны быть следующие разделы:
- Назначение
- Описание работы
- Состав (список файлов с описанием)
- Установка
- Настройка
- Обновление
- Мониторинг (проверка работоспособности, где и какие логи ведутся, как посмотреть какие ошибки возникали)
Содержимое файла markodown нужно продублировать на wiki (в typora есть экспорт)
Список сервисов
- KIS MQTT_connector брать пример отсюда