Senhores, desenvolvedores de aplicativos java. Hoje, você encontra uma maneira simples de usar a avaliação de código, cuja implementação permitirá que código arbitrário seja executado em um aplicativo em execução, o que, por sua vez, economizará muito tempo de CI / CD.
Por que eu preciso disso?
Se você tiver que desenvolver em uma arquitetura de microsserviço, especialmente em uma grande empresa, provavelmente já está familiarizado com a situação quando pode ver como um aplicativo funciona "em combate" apenas em estandes onde há integrações com outros microsserviços. E uma vez que nem todas as coisas podem ser verificadas localmente em stubs, para testar uma hipótese específica, você deve enviar um novo código (não o fato de que funciona corretamente) no repositório ... executá-lo através de CI / CD ... e só então por meio de logs para entender que em algum lugar algo deu errado. E é bom que os registros mostrem imediatamente onde você estava errado, porque caso contrário, esse processo de empurrar e correr ao longo dos pipelines pode se tornar o seu ciclo do samsara.
A execução do código inserido dinamicamente ajudará a resolver esse problema.
Como funciona?
Como todos sabemos, groovy é uma linguagem de programação totalmente compatível com Java com compilação dinâmica . Esses dois recursos do groovy nos ajudarão a implementar avaliação de código para aplicativos Java. Você pode descobrir facilmente como adicionar suporte groovy a um projeto Java sozinho. E darei um exemplo de como implementar a avaliação de código (em certo sentido, semelhante ao que você pode ver durante a depuração em seu IDE).
1) Vamos criar uma classe bacana, e nela uma string de modelo na qual colocaremos uma classe e um espaço reservado para o código inserido dinamicamente. Um exemplo de tal linha:
def EXPRESSION_CLASS_TEMPLATE = """
package dev.toliyansky.eval.service
class ExpressionClass implements java.util.function.Supplier<Object> {
def get() {
%s
}
}
"""
Observação: o pacote deve ser igual à classe na qual você escreverá este código.
Por que estamos implementando o Fornecedor será descrito abaixo.
2) Compilar e carregar dinamicamente esta classe.
REST , code .
def finalClassCode = String.format(EXPRESSION_CLASS_TEMPLATE, code) def supplier = groovyClassLoader.parseClass(finalClassCode) .getDeclaredConstructor() .newInstance() as Supplier<Object> def result = supplier.get()
%s .
, . Supplier , . Supplier<Object> .
.
code evaluation
web kubernetes. - , , , CI/CD POD , . , , - NullPointerException.
HTTP , applicationContext, . , CI/CD. . .
web spring boot
groovy java , , , , - evaluator-spring-boot-starter
, , spring boot starter. web http://host:port/eval WEB-UI, , . , . , , curl wget POD, http://host:port/eval/groovy GET POST .
, - readme .
Demonstrou como a avaliação de código pode economizar tempo na depuração de um aplicativo
Demonstrou como implementar avaliação de código em um projeto java
Demonstrou uma solução pronta na forma de uma partida de inicialização com mola.