8.3 业务开关

    除了上面小节中提到实现服务降级中需要对代码中static值的修改,还有对应用不同版本的兼容,不同时间点走不同的优惠服务等这样的需求时,也都是采用类似业务开关的方式,通过修改程序中的static值实现业务逻辑的切换。早期这样的业务开关都是由各个部门自行实现和管理。随着这些业务开关的数量逐渐增多,大量的业务开关信息都分布到不同的系统,甚至代码中,造成运维的成本越来越大。所以集团开发出了一套统一标准和规范的业务开关管理Switch平台。

    如图8-10所示为Switch的架构示意图,Switch是一个轻量级的开关集成框架,用来集中管理集团各应用的开关,统一业务操作业务开关的方式和API,方便进行集中化管理。

    空标题文档 - 图1

    图8-10 稳定性开关平台功能架构示意图

    Switch支持不同类型的配置项和业务开关的基础推送功能,也支持多种灵活的推送方式,如下所示:

    ·线上控制台直接推送到内存。正常情况下,直接使用开关控制台推送开关值到内存。即可选择集群推送,也可选择单机推送。

    ·线上控制台持久化推送,使用Diamond配置服务器方式。持久化业务开关,即使在应用重启了,也会生效。只需在控制台推送开关的时候选择持久化即可。

    ·Diamond控制台直接推送。若switch控制台异常或奔溃,可以直接通过编辑switch的Diamond配置项来修改开关值。

    ·HTTP API推送。若Diamond推送延迟高,或者Diamond异常。可直接推送HTTP名来操作开关。

    Switch在保证基本业务开关值推送的正确性、实时性的同时,在控制台上还提供了业务开关监控功能,能监控集群开关状态,降低开关集群状态不一致带来的风险。若有机器的开关值不一样,或者某台机器已经下线,则会提醒相应的操作人,以便及时调整开关值,保持集群状态一致。从而让各应用的负责人和运维人员轻松管理自己的开关,更高效地解耦和模块化系统。

    Switch开关客户端是嵌入在应用端的SDK,采用注释的方式让开发人员非常方便地接入开关平台,示例代码如下:


    // 注册一个String型的配置项,并注入回调接口
    @AppSwitch(des="测试名字",level=Level.p2)
    public static String userName="我是名字";

    该示例中将userName作为一个业务开关值,des用来对业务开关的描述,level表示为该业务开关的级别。通过注释的添加,就能自动在开关控制台上注册该业务,并能接收到由控制台发送来的业务开关更新的指令。

    所以Switch平台通过对应用极少的代码侵入实现了开关的可视化管理和监控,让运维人员只需在Web控制台上就能实现对开关值变化的修改及推送,大大提升了对业务开关的统一管控能力。

    总体来说,Switch平台本身所提供的功能比较简单,但对于业务场景和环境复杂的分布式架构,这个平台确实能大大提升应用适应各种不同场景的自动化能力,比如通过开关的方式将正常环境下的应用逻辑切换到适配秒杀场景;当发现升级后的应用出现问题时,只需通过开关切换的方式就能让升级后的应用秒级切换到升级前的业务代码中。最重要的是在平台处于大促秒杀、应用异常时,业务开关在服务降级中所起的作用,相当于平台的最后一道保护屏障。