gpt4 book ai didi

python - 将 SRV DNS 记录与 python requests 库结合使用

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:55 29 4
gpt4 key购买 nike

是否可以让Python请求库解析带有SRV记录的consul域名,并在发出请求时使用正确的IP地址和端口?

例如,假设我在端口 8080 上使用 IP 地址 172.18.0.5 运行 serviceA,并且该服务已向 consul 注册。并且考虑到主机的 DNS 设置为使用 consul 来解析查询。我可以提出这样的请求:

requests.get('http://serviceA.service.consul')

并让它等同于请求:

requests.get('http://172.18.0.5:8080')

最佳答案

我最终为请求编写了一个补丁,可以使用 this answer 来执行此操作。由于请求库的更新,我不得不进行一些更改。此补丁适用于请求版本 2.11.1。

我使用dnspython库来解析SRV记录,它期望consul正在监听DNS请求的IP地址和端口可作为环境变量CONSUL_DNS_IP_PORT使用。要使用补丁,请从补丁所在的任何模块导入 requests_use_srv_records 函数,然后调用它。它只会尝试对以 .service.consul 结尾的主机使用 consul SRV 记录,其他主机将定期解析。

这是补丁:

# Python Imports
import os
from socket import error as SocketError, timeout as SocketTimeout

# 3rd Party Imports
from dns import resolver
from requests.packages.urllib3.connection import HTTPConnection
from requests.packages.urllib3.exceptions import (NewConnectionError,
ConnectTimeoutError)
from requests.packages.urllib3.util import connection

def resolve_srv_record(host):

consul_dns_ip_port = os.environ.get('CONSUL_DNS_IP_PORT',
'172.17.0.1:53')
consul_dns_ip, consul_dns_port = consul_dns_ip_port.split(':')

res = resolver.Resolver()
res.port = consul_dns_port
res.nameservers = [consul_dns_ip]

ans = resolver.query(host, 'SRV')

return ans.response.additional[0].items[0].address, ans[0].port

def patched_new_conn(self):

if self.host.endswith('.service.consul'):
hostname, port = resolve_srv_record(self.host)
else:
hostname = self.host
port = self.port

extra_kw = {}

if self.source_address:
extra_kw['source_address'] = self.source_address

if self.socket_options:
extra_kw['socket_options'] = self.socket_options

try:
conn = connection.create_connection((hostname, port),
self.timeout,
**extra_kw)

except SocketTimeout as e:
raise ConnectTimeoutError(
self, "Connection to %s timed out. (connect timeout=%s)" %
(self.host, self.timeout))

except SocketError as e:
raise NewConnectionError(
self, "Failed to establish a new connection: %s" % e)

return conn

def requests_use_srv_records():
HTTPConnection._new_conn = patched_new_conn

关于python - 将 SRV DNS 记录与 python requests 库结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39795400/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com