Como criar um sistema em Microservices em Java

Saudação para todos,

Estou para criar um sistema que será vendido em módulos, existe o modulo de controle de estoque, o modulo de ocorrência, o modulo de ordens de serviço, e um modulo de autenticação de usuários.

Pela modelagem do meu banco de dados, as tabelas são totalmente amarradas umas as outras, e se eu tentar força o sistema a roda sem algumas das tabelas existentes, gera uma serie de erros.

O meu objetivo é vender o sistema por módulos, ou seja, se o cliente quiser somente o modulo de controle de estoque, ai eu vou vender somente para ele este modulo, porém o sistema continuará funcionando normalmente, as mesma coisas com os outros módulos.

Cada módulo tem um conjunto de tabelas.

É como se os módulos tivessem interligadas umas com as outras, mas que existisse uma possibilidade lógica delas funcionarem indenpententes uma das outras.

Existe algum livro que explique como criar a base de dados em módulos ou criação de sistemas em modulos?

Se eu não souber fazer isso vou ser obrigado a sempre vender o sistema completo, e isso não é interessante porque vou ser obrigado a vender todos recursos do sistema pra ele, que provavelmente não irá precisar.

Já ouvir falar de sistemas feito em Microservices, e dentro do conceito do Microservices existem várias técnicas para aplicar o conceito de Microservices, como podem ver o link abaixo;

MicroServices clique aqui

Ao realizar mais pesquisas sobre esse assunto, esses tipos de sistemas são chamados de sistemas distribuidos, eu sei que esse assunto é muito extenso para ser explicado assim com poucas linhas, preciso somente de uma direção para saber pesquisa melhor sobre esse assunto, eu não se existe literaturas, ou vídeo aulas ou até instituições que expliquei como construir sistemas seguindo esse conceito.

O sistema estou fazendo em Spring MVC.

Sobre microserviços: http://blog.caelum.com.br/arquitetura-de-microservicos-ou-monolitica/

Porém para o seu problema, talvez não seja esse o caminho.

Você acha que posso procura qual caminho para resolver esse problema?

Estou vendo que pouca gente entende de MicroServices, será que esse conhecimento somente se adquiri trabalhando nas empresas?

Com certeza, tem que ser dentro da empresa após análise das reais necessidades e experiências do cliente, com pessoas que já se prepararam para isso.

Querer vender sistemas separados não necessariamente precisa seguir arquitetura de micro services.

Onde trabalho os sistemas são separados, atendendo cada gerência, cada um tem sua equipe de desenvolvimento e ambiente dedicado para deploy e uso, mas longe de seguir a arquitetura de micro serviços. Tentando comparar ao seu caso, “Ordem de Serviço” seria um sistema e “Estoque” seria outro. Cada um com seu schema de tabelas onde seja dono/gestor da informação. Tabelas em comum podem ser compartilhadas com restrições de acesso a quem não for dono. O sistema de “Ordem de Serviço” pode funcionar mesmo sem existir uma tabela do sistema de “Estoque” onde o sistema de “Ordem de Serviço” não faça uso. No final das contas são sistemas de arquitetura tradicional, só que menores e divididos por assuntos específicos, integrados através de tabelas em comum, views e também web services (REST, etc) quando necessário.

Micro services vai muito além disso, onde não deveria nem ter esse compartilhamento de tabelas em comum com áreas diferentes. Se na prática isso não for um real causador de problemas na empresa, não tem porque usar micro services, acaba usando só por seguir a moda. Com micro services terá que lidar com o outro lado da moeda, principalmente pela perda de facilidade de integração entre pontos comuns.

Minha situação real é essa base de dados que eu mesmo criei, eu não sei se está modelado corretamente, gostaria que me ajudasse a identificar problemas nessa base de dados

ACW.pdf (23.2 KB)

Mas como você pode ver as seguintes tabelas como

Pessoa,TipoPessoa,Propriedade,TipoPropriedade e Condominio
seria um módulo, e as tabelas como
Impacto,CadastroOcorrencia, OcorrenciaAprovados,StatusOcorrencia
seria outro módulo, o que liga esse dois modulos é a tabela
Condominio .

Do jeito que criei o meu sistema se eu tentar colocar módulos de acesso, tipo, Usuário 1 acessa um módulo sendo que não acessa o outro, se eu fizer isso, no ato de inserir um chamado gera um erro.

O que estou tentando descobri é a logica ou no banco de dados ou no próprio código Java como poder as Tabelas se comunicarem, mas ao mesmo tempo elas serem independentes. como é o caso de alguns sistemas que são vendido por módulos, exemplo;

Um cliente comprou o módulo de cadastro, passou uns dois anos usando o sistema, depois disso ele sugeriu de comprar o módulo de ocorrência, e com isso o que devo fazer? Simplesmente dei permissão de acesso para ele usar o outro módulo.

Essa é minha ideia.

Qual erro? Se for tentando acessar uma tabela que o módulo não usa, então basta alterar o SQL para retirar essa tabela. Cada módulo tem que ter suas próprias querys.

