2024-09-27 07:22:15 发布
网友
是否可以让Python请求库解析带有SRV记录的conver域名,并在发出请求时使用正确的IP地址和端口?在
例如,假设我在端口8080上运行IP地址为172.18.0.5的serviceA,并且该服务已注册到consur。假设主机的DNS设置为使用consur来解决查询。我可以提出一个请求,比如:
requests.get('http://serviceA.service.consul')
并使其与请求等效:
我最后用this answer为请求编写了一个补丁。由于请求库的更新,我不得不做一些更改。此修补程序适用于请求版本2.11.1。在
我使用dnspython库来解析SRV记录,它期望consur正在侦听DNS请求的IP地址和端口作为环境变量consur_DNS_IP_port可用。要使用修补程序,请从修补程序所在的任何模块导入requests_use_srv_records函数,然后调用它。它只尝试对以.service.consul结尾的主机使用conversrv记录,其他主机将定期解析。在
requests_use_srv_records
.service.consul
以下是补丁:
# 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
不,除非重写requests,否则不能。在
requests
SRV记录旨在查找服务。 在本例中,您已经指示使用http。因此客户端将只查询serviceA.service.consul的A或AAAA记录。在
serviceA.service.consul
我最后用this answer为请求编写了一个补丁。由于请求库的更新,我不得不做一些更改。此修补程序适用于请求版本2.11.1。在
我使用dnspython库来解析SRV记录,它期望consur正在侦听DNS请求的IP地址和端口作为环境变量consur_DNS_IP_port可用。要使用修补程序,请从修补程序所在的任何模块导入
requests_use_srv_records
函数,然后调用它。它只尝试对以.service.consul
结尾的主机使用conversrv记录,其他主机将定期解析。在以下是补丁:
不,除非重写
requests
,否则不能。在SRV记录旨在查找服务。
在本例中,您已经指示使用http。因此客户端将只查询
serviceA.service.consul
的A或AAAA记录。在相关问题 更多 >
编程相关推荐