{"id":15607899,"url":"https://github.com/allangomes/micronaut-ebean-example","last_synced_at":"2025-10-04T15:06:12.057Z","repository":{"id":68600262,"uuid":"236028502","full_name":"allangomes/micronaut-ebean-example","owner":"allangomes","description":"Micronaut + Ebean + Kotlin + Multitenancy + Coroutines","archived":false,"fork":false,"pushed_at":"2020-02-21T17:59:00.000Z","size":66,"stargazers_count":6,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-28T10:18:59.185Z","etag":null,"topics":["coroutines","ebean","kotlin","micronaut","multitenancy","spek2"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","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/allangomes.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}},"created_at":"2020-01-24T15:30:09.000Z","updated_at":"2024-10-13T03:15:38.000Z","dependencies_parsed_at":"2023-02-21T05:31:53.920Z","dependency_job_id":null,"html_url":"https://github.com/allangomes/micronaut-ebean-example","commit_stats":null,"previous_names":["allangomes/micronaut-ebean-example","allangomessl/micronaut-ebean-example"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/allangomes/micronaut-ebean-example","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allangomes%2Fmicronaut-ebean-example","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allangomes%2Fmicronaut-ebean-example/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allangomes%2Fmicronaut-ebean-example/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allangomes%2Fmicronaut-ebean-example/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/allangomes","download_url":"https://codeload.github.com/allangomes/micronaut-ebean-example/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allangomes%2Fmicronaut-ebean-example/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278328266,"owners_count":25968923,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"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":["coroutines","ebean","kotlin","micronaut","multitenancy","spek2"],"created_at":"2024-10-03T05:05:00.508Z","updated_at":"2025-10-04T15:06:12.017Z","avatar_url":"https://github.com/allangomes.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# micronaut-ebean-example\nMicronaut + Ebean + Kotlin + Multitenancy + Coroutines\n\nEste é projeto modelo utilizando as melhores tecnologias de 2020\n\n## Tecnologias\n\n### Micronaut\nMicronaut é um framework concorrente do spring-boot que tem varias vantagens sobre seu concorrente\n\n- Resolve as injeções de dependencia em tempo de compilação\n- Extremamente mais leve\n- A aplicação sobe questão de milissegundos\n- Não bloqueante e Reativo\n- Tem varios modulos prontos para se integrar com:\n  - Filas (Rabbit/Kafka)\n  - Discovery (Consul,Eureka)\n  - Cache (Redis,MemCache)\n  - Server (AWS Lambda)\n  - Banco de dados\n  - Suporte a multitenancy (Nada fácil quando se trabalha com threads non-blocking)\n  - mais em: https://micronaut.io/\n  \n###  Ebean\nEbean é um ORM concorrente do Hibernate\n\n- Suas consultas são 10^1000000x melhores que a do Hibernante\n- Select + 1 (aqui não)\n- Se integra muito bem com o Kotlin\n- Gera automaticamente as migrations\n- Tem suporte a multitenant mesmo em aplicações non-blocking\n- mais em: https://ebean.io/\n\n### Kotlin\nKotlin é uma linguagem interopativel com Java com features que não existem no java\n\n- Sintaxe Amigável\n- Sem Get e Set o///\n- **Coroutines** (programação assíncrona)\n- Extensions Methods and Props\n- Delegates\n- Type inference\n- Global var and functions\n- mais em: https://kotlinlang.org/\n\n\n\n## Detalhes técnicos\n\n### multitenancy\n\nÉ bem comum vermos aplicações hoje dia que precisa se conectar com varios bancos, um para cada cliente,\nnormalmente utilizando o Spring-Boot é algo mais simples precisando apenas criar um ThreadMap e setar as \nconfigurações daquele tenant em um Http Filter.\n\nMas e quando temos alguns pools de threads compartilhados e trabalhamos de forma completamente asyncrona?\nde fato não existe uma solução muito simples, mas felizmente o micronaut já nos dar um suporte para \nimplementarmos essa solução.\n\npasso 1:\n```gradle\nimplementation \"io.micronaut:micronaut-multitenancy\"\n```\n\npasso 2:\n```yml\nmicronaut.multitenancy.tenantresolver.httpheader.enabled: true\n```\n\ne pronto, agora como usar?\n\n```http\nGET /coroutine/async/5 HTTP/1.1\nHost: localhost:9950\ntenantId: cliente\n```\n\ne como recuperar esse tenant em thread safe?\n```kotlin\n@Inject\nlateinit var tenantResolver: TenantResolver\n...\ntenantResolver.resolveTenantIdentifier()\n```\n\ncomo se integrar com o banco de dados, no caso o Ebean?\n\nImplemente um singleton ou um bean de `io.ebean.config.CurrentTenantProvider`\n```kotlin\n@Bean\nfun currentTenant(\n        tenantResolver: TenantResolver,\n        @Value(\"\\${datasource.default:db}\") default: String\n) = CurrentTenantProvider {\n    return@CurrentTenantProvider try {\n        tenantResolver.resolveTenantIdentifier() // \u003c---- A magica acontece aqui\n    } catch (e: Exception) {\n        default\n    }\n}\n```\n\n```kotlin\n@Bean\nfun config(currentTenant: CurrentTenantProvider) = ServerConfig().apply {\n    currentTenantProvider = currentTenant\n    ...\n}\n```\n\n## Setup\n\nEm breve\n  \n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fallangomes%2Fmicronaut-ebean-example","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fallangomes%2Fmicronaut-ebean-example","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fallangomes%2Fmicronaut-ebean-example/lists"}