• 请不要在回答技术问题时复制粘贴 AI 生成的内容
xhwdy26
V2EX  ›  程序员

手机 APP 怎么做到动态切换域名?

  •  
  •   xhwdy26 · Feb 1, 2025 · 5192 views
    This topic created in 648 days ago, the information mentioned may be changed or developed.

    在手机 APP 初始化配置了域名 A 和域名 B ,如果域名 A 访问慢,切换到域名 B 访问,我们是根据 ping 值,或者无法访问作为一个判断的依据。

    这样有没有问题,请教诸位大神,或者有更好的思路不吝赐教。

    20 replies  •  2025-02-03 02:44:57 +08:00
    Solix
    Solix
    Feb 1, 2025 via iPhone
    1
    500 就切换,以防万一逻辑可以做在客户端,再另外配置域名拉域名名单,每个域名再配置拉最新名单
    eas
    eas
    Feb 1, 2025
    2
    这个不是应该在 dns 负载那头动脑筋嘛?
    tunggt
    tunggt
    Feb 1, 2025 via Android
    3
    就像楼上说的 dns 负载均衡,或者你分区域分运营商解析。
    要么直接用 cdn 。
    不过你这访问响应,能根据用户的 ping 值?
    R4rvZ6agNVWr56V0
    R4rvZ6agNVWr56V0
    Feb 1, 2025
    4
    直接用腾讯云 DNS 解析,付费就能开通 IGTM 做故障监测自动切换,不需要理解高深的 HA 架构、不需要改动代码解决。
    GG668v26Fd55CP5W
    GG668v26Fd55CP5W
    Feb 1, 2025 via iPhone
    5
    这个有点类似翻墙软件的负载均衡,选择最快的节点,可以定时检测,使用一条 URL 检查响应时间
    hefish
    hefish
    Feb 1, 2025
    6
    根据 ping 值切换是不是有些草率了?
    codegenerator
    codegenerator
    Feb 1, 2025 via Android
    7
    可以用一个简单接口代替 ping ,其他都没有问题
    xhwdy26
    xhwdy26
    OP
    Feb 1, 2025
    8
    各位,关键问题是 A 域名是天朝,B 域名是某国,这些都无效,这些 DNS 可能无法用上
    tunggt
    tunggt
    Feb 1, 2025 via Android
    9
    @xhwdy26 你服务器 ip 和域名无关。
    你分区域解析,不就行了。
    难道你以为同一服务器,绑定不同国别域名,访问速度就会不一样?
    ETiV
    ETiV
    Feb 1, 2025 via iPhone
    10
    如果你是个正经的 app ,就不要在国内上架能访问海外的,反之亦然
    hzplszl
    hzplszl
    Feb 1, 2025
    11
    搞个小文件放到两个域名,客户端在网络切换或者其他有必要的场景下,去下载文件竞速,选择更快的域名
    yinmin
    yinmin
    Feb 1, 2025 via iPhone❤️1
    12
    正统的做法是用一个域名做智能 dns ,国内用户返回国内 ip ,国外用户返回国外 ip 。

    如果你要做竞速,建议别用 ping ,直接用 tcp/https 发起第一个请求,看哪个请求先有回复就用哪个。因为有些网络环境(例如 fakeip )是没法 ping 的。
    chi1st
    chi1st
    Feb 1, 2025
    13
    楼上正解,智能 DNS
    yinmin
    yinmin
    Feb 1, 2025 via iPhone❤️1
    14
    接#12 为什么不要用 ping ,因为有些网络环境,例如 fakeip 环境解析出的 ip 地址是假 ip (常见 198.18.x.x ),ping 是毫无意义的,另外某些网络防火墙可能会屏蔽 icmp 或者 tcp 包,出现 ping 不通但 tcp 通 或者 ping 通但是 tcp 不通的情况。

    如果你需要多服务器竞速,可以专门做一个 api 接口简单返回“OK”数据包,在 app 启动/网络切换/连接出错时,同时对多个服务器发起这个 api 请求,看哪个先返回就优先哪个。
    jinliming2
    jinliming2
    Feb 1, 2025
    15
    用户的网络情况可能是很复杂的,即便是在没有防火墙的国家,也可能会遇到比如连接了需要登录的 Wi-Fi 之类的情况,所有域名解析都会被拦截并跳转到 Wi-Fi 登录页面,所以 ping 、tcp ping 、普通 http 请求都是不可靠的。

    所以 #12/#14 正解,但是服务器竞速比较常用的方法是提供一个 http 的 /generate_204 接口(/generate_204 属于事实上的标准,虽然没有定义标准,但大部分网站选择遵守),这个接口没有任何逻辑,仅返回 HTTP 状态码 204 ,且没有 body 。业务需要判断接口返回的状态码是 204 而非其他。
    在 /generate_204 正常返回之前,都属于网络未连接的状态,应当以一定时间间隔(通常时间间隔越来越大)重试,直到最先返回的就是最快的。后续定期检查更新网络状态。
    xhwdy26
    xhwdy26
    OP
    Feb 2, 2025
    16
    谢谢各位 V 友的解答,各位新年快乐!
    sujin190
    sujin190
    Feb 2, 2025 via Android
    17
    @xhwdy26 而且手机似乎会在网络变化 dns 服务器变更的时候 dns 记录自动失效,已经建立的连接也会断开,这样分区解析会自动更新,毕竟手机是移动的
    jim9606
    jim9606
    Feb 2, 2025
    18
    一般来说,负载均衡是优先在服务器侧做的,对外入口是负载均衡网关,网关做健康监测和转发。
    在此之上客户端做的是 fallback ,这个一般用连接超时和响应异常,不推荐用 ping ( icmp echo ),而且很多环境只管 tcp udp 能不能通的。
    jeesk
    jeesk
    Feb 3, 2025 via Android
    19
    参考 bilibili 请求一个接口,返回这个地域可用的 api ip 即可。。

    bilibili 很多接口都没 https 直接抓包能看到不少东西
    jeesk
    jeesk
    Feb 3, 2025 via Android
    20
    {
    "dns":[
    {
    "host":"app.bilibili.com",
    "client_ip":"58.19.1.96",
    "ips":[
    "221.15.71.67",
    "221.15.71.66",
    "221.15.71.65",
    "61.240.206.10",
    "221.15.71.64",
    "61.240.206.13",
    "112.83.140.13",
    "112.83.140.12",
    "61.240.206.11",
    "61.240.206.12",
    "112.83.140.11",
    "112.83.140.14"
    ],
    "type":1,
    "ttl":52,
    "origin_ttl":90
    }
    ]


    这是 bilibili 请求

    http://203.107.1.34:80/191607/resolve?host=app.bilibili.com&query=4

    你说他是怎么做的?。特殊地区返回特殊 ip
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   904 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 20:40 · PVG 04:40 · LAX 12:40 · JFK 15:40
    ♥ Do have faith in what you're doing.