次のような要件を持つ 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
質問: ドメイン名を使用して、これら3つのAPIアクセスを1つのURLに構築できますか。たとえば、http://example/api3台のコンピュータ(A、B、C)を単一のURLでhttp://example/api)?
私が知っているのは、DNS が複数の IP を返す場合があり、クライアントはラウンドロビン方式で 1 つの IP を選択できるということです。ただし、この場合、A、B、C には異なるリソースがあります。したがって、クライアントは特定のマシンにマップする必要があります。たとえば、クライアント 1 からの要求は、リソース X が存在するコンピューター A にマップする必要があります。
フォローアップの質問: DNS が適切でない場合、この種のシステムを実装するための別の分散プロトコルはありますか?
ありがとう。
答え1
選択肢は複数ありますが、最も簡単なものは次のとおりです。
ラウンドロビンのDNSレコード(例:api.yourcompany.com)を使用すると、すべてのクライアントがAPIにアクセスできます。http://api.yourcompany.com/apiラウンドロビンにより、アクセスは多かれ少なかれバランスが取れます。次に、各サービス X、Y、Z に対して、適切なサーバーを指す CNAME を使用して、servicex.yourcompany.com、servicey.yourcompany.com などの DNS レコードを作成できます。
Ian Bamforth が述べたように、それらの前にリバース プロキシ (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 などへ。