{"id":15762556,"url":"https://github.com/ramonpaolo/structure-microservices-nodejs","last_synced_at":"2026-04-13T10:31:03.981Z","repository":{"id":119278848,"uuid":"482149534","full_name":"ramonpaolo/structure-microservices-nodejs","owner":"ramonpaolo","description":"Projeto contendo a estrutura básica de um projeto nodeJs usando a arquitetura de microservices","archived":false,"fork":false,"pushed_at":"2022-04-20T18:27:45.000Z","size":28,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-10-04T11:21:36.064Z","etag":null,"topics":["cloud","docker","docker-compose","express","microservices","microservices-architecture","nodejs","typescript"],"latest_commit_sha":null,"homepage":"","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ramonpaolo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2022-04-16T03:55:58.000Z","updated_at":"2023-09-09T23:43:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"92282ab3-616d-4e72-9e96-fa33f7742c44","html_url":"https://github.com/ramonpaolo/structure-microservices-nodejs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ramonpaolo/structure-microservices-nodejs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramonpaolo%2Fstructure-microservices-nodejs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramonpaolo%2Fstructure-microservices-nodejs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramonpaolo%2Fstructure-microservices-nodejs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramonpaolo%2Fstructure-microservices-nodejs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ramonpaolo","download_url":"https://codeload.github.com/ramonpaolo/structure-microservices-nodejs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramonpaolo%2Fstructure-microservices-nodejs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31748876,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T09:16:15.125Z","status":"ssl_error","status_checked_at":"2026-04-13T09:16:05.023Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["cloud","docker","docker-compose","express","microservices","microservices-architecture","nodejs","typescript"],"created_at":"2024-10-04T11:21:05.359Z","updated_at":"2026-04-13T10:31:03.958Z","avatar_url":"https://github.com/ramonpaolo.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Languages Translates\n- [Portuguese](#portuguese)\n- [English](#english)\n\n\u003cdiv id=\"english\" /\u003e\n\n# English\n\n##### Ops: this translate was made by me(Ramon Paolo Maran). Sorry for any problem in translate : )\n\n# Structure of files and folder using architeture microservices on NodeJs\n\nProject that have structure of files and folders to execution to a project using architeture microservices, using Docker and NodeJs\n\n---\n\n## Indice\n- [What is this project?](#whatisthis-english)\n- [Who can use?](#whocanuse-english)\n- [How execute?](#howexecute-english)\n- [This project already to run on cloud?](#alreadytocloud-english)\n- [Tips](#tips-english)\n- [How to make the connection beetwen services?](#howmaketheconnectionbeetwenservices-english)\n- [How to join the services in only one, to do call route?](#howjointheservices-english)\n\n---\n\n\u003cdiv id=\"whatisthis-english\" /\u003e\n\n## What is this project?\nThis project is about the structure of folders and files of an e-commerce using decoupled architecture (microservices). About 4 services are gathered in this small example, which will be described later.\n\n\u003cdiv id=\"whocanuse-english\" /\u003e\n\n\n## Who can use?\nAnyone interested in starting a project focused on microservices, can use this repository as a base guide, to know how the structure of folders and files using NodeJs works.\n\n\u003cdiv id=\"howexecute-english\" /\u003e\n\n## 📁 How execute?\nRequirements: NodeJs 14.17 LTS and Docker\n\n```bash\n# clone repositore\n$ git clone https://github.com/ramonpaolo/structure-microservices-nodejs\n\n# enter inside the folder/project\n$ cd structure-microservices-nodejs/\n\n# build and run application:\n$ docker-compose -f docker-compose.yaml up --build\n```\n\n\u003cdiv id=\"alreadytocloud-english\" /\u003e\n\n## This project already to run on cloud?\nFor the perfect functioning of a project using the microservices architecture, it is recommended to use a container orchestrator, in which I recommend the use of Kubernetes, to then use all the benefits that the cloud and the microservices architecture can deliver to the product, to the client and the programmer.\n\n---\n\n\u003cdiv id=\"tips-english\" /\u003e\n\n## Tips\n1 - If you are going to work in a team, I strongly recommend that you create a specific repository for the service, because if not, every push you make of your service, the rest of your team will have to pull. Therefore, I recommend that each service has its own repo, so that each team can move freely without worrying about the code versioning of other teams.\n\n\u003cbr/\u003e\n\n2 - Each service can be represented as one big action. Example:\n\n- 1 - \u003cstrong\u003eAuthentication\u003c/strong\u003e\n    - The \"authentication\" folder would be the service that represents user authentication. That is, its only \"big\" action is to provide user authentication.\n    \n    - Both the registration, login and access to the database regarding user authentication, will be inside this folder (service)\n\n- 2 - \u003cstrong\u003eBooks\u003c/strong\u003e\n    - The \"books\" folder would be the service that represents the book store. In other words, her only \"big\" action is to provide access to books, both with routes such as: \"get\", \"update\", \"put\", \"delete\", ...\n    \n    - Both access to books, as well as the part of receiving notification if a book has returned to stock, as well as access to the database referring to the books, will be inside this folder (service)\n\n- 3 - \u003cstrong\u003eCheckout\u003c/strong\u003e\n    - The \"checkout\" folder would be the service that represents the book purchase checkout. That is, her only \"big\" action is to process the payment for the order.\n\n    - I believe that each company has its own way of dealing with the purchase \"checkout\" service, however, in my case, I like to use it as a payment process, as well as a purchase and order history request. Being able to access her own database, about orders, purchases, ...\n\n- 4 - \u003cstrong\u003eUser\u003c/strong\u003e\n    - I believe that in this case, it may be something a little emblematic, since the functions of the \"authentication\" service could be inside the \"user\" service, however, I particularly prefer to have these two large \"actions\" separated into 2 services. This is a question that is left to the taste of the 'client' : )\n\n    - The \"user\" folder would be the service that represents all possible user actions, such as changing email, changing password, changing name, ID, changing address, user photo and so on.\n\n\u003c/br\u003e\n\n3 - I strongly recommend that each service has its own database, for its own use, without interference of read/write/iops in other databases, to minimize costs, scalability and possible errors that may happen.\n\n---\n\n\u003cdiv id=\"howmaketheconnectionbeetwenservices-english\" /\u003e\n\n## How to make the connection beetwen services?\nWell, we can make the binding using API calls, using axios for example, but we will have a problem. If one of our services is interrupted, and we make an API call, the system that made the call will experience a cascading problem, as our service depends on an API call from the service that has a problem. Therefore, it will not make much sense for you to use the microservices architecture, because one of the great benefits is to have problem isolation, you would go away with this cascading problem. But then, how to solve? The best way, and which I recommend, is to use a message queue/message queue service, such as RabbitMQ, together with the AWS SQS service (Simple Queue Service). With this tool, you are not (in theory) held hostage by your other service, and you are far less likely to cause a cascading problem.\n\n\n\u003cdiv id=\"howjointheservices-english\" /\u003e\n\n--- \n## How to join the services in only one, to do call route?\nWe can do this, programmatically, using express, to make a proxy programmatically, or we can use nginx for this, which is our case. Along with the proxy, a load balancing is also being done.\n\n---\n\u003c/br\u003e\n\n\u003cdiv id=\"portuguese\" /\u003e\n\n# Portuguese\n\n## Estrutura de arquivos e pastas usando arquitetura microservices no NodeJs\n\nProjeto que tem a estrutura de pastas e arquivos para execução de um projeto na arquitetura microservices, usando Docker\n\n---\n\n## Indice\n- [O que é esse projeto?](#whatisthis-portuguese)\n- [Quem pode usar?](#whocanuse-portuguese)\n- [Como executar?](#howexecute-portuguese)\n- [Está pronto para rodar na nuvem?](#alreadytocloud-portuguese)\n- [Dicas](#tips-portuguese)\n- [Como fazer a ligação de um serviço para outro?](#howmaketheconnectionbeetwenservices-portuguese)\n- [Como juntas os serviços em apenas um só, para fazer a ligação de rotas?](#howjointheservices-portuguese)\n\n---\n\n\u003cdiv id=\"whatisthis-portuguese\" /\u003e\n\n## O que é esse projeto?\nEsse projeto é sobre estrutura de pastas e arquivos de um e-commerce usando arquiterua desacoplada(microservices). São reunidos nesse pequeno exemplo, cerca de 4 serviços, onde serão descritos mais adiante.\n\n\u003cdiv id=\"whocanuse-portuguese\" /\u003e\n\n## Quem pode usar?\nQualquer pessoa que tenha interesse em iniciar algum projeto focado em microservices, poderá usar esse repositório como um guia base, para saber como funciona a estrutra de pastas e arquivos usando NodeJs\n\n\u003cdiv id=\"howexecute-portuguese\" /\u003e\n\n## 📁 Como executar?\nRequisitos: NodeJs 14.17 LTS e Docker\n\n```bash\n# clone o repositório\n$ git clone https://github.com/ramonpaolo/structure-microservices-nodejs\n\n# entre dentro da pasta pasta/projeto\n$ cd structure-microservices-nodejs/\n\n# build e rode a aplicação:\n$ docker-compose -f docker-compose.yaml up --build\n```\n\n\u003cdiv id=\"alreadytocloud-portuguese\" /\u003e\n\n## Está pronto para rodar na nuvem?\nPara o funcionamento perfeito de um projeto usando a arquitetura microservices, é recomendado o uso de algum orquestrador de conteiner, no qual recomendo o uso do Kubernetes, para então utilizar todos os proveitos que a nuvem e a arquitetura microservices pode entregar para o produto, para o cliente e o programador\n\n---\n\n\u003cdiv id=\"tips-portuguese\" /\u003e\n\n## Dicas\n1 - Caso você for trabalhar em algum time, recomendo fortemente que você crie um repositório específico para o serviço, pois se não, toda push que você fizer de seu serviço, o restante da sua equipe, terá que fazer um pull. Logo, recomendo que cada serviço tenha um próprio repo, para que cada time, possa mexer livremente sem se importar com o versionamento de código de outras equipes.\n\n\u003cbr/\u003e\n\n2 - Cada serviço, pode ser representado como sendo uma grande ação. Exemplo:\n\n- 1 - \u003cstrong\u003eAuthentication\u003c/strong\u003e\n    - A pasta \"authentication\" seria o serviço que representa a autenticação do usuário. Ou seja, a única \"grande\" ação dela, é prover a autenticação do usuário. \n    \n    - Tanto o registro, login e acesso ao banco de dados referente a autenticação do usuário, estará dentro dessa pasta(serviço)\n\n- 2 - \u003cstrong\u003eBooks\u003c/strong\u003e\n    - A pasta \"books\" seria o serviço que representa a loja de livros. Ou seja, a única \"grande\" ação dela, é prover o acesso aos livros, tanto tendo rotas como: \"get\", \"update\", \"put\", \"delete\" e etc... \n    \n    - Tanto o acesso aos livros, como também, a parte de receber notificação caso um livro tenha voltado ao estoque, como o acesso ao banco de dados referente aos livros, estará dentro dessa pasta(serviço)\n\n- 3 - \u003cstrong\u003eCheckout\u003c/strong\u003e\n    - A pasta \"checkout\" seria o serviço que representa o checkout da compra do livro. Ou seja, a única \"grande\" ação dela, é processar o pagamento do pedido \n\n    - Acredito, que cada empresa tenha seu jeito de lidar com o serviço de \"checkout\" de compra, porém, em meu caso, gosto de utiliar ela como um processo de pagamento, como também, de requisição de histórico de compras e de ordem. Podendo a ela, acessar um banco de dados próprio, sobre pedidos, compra e etc...\n\n- 4 - \u003cstrong\u003eUser\u003c/strong\u003e\n    - Acredito que nesse caso, possa ser algo um pouco emblemático, pois as funções do serviço \"authentication\" poderiam estar dentro do serviço \"user\", porém, eu, particulamente, prefiro ter essas duas grandes \"ações\" separadas em 2 serviços. Essa é uma questão que fica ao gosto do 'cliente' rsrs\n\n    - A pasta \"user\" seria o serviço que representa todas as possíveis ações do usuário, como por exemplo, a troca de email, troca de senha, troca de nome, CPF, troca de endereço, foto do usuário e assim por diante.\n\n\u003c/br\u003e\n\n3 - Recomendo fortemente, que cada serviço, tenha seu próprio banco de dados, para seu próprio uso, sem interferência de leitura/escrita/iops(read/write/iops) em outros banco de dados, para minimizar custos, escalabilidade e possíveis erros que possam acontecer.\n\n---\n\n\u003cdiv id=\"howmaketheconnectionbeetwenservices-portuguese\" /\u003e\n\n## Como fazer a ligação de um serviço para outro?\nBom, nós podemos fazer a ligação usando chamadas APIs, usando o axios por exemplo, porém, teremos um problema. Caso um de nossos serviços for interrompido, e a gente fizer uma chamada API, o sistema que fez a chamada, sofrerá um problema em cascata, pois o nosso serviço depende de uma chamada API do serviço que está com problema. Logo, não irá fazer muito sentido você utilizar a arquitetura microservices, pois um dos grandes benefícios, é ter um isolamento de problemas, iria embora com esse problema em cascata. Mas então, como resolver? A melhor maneira, e que recomendo, é utilizar um enfileirador de mensagens/serviço de filas de mensagens, como por exemplo, o RabbitMQ, junto com o serviço AWS SQS(Simple Queue Service). Com essa ferramente, você não estará(na teoria) refém do seu outro serviço, e terá bem menos chances de causar um problema em cascata.\n\n\n\u003cdiv id=\"howjointheservices-portuguese\" /\u003e\n\n--- \n## Como juntas os serviços em apenas um só, para fazer a ligação de rotas?\nPodemos fazer isso, programaticamente, usando o express, para fazer um proxy programaticamente, ou podemos utilizar o nginx para isso, que é o nosso caso. Junto com o proxy, também está sendo feito um load balancing(balanceador de carga).\n\n![GitHub top language](https://img.shields.io/github/languages/top/ramonpaolo/structure-microservices-nodejs)\n![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/ramonpaolo/structure-microservices-nodejs)\n![GitHub](https://img.shields.io/github/license/ramonpaolo/structure-microservices-nodejs)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framonpaolo%2Fstructure-microservices-nodejs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Framonpaolo%2Fstructure-microservices-nodejs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framonpaolo%2Fstructure-microservices-nodejs/lists"}