{"id":2934,"date":"2020-01-03T17:41:59","date_gmt":"2020-01-03T20:41:59","guid":{"rendered":"https:\/\/www.itexto.com.br\/devkico\/?p=2934"},"modified":"2020-01-06T06:25:50","modified_gmt":"2020-01-06T09:25:50","slug":"transformando-seus-scripts-groovy-em-microservicos-com-spring-boot","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=2934","title":{"rendered":"Transformando seus scripts Groovy em microservi\u00e7os com Spring Boot!"},"content":{"rendered":"\n<p>Quando o Spring Boot foi lan\u00e7ado este veio com uma ferramenta chamada &#8220;Spring CLI&#8221;. Brinquei um pouco com ela na \u00e9poca mas confesso que n\u00e3o vi muita gra\u00e7a: at\u00e9 agora.<\/p>\n\n\n\n<p>Dentre as suas funcionalidades h\u00e1 uma bastante interessante: a possibilidade de criarmos microservi\u00e7os usando scripts escritos em Groovy. Mas aten\u00e7\u00e3o: digo aqui <strong>micro<\/strong>servi\u00e7os MESMO: <strong>n\u00e3o use esta solu\u00e7\u00e3o para seus am\u00e1veis monolitos.<\/strong><\/p>\n\n\n\n<p>O tipo de aplica\u00e7\u00e3o que podemos criar com base nesta estrat\u00e9gia n\u00e3o chamaria sequer de microservi\u00e7os, mas <em>nanoservi\u00e7os<\/em>. Aplica\u00e7\u00f5es realmente \u00fateis, compostas por um n\u00famero muito pequeno de endpoints (um, dois no m\u00e1ximo) que s\u00e3o simples e podem quebrar diversos galhos na sua infraestrutura.<\/p>\n\n\n\n<p>N\u00e3o espere que este post v\u00e1 lhe servir de guia completo para este tipo de solu\u00e7\u00e3o: a ideia \u00e9 apenas apresentar a voc\u00eas esta possibilidade, mas n\u00e3o fiquem tristes, colocarei links que lhes ajudar\u00e3o a aprender mais sobre o assunto durante e ap\u00f3s sua leitura.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Spring CLI?<\/h2>\n\n\n\n<p>\u00c9 muito curioso que com tantos tutoriais, cursos e livros sobre Spring e Spring Boot (me salvo nesta: meu primeiro livro foi sobre o Spring Framework, n\u00e3o Spring Boot!) pouca gente mencione esta ferramenta. Talvez seja por que todo mundo pense da mesma forma na hora de escrever&#8230; talvez por que seja algo que n\u00e3o envolva a linguagem Java, mas sim Groovy&#8230; n\u00e3o entendo (mas tenho minhas suspeitas).<\/p>\n\n\n\n<p>Mas fato \u00e9 que apesar de pouco falado o Spring CLI existe desde que o Boot foi lan\u00e7ado. E era inclusive usado na \u00e9poca para demonstrar o poder do framework como algo super produtivo, bem na mesma pegada que o povo demonstrava o Node.js quando saiu.<\/p>\n\n\n\n<p>Se voc\u00ea j\u00e1 programou em Grails ou Express o Spring CLI lhe parecer\u00e1 familiar. \u00c9 uma interface de linha de comando (<strong>C<\/strong>ommand <strong>L<\/strong>ine <strong>I<\/strong>nterface) que voc\u00ea instala e pode executar as seguintes fun\u00e7\u00f5es:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Criar novos projetos baseados no Spring Boot, tal como faria no site <a href=\"https:\/\/start.spring.io\" class=\"rank-math-link\">https:\/\/start.spring.io<\/a> s\u00f3 que com sua linha de comando.<\/li><li>Executar &#8220;Spring Boot Groovy Scripts&#8221; (nosso assunto aqui).<\/li><li>Empacotar sua aplica\u00e7\u00e3o (seja ela Java ou estes scripts que menciono acima).<\/li><li>Outras pequenas fun\u00e7\u00f5es que li rapidamente e minha pregui\u00e7a impediu que me aprofundasse nelas.<\/li><\/ul>\n\n\n\n<p>O recurso ainda est\u00e1 ativo (e em cont\u00ednuo desenvolvimento!) no Spring Boot e voc\u00ea pode ler sua documenta\u00e7\u00e3o neste <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/2.2.2.RELEASE\/reference\/html\/spring-boot-cli.html\" class=\"rank-math-link\">link<\/a> em sua vers\u00e3o mais atual, ou seja, se \u00e9 mantido at\u00e9 hoje com certeza muita gente usa!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Instalando<\/strong> o Spring CLI<\/h3>\n\n\n\n<p>H\u00e1 duas formas de fazer isto: a f\u00e1cil, que ensino aqui e outra que voc\u00ea pode ver no link que mencionei agora h\u00e1 pouco. A f\u00e1cil e que recomendo \u00e9 usando o Sdkman (n\u00e3o conhece? Escrevi um guia a respeito que voc\u00ea pode ler aqui: <a href=\"https:\/\/www.itexto.com.br\/guias\/?guia=configurando-seu-ambiente-de-desenvolvimento-java-com-sdkman\" class=\"rank-math-link\">https:\/\/www.itexto.com.br\/guias\/?guia=configurando-seu-ambiente-de-desenvolvimento-java-com-sdkman<\/a> ).<\/p>\n\n\n\n<p>Execute o comando a seguir com o sdkman:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sdk install springboot 2.2.2.RELEASE<\/pre>\n\n\n\n<p>Para testar sua instala\u00e7\u00e3o execute o comando a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">spring --version<\/pre>\n\n\n\n<p>Ser\u00e1 apresentada para voc\u00ea a vers\u00e3o instalada. Mencionei aqui que vamos usar Groovy, certo? Voc\u00ea n\u00e3o precisa ter a linguagem instalada em seu computador. O Spring CLI j\u00e1 inclui tudo o que voc\u00ea precisa para poder trabalhar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nosso primeiro &#8220;Ol\u00e1 mundo!&#8221;<\/h2>\n\n\n\n<p>Cabe aqui um &#8220;Ol\u00e1 mundo&#8221; para mostrar a simplicidade do c\u00f3digo que escrevemos para termos um &#8220;nano servi\u00e7o&#8221; em execu\u00e7\u00e3o com o Spring CLI. Nosso pimeiro &#8220;Ol\u00e1 mundo&#8221; pode ser visto a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">@RestController\nclass OlaMundo {\n    @RequestMapping(\"\/\")    \n    String olaMundo() { \n      \"Que neg\u00f3cio simples!\"}\n}<\/pre>\n\n\n\n<p>Repare que n\u00e3o h\u00e1 instru\u00e7\u00f5es <strong>import<\/strong>. N\u00e3o \u00e9 necess\u00e1rio importar as classes: o pr\u00f3prio CLI vai import\u00e1-las para voc\u00ea de forma autom\u00e1tica. <\/p>\n\n\n\n<p>Note que \u00e9 apenas uma classe Groovy padr\u00e3o com algumas anota\u00e7\u00f5es: as mesmas que usamos ao implementar endpoints com o Spring tradicional: <strong>@RestController<\/strong> pra informar que a classe \u00e9 um controlador e <strong>@RequestMapping<\/strong> para informar que aquele m\u00e9todo disponibiliza um endpoint.<\/p>\n\n\n\n<p>E como fazemos para executar este script? Usando o comando spring novamente.<\/p>\n\n\n\n<p><code>spring run ola-mundo.groovy<\/code><\/p>\n\n\n\n<p>A sua linha de comando ir\u00e1 apresentar uma sa\u00edda que se voc\u00ea j\u00e1 programou com Spring com certeza j\u00e1 conhece:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1794\" height=\"770\" src=\"https:\/\/i1.wp.com\/www.itexto.com.br\/devkico\/wp-content\/uploads\/2020\/01\/image.png?fit=800%2C344&amp;ssl=1\" alt=\"\" class=\"wp-image-2938\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/image.png 1794w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/image-300x129.png 300w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/image-1024x440.png 1024w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/image-768x330.png 768w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/image-1536x659.png 1536w\" sizes=\"(max-width: 1794px) 100vw, 1794px\" \/><\/figure>\n\n\n\n<p>E se acessar o endere\u00e7o http:\/\/localhost:8080, o que voc\u00ea vai ver?<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"524\" height=\"120\" src=\"https:\/\/www.itexto.com.br\/devkico\/wp-content\/uploads\/2020\/01\/image-1.png\" alt=\"\" class=\"wp-image-2939\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/image-1.png 524w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/image-1-300x69.png 300w\" sizes=\"(max-width: 524px) 100vw, 524px\" \/><\/figure>\n\n\n\n<p>Paramos por aqui com este exemplo. Vamos para algo mais \u00fatil.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Um exemplo um pouco mais \u00fatil: monitorando o servidor usando Groovy e Actuator<\/h2>\n\n\n\n<p>No exemplo anterior voc\u00ea viu essencialmente como usando Groovy criamos um nano servi\u00e7o com Spring Boot, certo? Se \u00e9 Spring Boot, podemos usar <strong>todos<\/strong> dos seus recursos como o <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/html\/production-ready-features.html\" class=\"rank-math-link\">Actuator<\/a>, por exemplo: que nos permite monitorar os servi\u00e7os que implementamos.<\/p>\n\n\n\n<p>Ent\u00e3o que tal implementarmos aqui um micro servi\u00e7o que verifique se tudo est\u00e1 ok no nosso servidor? Ele poderia usar as valida\u00e7\u00f5es padr\u00f5es do <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/html\/production-ready-features.html\" class=\"rank-math-link\">Actuator<\/a> e ainda implementar nossas pr\u00f3prias regras de valida\u00e7\u00e3o. Imagine que por alguma raz\u00e3o \u00e9 necess\u00e1ria a presen\u00e7a do arquivo <em>felicidade.txt<\/em> no diret\u00f3rio home do usu\u00e1rio respons\u00e1vel por executar a aplica\u00e7\u00e3o. Como far\u00edamos isto?<\/p>\n\n\n\n<p>J\u00e1 que estamos falando de <strong>Spring<\/strong>, ser\u00e1 que nossos scripts podem ter seus pr\u00f3prios beans? A resposta \u00e9 sim: observe o c\u00f3digo que escrevi (est\u00e1 tudo em um mesmo arquivo chamado <em>monitor.groovy<\/em>):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">@Grab(\"spring-boot-starter-actuator\")\n\nimport org.springframework.boot.actuate.health.Health;\nimport org.springframework.boot.actuate.health.HealthIndicator;\n\n@Component\nclass FelicidadePresente implements HealthIndicator {\n    public Health health() {\n        def arquivo = new File(\"${System.getProperty('user.home')}\/felicidade.txt\")\n        arquivo.exists() ? Health.up().build() : Health.down().withDetail(\"infeliz\", \"Servidor infeliz\").build()\n    }\n}\n\n@RestController\nclass Monitor {\n\n   \n}<\/pre>\n\n\n\n<p>H\u00e1 algumas coisas interessantes aqui que voc\u00ea deve prestar aten\u00e7\u00e3o. Talvez voc\u00ea n\u00e3o conhe\u00e7a esta anota\u00e7\u00e3o: <strong>@Grab<\/strong>. Ela faz parte de um recurso <strong>incr\u00edvel<\/strong> do Groovy chamado <a href=\"http:\/\/docs.groovy-lang.org\/latest\/html\/documentation\/grape.html\" class=\"rank-math-link\">Grape<\/a>. Enquanto na maior parte das aplica\u00e7\u00f5es voc\u00ea usa solu\u00e7\u00f5es como Maven ou Gradle para resolver as suas depend\u00eancias, como voc\u00ea faria se precisasse escrever apenas um script? Faria sentido ter um arquivo pom.xml ou build.gradle s\u00f3 para execut\u00e1-lo? N\u00e3o! Se voc\u00ea incluir a anota\u00e7\u00e3o @Grab do Groovy em seu script, ele ir\u00e1 incluir estas depend\u00eancias no classpath de forma autom\u00e1tica durante a execu\u00e7\u00e3o: lindo, n\u00e9?<\/p>\n\n\n\n<p>No caso, eu precisei incluir as depend\u00eancias do Actuator no projeto e importar duas classes para implementar o nosso HealthIndicator: Health e&#8230; HealthIndicator.<\/p>\n\n\n\n<p>E dali pra baixo voc\u00ea que j\u00e1 conhece o Spring n\u00e3o ver\u00e1 novidade alguma: temos um componente e um controlador. Mas observou que este controlador \u00e9 uma classe vazia sem nenhum endpoint exposto? Precisamos dela para que o Spring CLI execute nossa aplica\u00e7\u00e3o. Experimente executar o script acima sem o controlador para ver o que ocorre.<\/p>\n\n\n\n<p>Com nosso c\u00f3digo pronto, basta executar agora:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">spring run monitor.groovy<\/pre>\n\n\n\n<p>E acessando <em>http:\/\/localhost:8080\/actuator\/health<\/em> temos a seguinte sa\u00edda:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"543\" height=\"387\" src=\"https:\/\/www.itexto.com.br\/devkico\/wp-content\/uploads\/2020\/01\/image-2.png\" alt=\"\" class=\"wp-image-2943\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/image-2.png 543w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/image-2-300x214.png 300w\" sizes=\"(max-width: 543px) 100vw, 543px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Mas e as configura\u00e7\u00f5es?<\/h3>\n\n\n\n<p>Mas se voc\u00ea j\u00e1 usou o Actuator antes deve ter observado que esta <strong>n\u00e3o \u00e9 a sa\u00edda padr\u00e3o<\/strong> do mesmo. Ent\u00e3o, aonde coloquei as configura\u00e7\u00f5es? Simples: voc\u00ea pode seguir uma conven\u00e7\u00e3o: se no diret\u00f3rio em que seu script se encontra existir uma pasta chamada <em>config<\/em>, basta deixar ali um arquivo <em>application.properties<\/em> ou <em>application.yml<\/em>. Seguem as minhas configura\u00e7\u00f5es:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">management.endpoints.web.exposure.include=*\nmanagement.endpoint.health.show-details=always<\/pre>\n\n\n\n<p>Voc\u00ea tamb\u00e9m pode passar suas configura\u00e7\u00f5es por linha de comando ou vari\u00e1veis de ambiente, <strong>exatamente como faria em uma aplica\u00e7\u00e3o baseada em Spring Boot<\/strong> por que, bem: <strong>esta \u00e9 uma aplica\u00e7\u00e3o baseada em Spring Boot<\/strong>. Sugiro a leitura <a href=\"https:\/\/www.baeldung.com\/spring-boot-cli\" class=\"rank-math-link\">deste post<\/a> do Baeldung sobre o Spring CLI que descreve em maiores detalhes como estas configura\u00e7\u00f5es se aplicam.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Minha aplica\u00e7\u00e3o pode ter mais de um arquivo de script?<\/h2>\n\n\n\n<p>Claro! Como voc\u00ea faz para executar a aplica\u00e7\u00e3o ent\u00e3o? Bem simples.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">spring run *.groovy<\/pre>\n\n\n\n<p>Ou qualquer outra express\u00e3o que seu shell aceite para a sele\u00e7\u00e3o de m\u00faltiplos arquivos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gerando um arquivo JAR execut\u00e1vel<\/h2>\n\n\n\n<p>Executar o seu script com o CLI \u00e9 bastante \u00fatil no ambiente de desenvolvimento, mas em produ\u00e7\u00e3o n\u00e3o \u00e9 uma boa ideia. Sendo assim, como voc\u00ea faz para implantar a sua aplica\u00e7\u00e3o? Basta usar o comando <strong>spring jar<\/strong> com a seguinte sintaxe essencial:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">spring jar [nome do arquivo .jar] [scripts que comp\u00f5em sua aplica\u00e7\u00e3o]<\/pre>\n\n\n\n<p>Nosso \u00faltimo exemplo poderia ser empacotado portanto com o comando a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">spring jar monitor.jar monitor.groovy<\/pre>\n\n\n\n<p>Feito: agora basta executar o comando <strong>java -jar monitor.jar<\/strong> e nossa aplica\u00e7\u00e3o estar\u00e1 dispon\u00edvel. Neste arquivo estar\u00e3o todas as depend\u00eancias necess\u00e1rias para a execu\u00e7\u00e3o do projeto. <\/p>\n\n\n\n<p>Apenas por curiosidade, o arquivo gerado para o nosso monitor tinha 24Mb de tamanho. Um overhead significativo para algo t\u00e3o pequeno, huh?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aplica\u00e7\u00f5es mais pr\u00e1ticas<\/h2>\n\n\n\n<p>N\u00e3o recomendo o uso do Spring CLI para a cria\u00e7\u00e3o de aplica\u00e7\u00f5es complexas, isto \u00e9, compostas por uma quantidade significativa de scripts (3 ou mais). Se voc\u00ea quer usar Groovy como linguagem no desenvolvimento de aplica\u00e7\u00f5es baseadas em Spring Boot, saiba que ele oferece <strong>total suporte<\/strong>, sendo inclusive uma das op\u00e7\u00f5es quando criamos um novo projeto no site <a href=\"https:\/\/start.spring.io\" class=\"rank-math-link\">Spring Initializr<\/a>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"556\" height=\"205\" src=\"https:\/\/www.itexto.com.br\/devkico\/wp-content\/uploads\/2020\/01\/image-3.png\" alt=\"\" class=\"wp-image-2944\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/image-3.png 556w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/01\/image-3-300x111.png 300w\" sizes=\"(max-width: 556px) 100vw, 556px\" \/><\/figure>\n\n\n\n<p>Mas existe um nicho de aplica\u00e7\u00f5es para o qual este tipo de desenvolvimento cai como uma luva. \u00c9 algo para o qual eu j\u00e1 uso Node.js faz um bom tempo inclusive: consiste em aplica\u00e7\u00f5es que sejam essencialmente utilit\u00e1rias, isto \u00e9, que desempenhem <strong>uma \u00fanica fun\u00e7\u00e3o<\/strong> e cuja intera\u00e7\u00e3o com as mesmas se d\u00ea atrav\u00e9s da disponibiliza\u00e7\u00e3o de um conjunto \u00ednfimo de endpoints. Seguem alguns exemplos:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Monitoramento de servidores, como o que escrevi acima.<\/li><li>Scripts que executem tarefas agendadas e que cujo resultado do processamento voc\u00ea precise acompanhar.<\/li><li>Ferramentas de integra\u00e7\u00e3o: quando implemento webhooks, por exemplo, costumo ter um destes scripts que sirva para me mostrar como \u00e9 o corpo das requisi\u00e7\u00f5es recebidas assim como seus cabe\u00e7alhos.<\/li><li>Ferramenta de consultas simples a bases de dados: algo que retorne, por exemplo, se ocorreu determinado evento em um per\u00edodo de tempo que n\u00e3o justificaria sua inclus\u00e3o na aplica\u00e7\u00e3o.<\/li><li>Seu script usa classes que fa\u00e7am parte de uma outra aplica\u00e7\u00e3o: voc\u00ea pode inclu\u00ed-las no seu classpath tanto na execu\u00e7\u00e3o quanto no empacotamento da sua solu\u00e7\u00e3o.<\/li><\/ul>\n\n\n\n<p>Podem ser tamb\u00e9m simplesmente aplica\u00e7\u00f5es compostas por um \u00fanico endpoint. Fiz uma prova de conceito, por exemplo, para o <a href=\"https:\/\/devall.com.br\" class=\"rank-math-link\">\/dev\/All<\/a> que era a implementa\u00e7\u00e3o do RSS do site e funcionou muito bem. Resumindo: \u00e9 uma ferramenta para a constru\u00e7\u00e3o de microservi\u00e7os (eu diria <em>nano<\/em>) que sejam <strong>realmente<\/strong> pequenos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Para saber mais<\/h2>\n\n\n\n<p>Achou legal esta possibilidade? Quer se aprofundar a respeito? Ent\u00e3o seguem alguns links que me ajudaram e com certeza v\u00e3o te ajudar tamb\u00e9m.<\/p>\n\n\n\n<p><strong>Documenta\u00e7\u00e3o oficial do Spring CLI<\/strong> &#8211; <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/html\/spring-boot-cli.html#cli-multiple-source-files\" class=\"rank-math-link\">https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/html\/spring-boot-cli.html#cli-multiple-source-files<\/a> <\/p>\n\n\n\n<p><strong>Introduction to Spring Boot CLI &#8211; Baeldung<\/strong> &#8211; excelente texto por sinal &#8211; <a href=\"https:\/\/www.baeldung.com\/spring-boot-cli\" class=\"rank-math-link\">https:\/\/www.baeldung.com\/spring-boot-cli<\/a><\/p>\n\n\n\n<p><strong>Documenta\u00e7\u00e3o do Actuator, que usei neste post como exemplo<\/strong> &#8211; <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/html\/production-ready-features.html\" class=\"rank-math-link\">https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/html\/production-ready-features.html<\/a><\/p>\n\n\n\n<p>Conhecia a solu\u00e7\u00e3o? J\u00e1 a experimentou? Compartilhe conosco sua experi\u00eancia com esta!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sabia que seus scripts Groovy podem ser transformados em microservi\u00e7os baseados em Spring Boot? Conhe\u00e7a o Spring CLI, a ferramenta que te possibilita justamente isto!<\/p>\n","protected":false},"author":1,"featured_media":1922,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5,62,87,59],"tags":[],"class_list":["post-2934","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-groovy","category-spring","category-spring-boot","category-spring-framework"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Transformando seus scripts Groovy em microservi\u00e7os com Spring Boot! - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=2934\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Transformando seus scripts Groovy em microservi\u00e7os com Spring Boot! - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Sabia que seus scripts Groovy podem ser transformados em microservi\u00e7os baseados em Spring Boot? Conhe\u00e7a o Spring CLI, a ferramenta que te possibilita justamente isto!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=2934\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-03T20:41:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-01-06T09:25:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/08\/spring-boot-project-logo.png\" \/>\n\t<meta property=\"og:image:width\" content=\"300\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2934\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=2934\",\"name\":\"Transformando seus scripts Groovy em microservi\u00e7os com Spring Boot! - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2934#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2934#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/08\/spring-boot-project-logo.png\",\"datePublished\":\"2020-01-03T20:41:59+00:00\",\"dateModified\":\"2020-01-06T09:25:50+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2934#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=2934\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2934#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/08\/spring-boot-project-logo.png\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/08\/spring-boot-project-logo.png\",\"width\":300,\"height\":300,\"caption\":\"spring boot groovy spring cli microservi\u00e7os\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2934#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Transformando seus scripts Groovy em microservi\u00e7os com Spring Boot!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Transformando seus scripts Groovy em microservi\u00e7os com Spring Boot! - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=2934","og_locale":"pt_BR","og_type":"article","og_title":"Transformando seus scripts Groovy em microservi\u00e7os com Spring Boot! - \/dev\/Kico","og_description":"Sabia que seus scripts Groovy podem ser transformados em microservi\u00e7os baseados em Spring Boot? Conhe\u00e7a o Spring CLI, a ferramenta que te possibilita justamente isto!","og_url":"https:\/\/devkico.itexto.com.br\/?p=2934","og_site_name":"\/dev\/Kico","article_published_time":"2020-01-03T20:41:59+00:00","article_modified_time":"2020-01-06T09:25:50+00:00","og_image":[{"width":300,"height":300,"url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/08\/spring-boot-project-logo.png","type":"image\/png"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=2934","url":"https:\/\/devkico.itexto.com.br\/?p=2934","name":"Transformando seus scripts Groovy em microservi\u00e7os com Spring Boot! - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2934#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2934#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/08\/spring-boot-project-logo.png","datePublished":"2020-01-03T20:41:59+00:00","dateModified":"2020-01-06T09:25:50+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2934#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=2934"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=2934#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/08\/spring-boot-project-logo.png","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/08\/spring-boot-project-logo.png","width":300,"height":300,"caption":"spring boot groovy spring cli microservi\u00e7os"},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=2934#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Transformando seus scripts Groovy em microservi\u00e7os com Spring Boot!"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/08\/spring-boot-project-logo.png","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2934"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2934"}],"version-history":[{"count":8,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2934\/revisions"}],"predecessor-version":[{"id":2947,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2934\/revisions\/2947"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/media\/1922"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}