假設我有一個具有以下要求的 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
問題: 我可以使用網域名稱在單一 URL 中建立這三個 API 存取嗎?例如,http://範例/api對於這三台電腦(單一 URL 中的 A、B 和 C)http://範例/api)?
我所知道的是 DNS 可能會傳回多個 IP,並且用戶端可以以循環方式選擇 1 個 IP。然而,在這種情況下,A、B和C擁有不同的資源。所以需要將客戶端映射到特定的機器上。例如,來自客戶端1的請求需要對應到資源X所在的電腦A。
後續問題: 如果DNS不適合,是否有其他分散式協定來實現這種系統?
謝謝。
答案1
你有多種選擇,最簡單的一種:
使用循環的 DNS 記錄,例如 api.yourcompany.com,以便所有用戶端都可以透過以下方式存取 apihttp://api.yourcompany.com/api並且由於循環賽,訪問將或多或少地平衡。然後,對於每個服務 X、Y、Z,您可以使用指向正確伺服器的 CNAME 建立一條 DNS 記錄,例如 servicex.yourcompany.com、servicey.yourcompany.com ...。
正如 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 等。