[Android]APP多域名服务高可用方案_一个app要连多个域名灾备吗-程序员宅基地

技术标签: 动态域名切换  android  高可用  Android  

负责公司的基础数据扫描采集.
这部分对于系统的可用性基本是100%
所以做了很多高可用的方案

前置准备

在对APP进行高可用实施之前,我们需要准备:

1.核心域名多个降级[一主多备]

最基础的要求,必须!!!
能够支持云端下发 & 本地动态切换(蓝-绿发布 & 灰度 & UAT)

2.多个CDN

每个域名 都使用不同CDN,避免因CDN节点故障导致服务不可用(出现过因CDN节点异常的生产故障)

3.多个部署网络机房

每个域名 部署在不同地域网络机房(出现过主干线因施工被挖断的生产故障)

===========================================================================
核心思想就是: 同城保活、异地灾备再结合服务检测、异常动态切换

以上都是实际生产故障的血泪经验总结.
那么下面简单说一下几种APP的高可用实施方案.


说明

域名的调用优先级是基于云端下发的配置来了
云端下发的多域名配置会缓存在内存.
每次网络请求,都遵循
多域名[0] --> 多域名[1] --> 多域名[2] …


动态多域名下发

这个是必备的,也没什么好说的,略…


CDN节点异常 & CDN选优

启动一个服务,定时对服务进行 ping,出现异常的,直接切换到其他备用域名,直至主服务恢复
贴一下工具类:

public static PingResult customCMD(String host,String command){
        PingResult result = new PingResult();
        try {
            result.host = host;
            Process process = Runtime.getRuntime().exec(command+host);
            process.waitFor();
            result.success = true;
            InputStreamReader reader = new InputStreamReader(process.getInputStream());
            BufferedReader br = new BufferedReader(reader);
            List<String> echo = new ArrayList<>();
            String line;
            while ((line = br.readLine()) != null) {
                echo.add(line);
            }
            PingResultParser.parsePingContent(result, echo);
        } catch (Exception e) {
            e.printStackTrace();
            result.success = false;
            result.ping_time = -1.0;
        }
        return result;
    }

    public static class PingResult {
        public String host;
        public boolean success;
        public double ping_time;

    }

    private static class PingResultParser {

        static void parse(PingResult result, List<String> echo) {
            //          PING www.a.shifen.com (xxx.xxx.xxx.xx) 56(84) bytes of data.
            //          64 bytes from xxx.xxx.xxx.xx: icmp_seq=1 ttl=52 time=21.5 ms
            //
            //           --- www.a.shifen.com ping statistics ---
            //          1 packets transmitted, 1 received, 0% packet loss, time 0ms
            //          rtt min/avg/max/mdev = 21.585/21.585/21.585/0.000 ms
            if (echo.size() == 6) {
                result.ping_time = getPingTime(echo.get(1));
            }
        }

        static double getPingTime(String line) {
            String[] block = line.split(" ");
            String timeStr = block[6].split("=")[1];
            return ValueUtils.parseDouble(timeStr, 0);
        }

        static void parsePingContent(PingResult result, List<String> echo) {
            for (String line : echo) {
                //ping的内容
                if (line.contains("icmp_seq=") && line.contains("ttl=") && line.contains("time=")) {
                    String[] block = line.split(" ");
                    String timeStr = block[6].split("=")[1];
                    Log.d(TAG, "IP:" + result.host + ",耗时为:" + timeStr + " ms");
                }

                if (line.contains("rtt min/avg/max/mdev")) {
                    String timeResult = line.split("=")[1];
                    String[] split = timeResult.split("/");
                    //取平均时间
                    result.ping_time = Double.parseDouble(split[1]);
                    Log.d(TAG,"域名切换检测==="+result.host+",ping为:"+result.ping_time);
                }
            }
        }
    }

开启服务,定期对每个域名跑一边就行,可以使用这个命令
**ping -c 3 -w 2 **
然后基于结果,动态的对retrofit的BASEURL进行切换即可.


请求异常动态切换域名

