一步步集成热修复框架Tinker–多渠道

澳门美高梅手机网站 1

前言

在上一篇小说http://www.jianshu.com/p/9db9bd3bcba4中,一步步合龙了微信的热修复Tinker难点,不过自个儿小卖部的品种,渠道就有十多个,那样难道须求打贰十个补丁吗,很醒目那不现实,有没有可能完毕用多少个补丁包,能够修复全部的水渠呢?

答案是一对,官方提出采纳项目packer-ng-plugin抑或可使用V2
Scheme的walle

下边大家用下美团的walle打包。

源码下载
https://github.com/baojie0327/HotFixTinker

用作后端应用的开发者,我们平时开发、调节和测试、测试完大家的施用并发布到生产条件,用户就足以平素访问到我们的行使了。但对于互连网应用,在您的采用和用户之间还隔着一层低调的或厚或薄的负载均衡层软件,它们不显山不露水默默的表述器重要的功用,以至于大家平日忽略了它们的留存。因为负载均衡层经常不在一般开发职员的题材域内,而且它们一般都以现成且成熟的化解方案,以至于大家习惯性的忽视和认为乏善可陈。其实否则,本文就写写作者对负荷均衡层次结构的体味和理解。

什么是walle

沃尔e(瓦力):Android Signature V2 Scheme签名下的新一代渠道包打包神器
瓦力通过在Apk中的APK Signature
Block区块添加自定义的水道消息来生成渠道包,从而增强了渠道包生作用率,能够看作单机工具来使用,也足以布署在HTTP服务器上来实时处理渠道包Apk的升级换代互连网请求。

硬负载

所谓「硬负载」就是利用硬件装备来提供负载均衡。

在七 、八年前那时自身在做 Java 的商店软件开发,开发出来的店铺级 Java
应用程序就安插在像 Weblogic 之类的利用容器中。而那类应用容器软件又跑在
Unix
的微型机上。把硬件和软件一体打包作为集团应用化解方案卖给客户。那类应用布置的方案非常粗大略,层级也正如浅。为了保险可相信性,使用两套小型机上各配备八个Weblogic Server,在应用服务前边使用像 F5
之类的硬件负载均衡器,如下图所示。

澳门美高梅手机网站 2

是因为小型总括机和前边的 F5
负载均衡硬件都比较贵,所以出于可信赖性、可维护性和资金财产的回顾考虑,一般选取铺排两套跑在两台小型总计机上,在面前共享一个F5 做负载均衡。而相似 F5 和小型计算机那类硬件设备都至少是 5 个 9
的可信性保险,所以总体的系统可信性基本有保持。

跻身互连网时期后,应用开发拥抱开源,布署使用更廉价的 PC Server
和免费开源的行使容器。负载均衡也日益从硬负载向软负载变迁,由于互连网采取的海量个性和陈设规模的熊熊膨胀,前端负载均衡也早先变得加上起来。

集成walle

walle提供了2种采用方法:

  • Gradle插件形式,方便高效集成
  • 命令行格局,最大化满意各类自定义供给
    上面我们用Gradle插件格局在项目里引入walle

软负载

进入网络公司后,大家刚开首开发应用时,业务规模小用户量还十分的小,机器数量也少(<10)。所以一开首的负载均衡的构造也是很简短的,类似硬负载只是把硬件换到了免费的开源软件并跑在可用性是有
3 个 9 的减价 PC Server 上。

澳门美高梅手机网站 3

后面2个 LVS
前面跟着多少个应用服务,后来为了方便做按域名的分流和适配切流量上线,中间又加了一层
Nginx。

澳门美高梅手机网站 4

那样就变成了两层软负载结构了,LVS 负责 4 层,Nginx 负责 7 层。 但 Nginx
只负责了单机内多实例的载重均衡,那里最首借使因为及时 PC Server
是物理机,CPU 16/32 core,内部存款和储蓄器 32/64G
不等,为了更丰硕的利用能源,一台物理机上都布署了五个应用服务实例,而考虑到
Nginx 工作在 7 层的付出远超越 LVS/D智跑 情势,所以一般在三个 Nginx
前边挂的实例数也不会当先 10 个。

