{"id":15137840,"url":"https://github.com/jonathanmdr/dynamicdatasourcerouting","last_synced_at":"2025-10-23T13:31:00.499Z","repository":{"id":46268874,"uuid":"377668990","full_name":"jonathanmdr/DynamicDataSourceRouting","owner":"jonathanmdr","description":"Exemplo de como utilizar Dynamic Data Source Routing com Java, Spring Boot e JPA.","archived":false,"fork":false,"pushed_at":"2024-11-22T14:35:20.000Z","size":65502,"stargazers_count":24,"open_issues_count":0,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-30T18:48:22.189Z","etag":null,"topics":["flyway","grafana","jaeger","jaeger-tracing","java","mapstruct","metrics","mysql","open-telemetry","open-telemetry-java","otel","otel-javaagent","prometheus","replication","rest-api","routing-datasource","spring-boot","traces"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonathanmdr.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":"2021-06-17T01:15:48.000Z","updated_at":"2025-01-23T14:45:56.000Z","dependencies_parsed_at":"2024-09-21T11:30:53.662Z","dependency_job_id":"4d20bbce-22c1-43a0-9faa-e126b8dc1abb","html_url":"https://github.com/jonathanmdr/DynamicDataSourceRouting","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanmdr%2FDynamicDataSourceRouting","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanmdr%2FDynamicDataSourceRouting/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanmdr%2FDynamicDataSourceRouting/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanmdr%2FDynamicDataSourceRouting/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonathanmdr","download_url":"https://codeload.github.com/jonathanmdr/DynamicDataSourceRouting/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237834635,"owners_count":19373760,"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","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":["flyway","grafana","jaeger","jaeger-tracing","java","mapstruct","metrics","mysql","open-telemetry","open-telemetry-java","otel","otel-javaagent","prometheus","replication","rest-api","routing-datasource","spring-boot","traces"],"created_at":"2024-09-26T07:02:33.860Z","updated_at":"2025-10-23T13:31:00.492Z","avatar_url":"https://github.com/jonathanmdr.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dynamic Data Source Routing\n\n[![CI](https://github.com/jonathanmdr/RoutingDataSource/actions/workflows/maven.yml/badge.svg)](https://github.com/jonathanmdr/RoutingDataSource/actions/workflows/maven.yml)\n[![CodeFactor](https://www.codefactor.io/repository/github/jonathanmdr/dynamicdatasourcerouting/badge)](https://www.codefactor.io/repository/github/jonathanmdr/dynamicdatasourcerouting)\n\nExemplo de uma API REST desenvolvida em Java com Spring, o intuito é apresentar uma solução arquitetural para dimensionar operações de leitura com banco de dados, neste exemplo trabalharemos com duas bases de dados, uma base de dados principal e uma réplica.\n\u003c/br\u003e\n\u003c/br\u003e\nA ideia é fazer com que a aplicação direcione as transações definidas como `READ_ONLY` para a base de dados réplica e que as transações `READ_WRITE` sejam direcionadas para a base de dados principal.\n\u003c/br\u003e\n\u003c/br\u003e\nAs imagens e configurações contidas no arquivo `docker-compose.yaml` são específicas para lidar com a replicação de dados.\n\u003c/br\u003e\n\u003c/br\u003e\nEsta arquitetura consiste em diminuir a concorrência entre transações da API com o banco de dados, isso nos permite alguns ganhos em ambientes de alta escala dado que podemos tranquilamente escalar horizontalmente mais nós de réplica quando necessário.\n\u003c/br\u003e\n\u003c/br\u003e\n\n[![node](https://img.shields.io/badge/Azul_Zulu_OpenJDK-21-red.svg)](https://www.azul.com/downloads/?package=jdk#zulu)\n[![node](https://img.shields.io/badge/Spring_Boot-3.4.0-green.svg)](https://spring.io/)\n[![node](https://img.shields.io/badge/MySQL-8.0.28-blue.svg)](https://www.mysql.com/)\n\n\n## Arquitetura\n[![node](https://github.com/jonathanmdr/RoutingDataSource/blob/master/docs/replication-databases.png)](https://github.com/jonathanmdr/RoutingDataSource/blob/master/docs/replication-databases.png)\n\n## Documentação\n\u003e :information_source: Após inicializar a aplicação, acesse a documentação clicando neste [link](http://localhost:8080/).\n\n## Inicializando as bases de dados\n\u003e :warning: É necessário ter instalado `docker` e `docker-compose`.\n\n#### Execute os comandos abaixo:\n\nInicializar:\n```sh\nmake up\n```\nParar:\n```sh\nmake down\n```\n## OpenTelemetry\n\u003e O OpenTelemetry foi incluso no projeto utilizando a estratégia de coletores como agent.\n\nVariáveis de ambiente:\n```shell\nOTEL_METRICS_EXPORTER=otlp\nOTEL_EXPORTER_OTLP_METRICS_COMPRESSION=gzip\nOTEL_EXPORTER_OTLP_METRICS_ENDPOINT=http://localhost:4317\nOTEL_TRACES_EXPORTER=otlp\nOTEL_EXPORTER_OTLP_TRACES_COMPRESSION=gzip\nOTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://localhost:4317\nOTEL_LOGS_EXPORTER=none\nOTEL_SERVICE_NAME=billionaire-api\n```\n\nArgumentos de VM:\n```shell\n-javaagent:./agents/opentelemetry-javaagent.jar\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanmdr%2Fdynamicdatasourcerouting","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonathanmdr%2Fdynamicdatasourcerouting","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanmdr%2Fdynamicdatasourcerouting/lists"}