自定义拦截器,在碰到请求异常时,动态切换至下一个域名自动重新请求,直至所有域名重试完成
如果只需要简单的重试,通过获取**chain.request()**的url,判断host是否为 多域名,是否支持动态切换,然后动态切换,重试就行.
如果不理解的话,建议看一下okhttp的相关源码对于拦截器的实现.

我在这个基础上,额外新增了自定义注解.
主要是用来对于特定服务,实行额外的自定义重试

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RetryCount {
    int extraCount();
}

不过需要注意的是,需要retrofit版本在2.5.0 及以上才行

request = chain.request();
//获取重试请求的自定义注解
Invocation tag = request.tag(Invocation.class);
Method method = tag != null ? tag.method() : null;
RetryCount retryCount = method != null ? method.getAnnotation(RetryCount.class) : null;

最小化上云

这种方案是另外一个方向了
大概是这样
在这里插入图片描述
通过动态生效的 功能开关进行控制.
当发现主服务异常时.主动将流量切换至 阿里云 / 华为 等云服务.
先保障用户能够正常使用.先把数据上传上来.
再通过 积压监控 + webhook机器人告警等方式.
去进行消费,解析会主服务.

End

好久没写Android方面的博客了.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/heming9174/article/details/121180776

智能推荐

MySQL使用时遇到的问题总结_error 1262 (01000): row 1 was truncated; it contai-程序员宅基地

文章浏览阅读3.8k次,点赞3次,收藏15次。1、MySQL导入csv文件LOAD DATA INFILE '/tmp/all_macvendor_devtype.csv'INTO TABLE tbl_devtype_script_all_macvendor_devtype_tempFIELDS TERMINATED BY ','OPTIONALLY ENCLOSED BY '"'lines terminated by '\r\n'ignore 1 lines(strkey, strdevtype);FIELDS TERMIN.._error 1262 (01000): row 1 was truncated; it contained more data than there w

使用Intellij idea创建一下java后台项目并实现第一个接口_idea后端实例接口教程-程序员宅基地

文章浏览阅读6.9k次,点赞5次,收藏40次。使用Intellij idea创建一下java后台项目1.下载并安装Intellij idea.2.选择Create New Project3勾选左侧的Spring Initializr ,点击next4.填写项目名称和包名,点击next5.勾选左侧web ,然后勾选中间的sping web,点击右侧的next6.等待项目创建完成。..._idea后端实例接口教程

安卓手机怎么投屏台式计算机,怎么将手机投屏到台式电脑上-程序员宅基地

文章浏览阅读9.3k次。大家在平时使用手机时,是不是总是觉得自己的手机屏幕小,打游戏或者追剧不过瘾,想着自己的屏幕像电脑一样大就好了!其实方法很简单,就是投屏!那么手机如何投屏到电脑上呢?小编就来和大家分享一种无需软件和数据线的方法,小白看完都能学会的操作!一、电脑端设置实现这种操作的前提是让手机与电脑处于同一个网络下;1. 然后在电脑端任务栏找到【设置】功能按钮并点击,然后选择【手机】—【转到体验共享设置】,使手机与电..._安卓怎么投屏到台式电脑

深度学习实践1--FashionMNIST分类_fashion mnist-程序员宅基地

文章浏览阅读5.3k次,点赞8次,收藏88次。目录一、深度学习实践目录实践1--FashionMNIST分类文章目录前言二、FashionMNIST分类1.介绍数据集2.获取数据集3.分批迭代数据 4.数据可视化5.构建网络模型​6.选择损失函数和优化器7.训练8.验证 9.训练并验证 10.写成csv 11.完整代码总结随着人工智能的发展,深度学习也越发重要,目前深度学习可以应用到多方面,如图像处理领域、语音识别领域、自然语言处理邻域等。本篇是深度学习的入门篇,FashionMNIST图像分类。_fashion mnist

Cesium+Vue3+vite环境搭建详细教程_vite+vue cesium geoserver-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏11次。Cesium+Vue3+vite环境搭建详细教程_vite+vue cesium geoserver

在jupyter notebook运行指定conda虚拟环境(附带sklearn安装教程)_新建的annaconda虚拟环境怎么用jupyter打开-程序员宅基地