但随着事情发展和用户流量上涨,机器规模也在不停扩大,导致三个网段内的 IP
都不够用了,那套负载结构又遇上了横向增加的瓶颈,因为 LVS/DSportage形式下跨不了网段。所今后来又在 LVS 和 Nginx 之间加了一层
HAProxy,负载结构就成为了上面那样。

澳门美高梅手机网站 5

实际上加了 HAProxy 之后,它也是工作在 7 层,那样 Nginx
那层看起来就不是很有须要。但三层的载荷结构能支撑更大局面包车型客车集群,而原先在
Nginx
层做了一套有利于研究开发切流量上线的运营管理系列,所以捐躯一点性情换取未来的可维护性和后天增添性,Nginx
那层就间接保留下来了。而且 Nginx 比较 HAProxy
不是纯粹的负荷均衡器,它还是能提供 cache 效用,对于有些 HTTP
请求实际只走到 Nginx 这层就能够透过缓存命中而回到。

1 在档次的build.gradle 文件中添加Walle Gradle插件的依赖

 dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath "com.tencent.tinker:tinker-patch-gradle-plugin:${TINKER_VERSION}"
      //walle 依赖
        classpath 'com.meituan.android.walle:plugin:1.1.5'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

DNS负载

乘胜工作发展,公司开首了四个 IDC 的建设,考虑到 IDC
级其余容灾,集群初始布署到五个 IDC。跨 IDC 的负荷均衡方案得以简单通过
DNS
轮询来完毕,但可控性倒霉。所以大家从未动用那种,而是选拔一主加多子域名的方法来基于业务场景完结动态域名调度和负载。主域名下实际是两个动态流量调度器,跨八个IDC 陈设,对于 HTTP 请求基于重定向格局跳子域名,对于 TCP
格局每便建立长连接前请求分配实际连接的子域名,如下图所示。

澳门美高梅手机网站 6

2 在app的 build.gradle 文件中apply这几个插件,并添加上用于读取渠道号的AALacrosse

//  配置开始walle===========================
apply plugin: 'walle'

dependencies {
    compile 'com.meituan.android.walle:library:1.1.5'
}
//  配置结束walle===========================

CDN负载

最后再添加互连网选择必不可少的 CDN
将静态财富请求的载重分流,那么任何负载的层次结构就完整了。

澳门美高梅手机网站 7

3 在app的 build.gradle 文件中配置插件

//  配置开始walle===========================
walle {
    apkOutputFolder = new File("${project.buildDir}/outputs/channels")
    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}-${flavorName}.apk'
    //configFile与channelFile两者必须存在一个,否则无法生成渠道包。两者都存在时优先执行configFile
    channelFile = new File("${project.getProjectDir()}/channel")
    //configFile = new File("${project.getProjectDir()}/config.json")
}

陈设项具体表明:

apkOutputFolder:内定渠道包的出口路径, 默许值为new
File(“${project.buildDir}/outputs/apk”)

apkFileNameFormat:定制渠道包的APK的文件名称,
私下认可值为’${appName}-${buildType}-${channel}.apk’
可选拔以下变量:

     projectName - 项目名字
     appName - App模块名字
     packageName - applicationId (App包名packageName)
     buildType - buildType (release/debug等)
     channel - channel名称 (对应渠道打包中的渠道名字)
     versionName - versionName (显示用的版本号)
     versionCode - versionCode (内部版本号)
     buildTime - buildTime (编译构建日期时间)
     fileSHA1 - fileSHA1 (最终APK文件的SHA1哈希值)
     flavorName - 编译构建 productFlavors 名

channelFile:包含渠道布局消息的文书路径

SSL 带来的载重结构变迁

