Todos nuestros microservicios, independientemente de c贸mo se comuniquen entre s铆, proporcionan una especie de interfaz de latido para que el sistema de monitoreo pueda descubrir en cualquier momento c贸mo es; como el estado general de salud y algunas particularidades espec铆ficas, por ejemplo, sumas de comprobaci贸n para los datos internos con los que est谩n tratando. No se trata del transporte principal: aqu铆 RabbitMQ
y Redis
bien.
Y a veces tiene sentido proporcionar la interfaz m谩s simple ( HTTP ) para exportar datos relevantes. Pensando en esta direcci贸n tambi茅n, a la larga quiero deshacerme completamente de Redis
a favor de una soluci贸n interna para almacenar pares clave-valor, como lo hicimos con 茅xito exactamente hace dos a帽os con PubSub
.
Por lo tanto, en lugar de reinventar las bicicletas con cada nuevo microservicio, decid铆 crear una biblioteca de complementos que pudiera resolver este problema poco sofisticado de proporcionar datos arbitrarios desde cualquier aplicaci贸n con c贸digo cero (excepto tres l铆neas en config.exs
). Ya sea un simple latido ( HTTP 200 OK
) o una larga lista de tipos de cambio actuales.
La soluci贸n se basa en este tweet de Dave Thomas .
Servidor API JSON en peso de la pluma
Camarero es una soluci贸n lista para usar para agregar algunas funciones de API JSON a una aplicaci贸n existente o incluso para implementar una API JSON no tan confusa desde cero cuando las soluciones m谩s complejas (l茅ase: pesadas) no son deseables. La siguiente imagen muestra c贸mo, en un caso t铆pico, podemos conectarlo y usarlo.

La biblioteca de ninguna manera fue dise帽ada para convertirse en un sustituto de soluciones completas como el F茅nix. De ninguna manera, no. Esto es simplemente un complemento , cuando el microservicio solo necesita exponer un par de API API HTTP. Camarero , en algunos casos, puede ser un buen candidato para reemplazar Redis
, o cualquier otro almac茅n de valores clave (tambi茅n en su grupo de peso). La principal diferencia con este tipo de soluci贸n web es que esta biblioteca es realmente r谩pida.
Estos son los tiempos de respuesta HTTP para devolver un valor de clave de una tabla hash con un mill贸n de claves.

S铆, no hay trampa. El tiempo de respuesta HTTP para una solicitud a trav茅s de kv-storage con un mill贸n de valores es de varias decenas de microsegundos en el peor de los casos.
Detalles de implementaci贸n
Se supone que Camarero se conecta a una aplicaci贸n en ejecuci贸n simplemente activando la biblioteca y tres l铆neas en el archivo de configuraci贸n. Procesa las rutas configuradas, delegando la ejecuci贸n a los m贸dulos de controlador designados. La configuraci贸n m谩s simple podr铆a verse as铆:
config :camarero, carta: [Camarero.Carta.Heartbeat], root: "api/v1"
Eso es todo, por lo que, probablemente, est谩 claro: /api/v1
: la ra铆z del servidor web, una ruta de heartbeat
(configurada desde el interior del m贸dulo, de forma predeterminada, el nombre sin prefijo) con el controlador Camarero.Carta.Heartbeat
. Los controladores tambi茅n se pueden agregar din谩micamente en tiempo de ejecuci贸n mediante llamadas a Camarero.Catering.route!
.
Manipuladores
Un controlador es un m贸dulo que implementa el comportamiento Camarero.Plato
. Consiste en m茅todos de manipulaci贸n de repositorio CRUD est谩ndar. Para su uso como controlador de solicitudes HTTP entrantes, cualquier m贸dulo que implemente este comportamiento es adecuado.
Hay un ajuste a煤n m谩s fino: comportamiento Camarero.Tapas
, que administra el CRUD dentro de cada contenedor Camarero.Plato
, para un par clave / valor. Por lo general, no necesita profundizar tanto al usar la biblioteca.
La implementaci贸n predeterminada usa el mapa %{}
como contenedor y parece bastante compacto:
defmodule Camarero.Carta.Heartbeat do use Camarero.Plato end
Este es un m贸dulo Heartbeat
puro, sin barnizar, incluido en la biblioteca de forma predeterminada. Usos menos triviales se describen en la documentaci贸n .
Ajuste fino
Sin excepci贸n, todos los m茅todos de ambas implementaciones predeterminadas ( Camarero.Tapas
y Camarero.Plato
) se redefinen f谩cilmente. Por ejemplo, para usar una ruta personalizada para un m贸dulo, as铆 como un contenedor personalizado, puede hacer lo siguiente:
defmodule Camarero.Carta.Heartbeat do use Camarero.Plato, container: %MyStructWithAccessBehaviour{} @impl true def plato_route(), do: "internal/heartbeat" end
Configuraci贸n del servidor web
Camarero necesita un servidor Cowboy2 y CowboyPlug para funcionar . Aqu铆 hay una configuraci贸n t铆pica de Cowboy2 en config.exs
:
config :camarero, cowboy: [port: 4043, scheme: :https, options: []]
Lo que Camarero no reclama
Esta biblioteca de ninguna manera pretende competir con soluciones complejas. No est谩 en 茅l, y, casi con certeza, nunca habr谩 autorizaci贸n ni autenticaci贸n, es decir, lo usamos solo para servicios dentro de una nube privada.
Todos los m贸dulos de procesamiento se generan, por lo tanto, a excepci贸n de la sobrecarga de la interfaz, no es posible realizar ajustes adicionales. Esto tambi茅n se hace deliberadamente.
Pero es m谩s r谩pido que cualquier an谩logo en todos los puntos de referencia .
隆Ten una buena respuesta r谩pida!