Todavía estoy tratando de entender la arquitectura de microservicios ya que estoy acostumbrado a un enfoque monolítico
Supongamos que intentamos construir un sistema de reserva Uber extremadamente simplificado . Para simplificar las cosas que digamos que tienen 3 servicios y un API puerta de entrada para el cliente: Booking
, Drivers
, Notification
y tenemos el siguiente flujo de trabajo:
Al crear una nueva reserva:
- Compruebe si el usuario existente ya tiene una reserva
- Obtenga una lista de los controladores disponibles
- Enviar notificación a los conductores para recoger la reserva
- El conductor recoge la reserva.
Digamos que todos los mensajes se realizan a través de una llamada http en lugar de un bus de mensajes como kafka para simplificar las cosas.
Entonces, en este caso, pensé que el Booking
servicio puede verificar las reservas existentes. Pero entonces, ¿quién debería recibir la lista de controladores y notificaciones disponibles? Estoy pensando en hacerlo a nivel de puerta de enlace, pero ahora la lógica está dividida en dos lugares:
Gateway
- obtener una lista de los controladores disponibles + enviar notificacionesBooking
- verificar reserva existente
Y estoy bastante seguro de que la puerta de enlace no es el lugar adecuado para hacerlo, pero siento que si lo estamos haciendo en el Booking
servicio, ¿está estrechamente acoplado?
Para hacerlo más complicado, ¿qué sucede si tenemos otro proyecto que quiere reutilizar el sistema de reservas pero con su propia lógica de negocios? Es por eso que pensé en hacerlo a nivel de puerta de enlace para que la nueva puerta de enlace del proyecto pueda tener su propia lógica de negocios separada de la existente.
Otra forma de hacerlo, supongo, es que cada proyecto tenga su propio servicio de reserva que hablará con el servicio central de reservas, pero no estoy seguro de cuál es el mejor enfoque aquí :-)
fuente
Respuestas:
La gente a menudo escucha "microservicio" y piensa "nano servicio", y esto puede causar cierta confusión. Estos son micro -servicios, por lo que no es necesario un servicio separado para cada entidad individual. Todo lo que estamos tratando de hacer debe estar en el
booking
ynotification
servicios. No necesita eldriver
servicio (para ninguna de las actividades que describió).Obtener una lista de controladores disponibles para reservar se
booking
incluye en el servicio. Una trampa común es no agrupar actividades relacionadas en el mismo servicio, esto se llama baja coherencia y es muy malo. Recuerde, agrupa las cosas en un servicio por dominio problemático, no por entidad.Ahora, en cuanto a la reutilización, la ventaja de tener un microservicio separado es que ahora puede tener tres equipos separados que hacen que el consumidor enfrente las aplicaciones. Un equipo para la aplicación web html estándar, una aplicación para Android y una aplicación para iOS. Todas estas aplicaciones diferentes se pueden construir de manera completamente diferente y se ven apropiadas para su plataforma particular (sin repetir el código). Las
booking
tres aplicaciones reutilizan el código de servicio, ya que las tres hacen llamadas http al servicio en lugar de tener su propio código de reserva.Un flujo de reserva típico se vería así:
booking
servicio para obtener una lista de los controladores disponibles.booking
serviciobooking
servicio llama alnotification
servicio con los detalles de la reserva.notification
servicio envía una notificación al conductor, notificándole de la reserva.notification
servicio cuando están a una milla del clientenotification
servicio envía la alerta al cliente de que su conductor está casi allí.Espero que esto haya ayudado; recuerde, son microservicios, no nano servicios, no intente dividir el mismo dominio problemático. Entonces, para responder el título de su pregunta, cuando mantiene un microservicio del tamaño adecuado, toda o la mayor parte de la lógica comercial para ese dominio problemático puede vivir dentro de ese microservicio.
fuente
Todo depende de su requerimiento exacto.
Digamos que tiene dos aplicaciones haciendo la reserva:
En cuanto al sistema de notificaciones, puede hacer que los microservicios se suscriban a su servicio de reserva para escuchar cualquier nueva reserva. Como tal, el microservicio de reserva notificará a todos los suscriptores y actuarán en consecuencia.
El único problema en este tipo de arquitectura es qué sucede si algo falla después de que se haya publicado la notificación, ya que los dos microservicios no funcionan como dos funciones que se ejecutan en la misma transacción de la base de datos, deberá manejar los errores con gracia y, finalmente, reproducir los procesos que han fallado (automática o manualmente)
fuente
La respuesta simple es que los clientes de microservicios son los que administran la lógica de negocios en una arquitectura de microservicios "pura". Para que sea más fácil de entender, considere un ejemplo aún más simple. Un servicio que solo devuelve flujos de bytes basados en un URI. Por sí solo, no es terriblemente útil. Sin saber de alguna manera qué URI tienen qué, solo puedes adivinar dónde sacar las cosas. Ahora suponga que tiene un microservicio diferente que proporciona una capacidad de búsqueda. Envía una solicitud con una cadena de consulta y devuelve URI. Ahora las cosas se ponen más interesantes. Puedo poner referencias a URI para el primer servicio en un índice.
Pero aún así, necesitamos coordinar de alguna manera entre estos dos. Hay una respuesta simple: usa un navegador para recuperar los URI del servicio de índice y luego recupera los datos del servicio de datos. Ninguno de los servicios 'sabe' sobre el otro y no hay absolutamente ningún acoplamiento entre ellos. Puedo usar el servicio de índice con cualquier otro servicio de datos y viceversa.
No es necesariamente el caso de que este sea el mejor enfoque en todos los escenarios, pero hay muchos beneficios para construir cosas de esta manera, especialmente la reutilización en escenarios que actualmente no se conocen.
fuente