Você está falando sobre módulos mas seu modelo de dados está tudo junto. Já deve começar a se organizar por ai separando por módulos. O que for tabela compartilhada você puxa junto. Coloque cor diferente nas tabelas por módulo. Pelo menos vejo ADs trabalhando assim, não sou especialista de banco de dados.

[quote=“wladyband, post:6, topic:333979, full:true”]
Um cliente comprou o módulo de cadastro, passou uns dois anos usando o sistema, depois disso ele sugeriu de comprar o módulo de ocorrência, e com isso o que devo fazer? Simplesmente dei permissão de acesso para ele usar o outro módulo.[/quote]
Isso ai já é questão de automatizar o processo, a estratégia você define e implementa. Longe de ser a forma mais elegante, mas a forma mais fácil costuma ser deixar todos os módulos instalados e só habilitar acesso do que ele comprar. Isso ai é programação mesmo, como se fosse controle de acesso do usuário, mas aplicando licença de uso. Outra forma seria automatizar o deploy dos módulos e criação de tabelas, mas dependendo do caso não vale a pena se complicar com isso.

no caso de microservices, quando o acesso aos dados não pode mais ser feito diretamente, só por meio do gateway do serviço, a organização dos dados e armazenamento passa a ser questão de responsabilidade dos desenvolvedores do módulo/serviço, e não mais de um especialista ou DBA.

Sim, mas os casos que comentei não usam micro serviços e nem tem a necessidade.

Por que não? Tá com peninha do DBA?
Microservices é o futuro.

Por que deveria ser necessário se não existe a necessidade? Não faz sentido sua pergunta, seria como resolver problema que não existe.

Já o autor do tópico está cheio de dúvidas sobre o projeto dele, onde dependendo das definições pode ser necessário ou não. Então você poderia ajudar ele relatando sua experiência real em micro serviços, além de encaixar o caso dele nessa arquitetura.

Então, você teria condições me ajuda? Se você realmente tem experiencia com MicroServices por favor me ajuda nesse projeto?

Oi @wladyband.

Eu leio vender e associo o produto à on premise, ou seja, que será instalado na casa do cliente. É isso ou estamos falando em SaaS? Se for on premise, ignora a ideia de microservices e começa a pensar em controle de módulos por segurança, usando algum protocolo ou o conceito de “roles” (papéis). Nesse formato, mesmo que o cliente tenha instalado todo o produto, ele só irá conseguir acessar os módulos no qual pagou.

Se a ideia é ir para SaaS, a arquitetura de microservices é muito interessante e amplamente utilizada (Uber e Netflix fazem posts constantes sobre esse modelo de arquietura e explicando suas próprias arquiteturas, inclusive). Em relação ao banco de dados (se seguir para microservices), provavelmente você terá que desenhar o MER e atualizar o mesmo, buscando uma forma de deixar teus microserviços independentes. Uma forma é se tu tem composição dentro de suas entidades, ao invés de trabalhar com o objeto X, você terá um ID único de X. Enfim, terás que analisar.

Por fim, independente do caminho que seguir, uma dica é usar o conceito de DDD, para trabalhar com contextos específicos e etc. Segue um artigo do Martin Fowler sobre microservices que eu gosto muito: Martin Fowler: Microservices.

Só mais um detalhe: eu acredito que este post deveria estar no tópico arquitetura.

Boa sorte.

1 curtida

que tipo de sugestão de titulo você daria para essa postagem?

@wladyband não vejo problemas com o título, apenas dei a sugestão de mover para arquitetura. Não sei se é possível mover com tudo o que já foi postado. Espero que eu tenha conseguido colaborar contigo na resposta anterior.

Abraços.

Talvés você tenha razão em relação a isso, mas eu preciso de mais uma coisa, eu preciso saber se meu banco está desenhado corretamente, você acha que devo criar uma nova postagem para isso?

@wladyband a melhor pessoa para responder à esta pergunta é você mesmo. Se está pensando em vender o produto, seja SaaS ou on premise, é muito interessante que avalie a arquitetura do seu produto e o banco de dados, claro.

Se quiser, é só abrir um tópico em Infraestrutura/Banco de dados. Não esqueça de explicar sua necessidade, previsão de crescimento (massa de dados) do seu banco e etc, para uma melhor análise do pessoal.

Abraços.

Cara você não usa nenhum serviço de armazenamento distribuído como DynamoDB, Cassandra ou Riak… em que era você vive!!! kkkkkkk

@pfk66, o mundo não se restringe a isso, se é importante para sua empresa, problema nenhum. Mas pelo jeito você nunca teve experiencia em grandes empresas com projetos críticos, onde não tem essa de brincar de trocar o que já atende por “tecnologia da hora” mesmo sem necessidade. Isso não é mais importante do que a finalidade do negocio. TI é só o meio, você está se fechando a este meio, é só programador.

Enquanto isso você não relatou ainda para o autor do tópico sua experiência real, colaborando para encaixar no projeto dele as tecnologias que você trabalha.

1 curtida

Eu num to intendendu que negocio é esse…:confused:
que grande empresa é essa que não precisa ser capaz de lidar com quantidade maciça de dados, que projeto crítico é esse que não precisa de alta disponibilidade?