你的应用有开关吗?

你的应用有开关吗?能不能像灯的开关一样,在需要时打开,在不需要时关闭呢,像USB一样,即插即用呢? 2018-02-25 22:37:21 应用开关Java 制作QQ微信支付宝三合一收款码 最近在逛博客时,发现很多博客都带了打赏功能,虽说打赏的人可能很少,但始终是一份心意,能让博主知道自己写的文章有用,能够帮助到人。所以,我也想加一个打赏功能~ 2018-02-25 17:15:38 PHP收款码支付宝 50道CSS基础面试题(附答案) 本文总结了50道CSS基础面试题,附答案,其中包括“介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的?”等等。

你的应用开关吗?能不能像灯的开关一样,在需要时打开,在不需要时关闭呢,像USB一样,即插即用呢?

「啪」天色暗下来时,房间里的灯打开了。

「啪」,睡觉时,房间里的灯又关上了。

有个开关可真方便。

[[220644]]

「你的应用有开关吗?为啥不给我加个开关?」,你的应用高叫着,并且在不经意的时候,给你来一个突然袭击。

你的应用有开关吗?能不能像灯的开关一样,在需要时打开,在不需要时关闭呢,像USB一样,即插即用呢?

答案当然是一定的,甚至在一些讲应用开发、设计原则的书籍中,都会将应用是否饮食「回退」功能做为很重要的一项。这里所谓的回退,和我们所说的开关类似,都需要在必要的时候将功能退回到升级前。

假设在周五下班前,你把这一周新开发的功能推到线上,开开心心的合上电脑,去健身了。

健身时脑海里还计划着周末要怎样happy,想着这些,笑意挂上了嘴角。这时,手机响了。挂断几次还坚持打进来。一听,是接到客户反馈,线上应用出了问题,新开发的功能影响了其他东西。这该如何时候,只能收拾东西,加班分析新的代码,找寻修复的方式,再加新代码上线,解决这个问题。

如果有「回退」功能,此时你就可以回退到你上线前,然后仔细检查,不需要急于一时。

如果有开关,你就可以将新的功能「关」掉,然后线上继续跑,不影响其他功能分毫,分分钟解决问题。

怎么关呢?

我们都知道 Javaclass 在类加载器中加载一次,所以如果在线上出现问题需要处理时,就需要停服更新 class 来升级应用。虽然像我们之前提到的一些方法,也可以实现热加载,但生产环境里较少使用。

除了修改class文件外,我们还可以在代码里编写各种 If/else来进行开关判断,这个时候如果需要关闭功能是,停服更新的不再是class,而是配置信息。

我们在应用的页面里大概都写过类似符合某种条件展示xxx内容之类的判断,例如JSP、FreeMarker 之类的在通过一些条件标签来进行页面的渲染进行控制。

在前后端分离,API开发的时候,如何进行这些返回结果的控制呢? 这不简单嘛, if / else 一把梭。

但有些时候,比如需要进行A/B Test, 需要根据Alpha、Beta 阶段进行用户控制,甚至是线上产生了问题,需要把新上的一个feature停掉... 等等这一系列

问题,如果硬编码到系统里,每次规则发生变更时,都需要修改代码,部署上线,不够灵活。

同时,对于A/B Test 这种想要快速实验的场景,也不够及时。

为了就对类似上述的场景, Matrin Flower 提出了一个 「Feature Toggle」的概念,对,就是那个提出DI 概念的哥们。(不要吐槽老M 的概念为啥这么多:))。

The basic idea is to have a configuration file that defines a bunch of toggles for various features you have pending. The running application then uses these toggles in order to decide whether or not to show the new feature.

这里的Toggle就是个开关,针对feature 的开关,决定在什么时候开启什么feature。

针对 feature,除了可以像上面解决线上临时问题时进行开关外,也可以进行访问权限控制,对于特定群组的用户提供某些功能,同时也可以用于实现快速的 A/B Test 的目的,来验证产品的猜想。

关于 feature toggle,各种语言有不同的实现,具体请参见这里:

http://featureflags.io/resources/

在Java中,较常用的是 Togglz。

Togglz 的使用类似这样:

  1. if(MyFeatures.HOT_NEW_FEATURE.isActive()){
  2. //新特性写这里
  3. }

你说这不就和我自己写if/else吗? 当然不是啦。这个实现将用户获取,开关状态获取都进行了抽象,可以进行自己的Configuration实现,

  1. publicclassMyTogglzConfigurationimplementsTogglzConfig{
  2. publicClass<?extendsFeature>getFeatureClass(){
  3. returnMyFeatures.class;
  4. }
  5. publicStateRepositorygetStateRepository(){
  6. returnnewFileBasedStateRepository(newFile("/tmp/features.properties"));
  7. }
  8. publicUserProvidergetUserProvider(){
  9. returnnewServletUserProvider();
  10. }}

然后具体的开关的状态就在stateRepository中进行了定义,可以放在内存中,文件中,数据库中等等。此时可以再搭配上配置中心等,来实现应用功能的动态开关,不影响你周末时光。

【本文为清一色专栏作者“侯树成”的原创稿件,转载请通过作者微信公众号『Tomcat那些事儿』获取授权】

戳这里,看该作者更多好文

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月5日 02:54
下一篇 2023年5月5日 02:54

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信