使用DNS为在不同端口上运行的同一服务器上的不同服务提供服务

时间:2018-11-16 16:50:20

标签: dns

我意识到这是一个极为广泛的问题,但我确实需要一些指导。 我在服务器上使用端口50080和50090运行了两个服务。之所以这样做,是因为在Java中创建服务时,在同一端口上运行它们会产生冲突。

在服务器上设置了DNS,以返回在50080上运行的服务。基本上,当您键入域名(prod.example.com)时,默认情况下将获得该服务的get all方法。但是,我们想在50090上设置DNS来说明该服务。我想这可以在运行prod.example.com:50080转到第一个服务,而prod.example.com:50090进行第二个服务时起作用服务。

到目前为止,我还没有找到太多有关如何实现此目标的文档。这样做似乎是可行的,但是我在这样做方面空白。

1 个答案:

答案 0 :(得分:0)

如果您不在网络世界中,那么您将拥有完美的解决方案,它被称为SRV记录。它们基本上是MX记录对电子邮件所做的概括。

但是首先要注意的是,如果您在网络世界中,那么不幸的是,没有浏览器在使用这些记录,因此也可能没有HTTP(S)客户端库。在那种情况下,您确实需要对URL中的端口号进行硬编码,否则客户端将默认为80或443。或者在HTTP级别使用某种代理/重定向机制。

因此,如果您不在网络范式中,请参阅RFC 2782了解SRV记录,或查看Wikipedia article了解有关SRV记录的详细信息。

简而言之,它们提供了一种将服​​务标识(它是服务名称和传输)与其位置(基本上是主机名和端口)分离的方法,并带有其他一些属性,例如能够进行负载平衡/故障转移。

让我们说您有两个服务在同一端口上的不同端口上运行。但是您不希望对其中的任何内容进行硬编码,尤其是在客户端,因为任何服务都可以随时移至其他设备或端口。

所以您要这样做:

  • 您定义服务名称,例如foobar
  • 让我们说他们通过TCP(或TLS)工作
  • 一个在端口50080上,另一个在端口50090

然后可以在DNS中发布:

_foo._tcp.example.com. IN SRV 10 10 50080 somehost.example.com.
_bar._tcp.example.com. IN SRV 10 10 50090 somehost.example.com.

然后,您只需要确保这2个服务的客户端正在使用那里的SRV记录,即可找到用于连接以访问每个服务的正确主机名和端口号。 所有这些对于服务器都是不可见的,这只是放置在客户端中的一些逻辑。