乘胜网络的普及,安全题材越发严重,原本早期唯有银行网银等选取 HTTPS
格局访问,未来电商类网站也初步启用全站 HTTPS 了。引入 SSL
后对负荷结构带来了什么样影响么?SSL 属于应用层的协议,所以只能在 7
层上来做,而 HAProxy 也是支撑 SSL 商讨的,所以一种艺术是只需不难的让
HAProxy 开启 SSL 辅助完毕对内解密对外加密的拍卖。

但 HAProxy 的撰稿人不太援助那种方案,因为引入 SSL
处理是有分外的质量耗费的。那么在担负分明流量的情形下,若是原本必要 M 台
HAProxy,在拉开了 SSL 后可能须求 M + N 台
HAProxy。随着流量增进,这种艺术的横向扩充开支较高(毕竟 SSL
证书按服务器数量来收费的)。他付出的化解方案是再独自一层 SSL
代理缓存层,像下边那样。

澳门美高梅手机网站 8

L4 和 L7 之间独立的 SSL 代理缓存层只承担 SSL 协议的拍卖,把 HTTPS 转换成HTTP,并检讨本地缓存是不是命中。若未命中再转车呼吁到后端的 L7
层应用负载均衡层。这样的裨益是每种层次都足以依据流量来单独伸缩,而且 SSL
层显著能够跨七个使用共享,更节省花费。如若按那么些思路来再度调整我们面前的负荷均衡布局层次,将会演化成上边那样。

澳门美高梅手机网站 9

事实上,那时我认为使用前边的那层 Nginx
或许就显得多余了点,不是必备的。但即便实际这么形成下来很恐怕就会有那般一层冗余的东西存在很短一段时间,那正是地道和求实之间的差距啊。

4 在app目录下新建名为channel的文本,存放全体渠道

怎么着收获渠道新闻

在急需渠道等音讯时方可通过上边代码进行获取

String channel = WalleChannelReader.getChannel(this.getApplicationContext());

怎样生成渠道包

变迁渠道包的法子是和assemble${variantName}Channels指令结合,渠道包的生成目录默许存放在
build/outputs/apk/,也得以通过walle闭包中的apkOutputFolder参数来钦点输出目录

用法示例:

变更渠道包 ./gradlew clean assembleReleaseChannels
支持 productFlavors ./gradlew clean assembleMeituanReleaseChannels

  • 扭转渠道包,运行命令gradlew clean assembleReleaseChannels
  • 转变渠道包成功
可以看到,在channels目录下,生成了各个渠道包,同事在bakApk目录下,生成了用于打修复补丁的文件,要保存好。

越来越多API和指令可参看

更加多用法

源码下载
https://github.com/baojie0327/HotFixTinker

总结

好了,本文到此结束。作为一名后台开发自身其实对上面提及的各项开源软件怎么样布置、调优和管理并素不相识,那属于运转开发的难题域范畴。但这并不妨碍作者去理解作者所付出的使用所处的整个环境是什么样的,多领悟些你办事圈子范围边界外的
What 和
Why,有时也能援助大家更好的统一筹划和解决小编难题域内的难题,别为团结设置界限而最后画地为牢。

理所当然认为负载均衡那么些古老的课题已经济体面目一新了,在写本文时又看到音讯,在不久前办起的第八三届网络种类规划与达成USENIX 研讨会上,来自 谷歌(Google) 的工程师又享受了其自行研制的 Maglev
负载均衡器。刚下了随想还没看,回头看了再来写写。

澳门美高梅手机网站,参考

[1] HAProxy Documentation. HAProxy Management
Guide

[2] HAProxy Documentation. HAProxy Starter
Guide

[3] Willy Tarreau. Making applications scalable with Load
Balancing

[4] LVS wiki. Load
balancing

[5] Wikipedia. Virtual Router Redundancy
Protocol

[6] shuming. LVS
工作方式以及工作规律


写点文字,画点画儿,「转瞬之间之间」一切都变了。觉得不错,可长按或扫描二维码关切。
澳门美高梅手机网站 10

发表评论

电子邮件地址不会被公开。 必填项已用*标注