Весь смысл Injection Dependency Injection (DI) заключается в том, чтобы сохранить исходный код приложения чистым и стабильным:
Практически каждый шаблон дизайна отделяет проблемы, чтобы будущие изменения влияли на минимальные файлы.
Конкретным доменом DI является делегирование конфигурации зависимостей и инициализации.
Если вы иногда работаете за пределами Java, вспомните, как source
часто используется во многих языках сценариев (Shell, Tcl и т. д. или даже import
в Python
Рассмотрим простой скрипт dependent.sh
:
#!/bin/sh
# Dependent
touch "one.txt" "two.txt"
archive_files "one.txt" "two.txt"
Сценарий зависит: он не будет успешно выполнен сам по себе (archive_files
не является
Вы определяете archive_files
в сценарии реализации archive_files_zip.sh
(используя в этом случае zip
):
#!/bin/sh
# Dependency
function archive_files {
zip files.zip "$@"
}
Вместо скрипта реализации source
-ing непосредственно в зависимом, вы используете контейнер injector.sh
, который обертывает s «компоненты»:
#!/bin/sh
# Injector
source ./archive_files_zip.sh
source ./dependent.sh
Зависимость archive_files
только что была введена в зависимый скрипт.
Вы могли бы ввести зависимость, которая реализует archive_files
с помощью tar
или xz
.
Если используется сценарий dependent.sh
зависимостей напрямую, этот подход будет называться поиск зависимостей (что противоположно инъекции зависимостей ):
#!/bin/sh
# Dependent
# dependency look-up
source ./archive_files_zip.sh
touch "one.txt" "two.txt"
archive_files "one.txt" "two.txt"
Теперь проблема в том, что зависимые " компонент "должен выполнить инициализацию.
Исходный код« компонента »не является ни чистым, ни стабильным, поскольку для каждого изменения в инициализации зависимостей требуется новая версия для файла исходного кода« компонентов ».
DI не так сильно акцентирован и популяризирован, как в Java-фреймворках.
Но это общий подход для разделения проблем:
Использование конфигурации только с поиском зависимостей не помогает, так как количество параметров конфигурации может меняться в зависимости от зависимости (например, новый тип аутентификации), а также количество поддерживаемых типов зависимостей (например, новый тип базы данных).
Вы случайно не используете Kubernetes 1.11.4? Это известная проблема с Beta release 1.11.4 . Исправление доступно в Beta Update (Kubernetes 1.11.6) . Пожалуйста, подтвердите вашу версию.
После контакта с Google Cloud Support мы смогли найти обходной путь для этой проблемы, хотя первопричина до сих пор остается неизвестной.
Обходной путь - определить сам формат журнала NGINX в виде строки JSON. Это позволит анализатору Google-Fluentd правильно анализировать полезную нагрузку как объект JSON. Это единственное решение, которое до сих пор работало для меня.
Для справки я использовал формат журнала:
log_format json_combined escape=json
'{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request_method":"$request_method",'
'"request":"$request",'
'"status": "$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
access_log /var/log/nginx/access.log json_combined;