文章浏览阅读2.3k次,点赞5次,收藏25次。在jupyter notebook运行指定conda虚拟环境(附带sklearn安装教程)_新建的annaconda虚拟环境怎么用jupyter打开

随便推点

DCMM数据管理能力成熟度评估-微信小程序_dcmm 操作题-程序员宅基地

文章浏览阅读2.1w次。数据管理做它的出发点它是一个简单工具类微信小程序用于企业数据管理能力成熟度的初步评估 做它的理论依据 通过收集企业数据管理能力相关现状数据结合业界现有评估模型, 给出结果模型展示图评估模型, 如 DCMM设计和数据来源, 保密 它的现有功能 有两套试题1 DCMM数据能力成熟度-快速评估 (评估预计5分钟)2 DCMM数据能力成熟度-全面评估 (评估预计30分钟)试卷1快速评估, 有28道题每道题 为DCMM的28个子域,中的一个你简单..._dcmm 操作题

兴盛优选后端技术栈的理解-程序员宅基地

文章浏览阅读172次。毕业三个月,入职了长沙兴盛优选后端开发工程师一职,这里用的技术栈十分类似阿里淘系,因为大部分员工都是社招从阿里挖过来的.既然是淘系技术栈,常见的就是那一套dubbo+zk当分布式框架,spring全家桶,常见中间件redis,mq等,还使用到了携程研发的配置中心Apollo。缓存的使用,消息队列的使用都是很基本的层面。兴盛优选后端技术栈的理解。

Could NOT find HDF5 (missing: HDF5_LIBRARIES HDF5_INCLUDE_DIRS)问题解决笔记-程序员宅基地

文章浏览阅读1.5w次。问题描述:在安装HDF5时候,同样遇到了上次没有遇到的坑。提示出粗:cmake: 13 (message) Could NOT find HDF5 (missing: HDF5_LIBRARIES HDF5_INCLUDE_DIRS)可是按照上次的笔记没有问题啊ubuntu安装HDF5链接库。怎么又抽风找不到了。问题解决:声明变量地址,即可解决。export PA_could not find hdf5

2021-01-16_libmysql.dll在哪-程序员宅基地

文章浏览阅读248次。vs2017 连接mysql 8.0我的环境:vs2017 64bit + mysql 8.0 64 bit(完整版)1.把 libmysql.dll 复制到 xxx.vcxproj 的同级目录,libmysql.dll 在安装mysql安装目录下找,我的在C:\Program Files\MySQL\MySQL Server 8.0\lib文件夹里。放到这个位置:libmysql.lib 拷贝到 与xxx.sln 同级目录的 自己新建的lib文件夹下(工程文件夹的其他位置均可,加载的时候对应好_libmysql.dll在哪

YT88 USB 加密狗 使用方法(一)加壳-程序员宅基地

文章浏览阅读2.3w次,点赞5次,收藏31次。资料下载地址: http://www.dgyzt.com/share.php?id=7到目录:YT88-11-6\外壳加密11(推荐)\外壳加密工具11.6.exe 运行 “外壳加密工具11.6.exe” 其 对应的说明文件为:YT88-11-6\外壳加密11(推荐)\使用说明\使用说明.txtStep1:点击保护Step2:点击 添加密钥Step3:输入..._yt88

Power BI DAX 分组排名 分层排名_powerbi分组排名-程序员宅基地

文章浏览阅读2.2k次,点赞5次,收藏2次。这个DAX公式采取类似Excel行上下文的功能,首先建立一个参数等于类别,在Rankx函数第一个参数添加一个Filter,实现同一类别内进行排名,即分层排名。上述DAX公式使用的是ALLEXCEPT函数,是ALL家族函数,功能是除了第二个参数【类别】都是行上下文计算排名,这样就实现了分组分层排名。如上例,Rankx只有前两个参数是必要的,实际可以输入五个参数,设置排序方式。通过在第一个参数添加函数可以实现进阶功能,例如分组分层排名,依旧使用上述数据。再使用Rankx计算排名。首先建立销售和度量值。_powerbi分组排名