{"id":34632421,"url":"https://github.com/mcruzdev/frictionless-java-jugbrazil","last_synced_at":"2026-05-29T05:31:19.641Z","repository":{"id":323944008,"uuid":"1095346058","full_name":"mcruzdev/frictionless-java-jugbrazil","owner":"mcruzdev","description":null,"archived":false,"fork":false,"pushed_at":"2025-11-12T23:39:51.000Z","size":19,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-13T01:18:47.878Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mcruzdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-12T23:36:45.000Z","updated_at":"2025-11-12T23:39:55.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mcruzdev/frictionless-java-jugbrazil","commit_stats":null,"previous_names":["mcruzdev/frictionless-java-jugbrazil"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/mcruzdev/frictionless-java-jugbrazil","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcruzdev%2Ffrictionless-java-jugbrazil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcruzdev%2Ffrictionless-java-jugbrazil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcruzdev%2Ffrictionless-java-jugbrazil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcruzdev%2Ffrictionless-java-jugbrazil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mcruzdev","download_url":"https://codeload.github.com/mcruzdev/frictionless-java-jugbrazil/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcruzdev%2Ffrictionless-java-jugbrazil/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33639050,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-12-24T16:53:31.074Z","updated_at":"2026-05-29T05:31:19.636Z","avatar_url":"https://github.com/mcruzdev.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Brazil JUG (Frictionless Java: Explorando o Quarkus, do Zero ao Deploy)\n\n[![Frictionless Java](https://img.youtube.com/vi/oGZuz5vPtww/0.jpg)](https://www.youtube.com/watch?v=oGZuz5vPtww)\n\nEste repositório contém o código fonte do workshop \"Frictionless Java: Explorando o Quarkus, do Zero ao Deploy\" apresentado no Brazil JUG.\n\n## Criando um cluster kubernetes com KinD\n\n```shell\nkind create cluster --name braziljug\n```\n\n## Adicionando a infraestrutura necessária\n\n### Adicionando o banco de dados PostgreSQL\n\n```shell\nhelm install postgresql oci://registry-1.docker.io/bitnamicharts/postgresql --set global.postgresql.auth.database=braziljug --set global.postgresql.auth.postgresPassword=password\n```\n\n### Adicionando o LGTM\n\n```shell\nkubectl apply -f k8s/otel-lgtm.yaml\n```\n\n## Criando o projeto Quarkus\n\nCriar o projeto com o Quarkus CLI:\n\n```bash\nquarkus create app org.acme:braziljug\n```\n\nVamos ver o que foi criado, algumas extensões do Quarkus trazem pra gente uma funcionalidade que se chama codestarts, que são basicamente templates de código prontos para serem usados quando criamos a aplicação.\n\n## Executando a aplicação\n\nVamos executar nossa aplicação e vamos verificar se a aplicação está funcionando corretamente.\n\n```bash\nmvn quarkus:dev\n```\n\nAcesse [http://localhost:8080/](http://localhost:8080/) e veja a mensagem \"Hello from Quarkus REST\".\n\n## Adicionando uma nova extensão\n\nVamos adicionar três extensões ao nosso projeto: A primeira vai ser responsável pela parte de serialização e desserialização de JSON, a segunda vai ser a extensão do Hibernate ORM com Panache para facilitar o acesso ao banco de dados e a terceira vai ser a extensão do JDBC do MySQL.\n\nVamos agora escrever um endpoint simples que vai criar um novo `Movie` pra gente e vamos utilizar essa dependência.\n\nVamos criar uma entidade chamada `Movie` que vai representar a tabela de filmes no banco de dados. E pra isso a gente vai utilizar o PanacheEntity e vamos estender a nossa classe com ele. O PanacheEntity já traz pra gente o ID e vários métodos prontos para serem utilizados. Ele usa o padrão Active Record, mas você também pode utilizar o padrão Repository se preferir.\n\nE o que é o Panache, o Panache é um wrapper em cima do Hibernate ORM que facilita bastante o nosso acesso ao banco de dados, ele traz uma série de métodos prontos para serem utilizados.\n\nBeleza, agora vamos criar o nosso endpoint REST que vai permitir a criação de novos filmes no banco de dados.\n\nVamos testar, isso vai funcionar ou não, a gente não configurou a conexão com o banco de dados ainda. A gente nem tem o banco de dados rodando ainda.\n\nIsso vai funcionar ou não? A resposta é sim, porque o Quarkus traz uma funcionalidade muito legal que é o Dev Services, que basicamente quando você está rodando a aplicação em modo de desenvolvimento, ele consegue identificar que você está utilizando uma extensão que precisa de um banco de dados e ele automaticamente sobe um container do banco de dados pra você, sem você precisar fazer nada.\n\n## Adicionando observabilidade\n\nOutra coisa interessante para uma aplicação que vai para produção é observabilidade, vamos adicionar a extensão `quarkus-micrometer-opentelemetry` para que a gente consiga expor as telemetrias da nossa aplicação.\n\n## Empacotando nossa aplicação para produção\n\nVamos instalar algumas extensões:\n\n```shell\nmvn quarkus:add-extension -Dextensions=\"kubernetes,container-jib\"\n```\n\nA extensão kubernetes vai ser responsável por gerar os manifests do Kubernetes para a nossa aplicação, enquanto a extensão container-jib vai ser responsável por empacotar a nossa aplicação em uma imagem Docker.\n\nMas antes a gente precisa configurar algumas coisas, precisamos configurar o nome da imagem final, a versão e o owner.\n\nAlém disso a gente precisa apontar a observabilidade, como vamos executar isso em um cluster local usando KinD, nós precisamos apontar o local do collector do Opentelemetry.\n\nAlém disso precisamos saber a senha do banco de dados e configurar aqui na aplicação, como eu disse o Quarkus é Kubernetes Native, então ele te ajuda e muito não somente na hora de executar sua aplicação em um cluster mas também na hora de configurar ela para isso.\n\n## Buildando a aplicação\n\n\u003e [NOTE]\n\u003e Não esqueça de alterar a propriedade `quarkus.container-image.group` para o seu usuário do Docker Hub.\n\nSe você quiser executar a aplicação no modo JVM, você pode fazer o build da aplicação com o seguinte comando:\n\n```bash\nmvn clean package\n```\n\nSe você quiser executar a aplicação no modo nativo, você pode fazer o build da aplicação com o seguinte comando:\n\n```bash\nmvn clean package -Pnative\n```\n\n## Subindo a imagem para o Docker Hub\n\n```bash\ndocker push \u003cyour-docker-hub-username\u003e/braziljug:0.1.0\n```\n\n## Deploy da aplicação no cluster KinD\n\nAgora que a gente já tem a imagem da nossa aplicação criada, a gente pode fazer o deploy dela no nosso cluster KinD.\n\n```bash\nkubectl apply -f target/kubernetes\n```\n\n## Acessando a aplicação\n\nAgora que a nossa aplicação está rodando no cluster, a gente pode acessar ela.\n\n```bash\nkubectl port-forward svc/braziljug 8080:8080\n```\n\nAcesse [http://localhost:8080/movies](http://localhost:8080/) e veja a lista de filmes (inicialmente vazia).\n\n## Considerações finais\n\nParabéns! Você conseguiu criar uma aplicação Quarkus, adicionar funcionalidades a ela, empacotá-la em uma imagem Docker e fazer o deploy dela em um cluster Kubernetes local usando KinD. A partir daqui você pode explorar ainda mais o Quarkus e suas extensões para adicionar novas funcionalidades à sua aplicação.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmcruzdev%2Ffrictionless-java-jugbrazil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmcruzdev%2Ffrictionless-java-jugbrazil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmcruzdev%2Ffrictionless-java-jugbrazil/lists"}