consul_srv_client.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import random
  2. import re
  3. import socket
  4. import struct
  5. from dns import resolver,exception
  6. from cachetools import TTLCache
  7. # 配置自定义 DNS 服务器
  8. custom_resolver = resolver.Resolver()
  9. custom_resolver.nameservers = ['10.0.0.1', '10.0.0.32', '10.0.0.2']
  10. cache = TTLCache(maxsize=100, ttl=90)
  11. # 设置端口号(这里假设所有服务器都使用 8600 端口)
  12. for server in custom_resolver.nameservers:
  13. custom_resolver.port = 8600 # 注意:通常不需要对每个服务器单独设置,除非它们使用不同端口
  14. def extract_ip_prefix(encoded_address:str):
  15. match = encoded_address.split(".")[0]
  16. return match
  17. def decode_address(encoded_address):
  18. hex_address = extract_ip_prefix(encoded_address)
  19. binary_address = bytes.fromhex(hex_address)
  20. return socket.inet_ntoa(binary_address)
  21. def get_srv(srv_record_name):
  22. try:
  23. if srv_record_name not in cache:
  24. answer = custom_resolver.resolve(srv_record_name, 'SRV')
  25. cache[srv_record_name] = answer
  26. else:
  27. answer = cache[srv_record_name]
  28. selected_rdata = random.choice(answer)
  29. ip_address = decode_address(selected_rdata.target.to_text())
  30. print(f"Service: {srv_record_name} - {ip_address}:{selected_rdata.port} ")
  31. return ip_address, selected_rdata.port
  32. except exception.DNSException as e:
  33. print(f"DNS exception: {e}")
  34. raise
  35. def del_cache(srv_record_name=""):
  36. if srv_record_name:
  37. cache.pop(srv_record_name, None)
  38. else:
  39. cache.clear()
  40. def main():
  41. # 查询 SRV 记录
  42. srv_record_name = 'video-get.service.consul'
  43. # srv_record_name = 'consul.service.consul'
  44. get_srv(srv_record_name)
  45. get_srv("prefect.service.consul")
  46. if __name__ == "__main__":
  47. main()