Tagged: feature flag
[Grails] Избегайте использования Environment вне файлов конфигураций
Внутри Grails есть великолепный механизм для условного выполнения кода в зависимости от текущей среды (Environment).
Например внутри DataSource.groovy можно указывать различные настройки базы данных:
// environment specific settings
environments {
development {
dataSource {
dbCreate = "create-drop"
url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
}
}
}
Наверняка у вас почти в каждом файле конфигурации есть настройки под среду.
Но очень часто я натыкался на то что класс Environment.current начинает использоваться внутри контроллеров, вьюх и сервисов. А стандартный тег if и вовсе имеет атрибут для проверки текущего окружения:
<g:if env="test"> ... </g:if>
Я постепенно пришёл к тому что этого следует избегать, потому что теряется читаемость и гибкость. Вместо этого лучше явно создать опцию в Config.groovy, включать или выключать её в зависимости от среды а и потом проверять её. Вот например что делает этот код?
<g:if env="test">
<meta name="controller" content="${controllerName}"/>
<meta name="action" content="${actionName}"/>
</g:if>
На самом деле этот код добавляет имя контроллера и экшена которые отрисовли страницу и они потом проверяются функциональным тестом. Это это бывает очень удобно для дебага.
А теперь давайте мы создадим в файле Config.groovy опцию
environments {
development {
com.example.showActionNameInPageMeta = true
}
test {
com.example.showActionNameInPageMeta = true
}
production {
com.example.showActionNameInPageMeta = false
}
}
и теперь
<g:if test="${grailsApplication.config.com.example.showActionNameInPageMeta}">
<meta name="controller" content="${controllerName}"/>
<meta name="action" content="${actionName}"/>
</g:if>
В результате эта опция улучшила читаемость кода. Кроме того теперь мы всегда можем добавить новое окружение, например testFunctional для функциональных тестов и внутри включить нашу опцию, при этом не переписывая код.
И что особенно важно, что в случае каких то проблем в продакшене сисадмин может поменять конфигурацию и перезапустить сервер не перекомпилируя приложение.
Кроме того, все такие опции теперь не размазаны по коду а лежат в одном месте где их все можно посмотреть.
В более широком смысле такой подход называется Feature flag, и его активно используют например в Amazon.