V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
xhwdy26
V2EX  ›  程序员

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

  •  
  •   xhwdy26 · 5 天前 · 3084 次点击

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

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

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

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

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

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

    bilibili 很多接口都没 https 直接抓包能看到不少东西
    jeesk
        20
    jeesk  
       4 天前 via Android
    {
    "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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1006 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 18:46 · PVG 02:46 · LAX 10:46 · JFK 13:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.