Supongamos que tengo un sistema API REST que tiene estos requisitos:
The API that can be accessed via this URL http://<ipaddress>/api/
I have three computers with three IP addresses: IP A, B and C respectively.
Each of this computer can be accessed via URL API specified earlier.
to access A the URL is http://<IP A>/api.
to access B the URL is http://<IP B>/api.
to access C the URL is http://<IP C>/api.
Each computer may have different information / resources.
A has resource X
B has resource Y
C has resource Z
Client 1 has access in resource X
Client 2 has access in resource Y
Client 3 has access in resource Z
Pregunta: ¿Puedo crear esos tres accesos API en una sola URL usando un nombre de dominio? Por ejemplo,http://ejemplo/apipara esas tres computadoras (A, B y C en una sola URLhttp://ejemplo/api)?
Lo que sé es que el DNS puede devolver varias IP y el cliente puede elegir 1 IP en forma circular. Sin embargo, en este caso, A, B y C tienen recursos diferentes. Por lo tanto, el cliente debe asignarse a una máquina específica. Por ejemplo, la solicitud del cliente 1 debe asignarse a la computadora A donde reside el recurso X.
Siguiente pregunta: Si DNS no es adecuado, ¿existe otro protocolo distribuido para implementar este tipo de sistema?
Gracias.
Respuesta1
Tienes múltiples opciones, la más sencilla:
Utilice un registro DNS con round robin, por ejemplo api.yourcompany.com para que todos los clientes puedan acceder a la API a través dehttp://api.tuempresa.com/apiy debido al round robin el acceso será más o menos equilibrado. Luego, para cada servicio X, Y, Z puede crear un registro DNS como servicex.yourcompany.com, servicey.yourcompany.com... usando un CNAME que apunte al servidor correcto.
Como dijo Ian Bamforth, también puede tener un proxy inverso delante de ellos (nginx, apache, haproxy...) y redirigir a los servicios requeridos dependiendo de la URL utilizada.
EDITAR:
Configuraciones de ejemplo para apache
<Proxy "balancer://apicluster">
BalancerMember "http://serverx.yourcompany.com:80"
BalancerMember "http://servery.yourcompany.com:80"
BalancerMember "http://serverz.yourcompany.com:80"
</Proxy>
ProxyPass /api/ balancer://apicluster/api/
ProxyPass /servicex/ http://serverx.yourcompany.com/servicex/
ProxyPass /servicex/ http://servery.yourcompany.com/servicey/
ProxyPass /servicex/ http://serverz.yourcompany.com/servicez/
De esta manera, las solicitudes que lleguen a su servidor con URL /api seránenrutadoa través del balanceador de carga, las URL /servicex seránenrutadoa serverx y así sucesivamente.