Предположим, у меня есть система REST API, которая имеет следующие требования:
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
Вопрос: Могу ли я построить эти три API доступа в одном URL, используя доменное имя. Например,http://пример/apiдля этих трех компьютеров (A, B и C в одном URL-адресе)http://пример/api)?
Я знаю, что DNS может возвращать несколько IP-адресов, и клиент может выбрать один IP-адрес по круговой схеме. Однако в этом случае у A, B и C разные ресурсы. Поэтому клиент должен быть сопоставлен с определенной машиной. Например, запрос от клиента 1 должен быть сопоставлен с компьютером A, где находится ресурс X.
Дополнительный вопрос: Если DNS не подходит, есть ли другой распределенный протокол для реализации такого рода системы?
Спасибо.
решение1
У вас есть несколько вариантов, самый простой из них:
Используйте запись DNS с циклическим перебором, например api.yourcompany.com, чтобы все клиенты могли получить доступ к API черезhttp://api.yourcompany.com/apiи благодаря round robin доступ будет более или менее сбалансированным. Затем для каждой службы X, Y, Z вы можете создать запись DNS типа servicex.yourcompany.com, servicey.yourcompany.com ... используя CNAME, указывающую на нужный сервер.
Как сказал Ян Бэмфорт, вы также можете установить перед ними обратный прокси-сервер (nginx, apache, haproxy ...) и перенаправлять на требуемые службы в зависимости от используемого URL.
РЕДАКТИРОВАТЬ:
Примеры конфигураций для 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/
Таким образом, запросы, поступающие на ваш сервер с URL /api, будутразосланныйчерез балансировщик нагрузки, URL-адреса /servicex будутразосланныйна serverx и так далее.