运维厨房创始人兼CEO覃健翔先生来访十二赞

作者:欧阳

2018年10月19日,运维厨房创始人兼CEO覃健翔先生来访十二赞,和十二赞CEO黄滚就技术问题做了深入探讨。覃健翔,曾任阿里巴巴搜索技术专家,香江集团电商总经理,2015年创立运维厨房。

十二赞,成立于2017年12月,由上市公司北京酷炫投资。创始人黄滚曾为阿里巴巴搜索技术专家,在阿里巴巴工作了七年。

两位同为前阿里巴巴的搜索领域专家,在一起交流后,又将会撞出什么样的火花呢?

运维厨房CEO覃健翔和十二赞CEO黄滚探讨技术

覃健翔,很多对于互联网行业不熟悉的人,也许没有听过这个名字;但相信很多人都知道苹果应用商店。而覃健祥先生就是立志要把运维厨房打造成:一款属于中国IT运维界的苹果应用商店!

而且目前已经和途牛、大华股份、浙江智啪、二维火等一线的运维界团队有了密切的合作。

而这位运维领域的开拓者,这次选择了十二赞作为技术交流对象,不但是看中了十二赞拥有独有的行业优势,更是看中了十二赞团队不断挑战自我,把一个个看似不可思议的目标,转为现实的精神!

2017年12月至2018年3月,十二赞打造了多款轰动业界的小程序,其中娱乐休闲小程序“寻找像素眼”被知名媒体爱范儿报导,不少玩家在网上写出多篇破解攻略。

从2018年4月开始,十二赞开始全力打造电商零售小程序。今年中秋前夕,十二赞深度合作伙伴一坐一忘丽江主题餐厅上线,月饼上线当日即出现供不应求的场面。

目前十二赞已有电商零售、餐饮点餐、美业丽人、酒店零售等多场景小程序SaaS工具,全力提高商家获客效率。

在获得一系列成功后,十二赞创始人黄滚先生没有满足现状,曾直言:“十二赞的存在,就是要让更多的客户得到最优质的服务。”

为了实现这个承诺,开始在市场上开放免费试用功能,让所有客户都能体验到最新技术成果的同时,获得了大量的客户好评。

凭借着这支年轻优秀的团队,十二赞团队可以最快速的了解到年轻市场的传播风向,以最契合的市场的角度,及时的调整小程序的功能,实现一直走在行业前端的目标。

在本次技术交流中,运维CEO覃健祥先生,也进一步肯定了十二赞团队以客户为先的公司文化。

在十二赞中,始终坚持着“客户第一、拥抱变化、团队协作、激情敬业、诚实守信”为最高准则。

我们需要机会,我们更懂得不断积蓄力量,把握一切机会,客户的要求就是我们需要承载的使命,以为最高的执行力助力达成。

小程序关注公众号组件安排上了!吸粉拉新走起!

最近微信小程序又放大招啦

宣布:小程序新增公众号关注组件

十二赞的程序猿们也按捺不住内心的兴奋了

立马夜以继日为大家开发出来了呢

“一码两用”,体验与留存并存

在以往的情况下,用户在小程序里是不支持识别二维码的。如果用户需要关注公众号,一般要跳转到小程序客服,在里面回复相应的关键词才能获取公众号二维码识别关注,路径多,用户流失严重。

现在这个问题得到解决了,用户扫码进入小程序后,直接在小程序里即可触发公众号关注按钮,一键关注公众号。实现“一码两用”,体验小程序的同时也能让这些用户留存下来了,提高了用户的留存率。

线下复购率将得到提升
      提升了用户留存率,也就意味着用户的复购率也将进一步得到提升。例如餐饮行业,虽然小程序扫码点餐的体验很美好,但真的是“用完即走”。

现在小程序支持关注公众号了,用户扫码点餐的同时也关注了公众号。商家随时可以以公众号消息的形式给顾客推送活动信息,将吸引这批用户再次消费,提升了线下复购率。

  配置流程  

第一步:公众号平台关联小程序
(1)登录【服务号】点击左侧快捷导航栏中的【小程序管理】

在点击【添加】点击【绑定小程序】即可

ps:设置的服务号需要与小程序主体一致。

如已绑定对应的【小程序】跳过此步,继续操作第二步

第二步:开启公众号关注组件

(1)登录【公众号小程序后台】点击【设置】选择【接口设置】 
点击【关注公众号组件】选择【对应的服务号】即可
Tips
配置好了的小程序店铺

只有用户扫描小程序菊花码进入

(直接进入是无法显示的呢)

方可查看到关注公众号小程序的组件。

Golang 在十二赞的深度应用

作者为黄滚,十二赞小程序开店平台创始人。2007年至2016年在阿里巴巴任职,曾担任中国雅虎平台技术主管、淘宝搜索研发专家。

我们是“十二赞”,一个致力于帮助电商卖家进入小程序的小团队,我们的主页是http://www.12zan.cn/。在实际运行中,我们使用了大量由golang写就的小工具,几乎每一个工具代码量都超短,一般在200行左右就完成了一个独立的功能,同时担当了相当重要的角色;像代理服务器,代码量一共500行多一点点,却是我们的核心支柱,压测时QPS也直追nginx,表现优异。

基于Docker的基础结构

做为基础架构,我介绍一下我们的机器架构。
我们的整个业务构建于阿里云之上,有5台server,每一对都有独立的外网IP,同时也在同一个内网之中。在每一台机器上都跑了一个我们自己用golang写的守护进程,这个进程负责监听一些业务重启、新增域名等类似的指令并执行(这些指令最后都传递给了docker)。同时,每台机器上都有一个consul进程,这些consul都join到了一起。另外,我们每一台机器上,都用docker跑了一个nginx来做80端口的服务,同时跑了一个用golang自己写的HTTP代理。nginx做做日志啊基础的功能之后就把请求丢给这个http代理 ,HTTP代理会到consul里去查应该将请求转发到哪个IP的哪个端口上。

400行Golang代码写的HTTP Proxy

在架构选型的第一天,我们就决定,我们会服务化,会大量使用http 接口来提供服务,并使用自己的http proxy来分发请求、添加自有的一些业务逻辑比如API的权限验证等逻辑。我们限定,所有业务,域名都是*.app.12zan.net,比如我们要上一个聊天服务,请求的接口就会是chat.app.12zan.net,哪天再上个评论服务,请求的接口就是comment.app.12zan.net。
确定域名后我第一件事情,就是拿golang自己写了一个非常简单的基于consul的http proxy server;感谢Golang这完善的HTTP库,我们只用了几百行代码就完成了所有功能。每当有http请求过来时,这个proxy server就会根据HTTP请求中HTTP_HOST 字段去consul去查,有哪些后端是用这个域名名称来注册服务的,并根据指定的算法,取出一台后端来,把这个HTTP请求Proxy过去。每个具体的业务,可能运行在我们5台机器中的任何一台之中的docker上,也可能是多个docker实例上。所以这里有一个机制,选择哪个实际的docker实例来服务这个请求的问题。我们现在支持随机选取、按客户端IP地址做hash之后选取、按URL做Hash选取、按负载选取几种方式。

WEB服务的服务注册

基于php+laralel和nodejs+koajs两种场景,我们制作了自己的docker镜像。这个镜像除开可以将php+nginx和nodejs构建的web服务运行起来之外,还包含一个golang写的consul客户端。在docker容器里,这个客户端随着php+nginx或是nodejs的web服务一起启动,启动之后会向宿主机的consul 进程注册自己这个服务,注册的时候会通知说,某某应用,在某某IP某某端口提供服务啦,如果前面有到**.app.12zan.net的请求你可以转发给我;同时会每隔一秒上报自己的进程数、当前机器CPU占用、内存占用情况。也是一样的简单,几百行golang代码,就鼓捣出了这个consul客户端。为什么使用golang呢?第一个原因当然是因为consul天生是golang阵营,第二个,是因为我们的docker容器种类较多,所以这个客户端直接就是在Mac上跨平台编译出来的在linux64平台上运行的,不管docker容器是python为基准的还是ruby为基准的,还是nodejs的,只要把这个二进制文件拷贝进去就能正确运行,不像别的语言需要解决依赖问题。

我们还开发了一个web console界面,在这里,我们可以注册app,也可以为app新增实例。注册app时,我们要指定代码仓库的地址(对了,我们的代码管理是用的golang写的gogs),指定对外服务的域名,指定是nodejs应用还是php+laravel应用。添加应用之后,可以在这个应用下新建实例,让系统在指定的IP上去跑这个实例。实例运行的过程实际就是下发一个通知到某个机器上,去执行一个docker实例启动的过程。docker启动的时候带了一些环境变量,比如当前内网IP、docker监听的端口、对外提供服务时是用何域名提供服务。

日志和存储

前面这种架构有一个问题,就是后端可能是在任何一台机器上运行的,今天可能是A,明天可能是B,那我要是把文件存在A上了是不是让B来提供服务的时候就挂掉了?所以我们想了这么一个办法(也是因为穷。。。。),我们把所有的文件都挪到阿里云的OSS服务上。同时为了不管是Nodejs应用还是php应用 还是python写的应用都能做到把用户上传的文件或是系统生成的文件存到oss上面,我们很省事地写了一个ossUploader,编译好的可执行文件发布,只需要执行它,传进来本地路径和oss上的目标路径,就保证给你上传到oss上去就完整,不需要再在nodejs、php、python、ruby、java各种平台下都琢磨一遍oss的SDK。

对日志的处理是一样的, 所有的日志文件的内容,都会被一个golang写的工具gtail监听着(就像linux 的tail -f命令一样),所有新产生的内容都会被gtail挪到oss上去存储。当然,也是可执行文件发布的。

这个实现之后, 我们的实际业务就真正可以在5台机器上之间任意腾挪了。

消息广播

得益于golang的一些开源仓库,我们还做了一些好玩的东西。
比如,看到https://github.com/gorilla/websocket这个东东,我们忍不住撸了一个websocket server,或是说叫群聊服务器更好一点。
接下来,我们看到有一个golang的库叫go-mysql-elasticsearch,伪装了一个mysql的slave,去MySQL的master机器上去读binlog,读到binlog以后就将MySQL里的数据发送给ElasticSearch去索引数据。
我们就结合了一个,把这两个结合起来,修改了一下go-mysql-elastichsearch,让它监听到MySQL的数据变更之后,在WebSocket server的某个群聊里推送出来,形成一个数据变更的广播。
再接下来我们就可以用nodejs写一个应用,连上这个websocket server,加入特定的某个群聊,就源源不断地收听到数据变更的消息。这个nodejs端的代码就非常简洁了,只需要不到100行代码可以做各种好玩的事情,比如监听到用户留言表有新增,可以发邮件让运营马上去审核。还有比如说,每当订单表有成交的时候,我们某个小小的nodejs应用因为监听了数据库消息,第一时间就知道了,马上就去追溯用户来源,来计算返利;同时这个nodejs的代码更新是和订单主逻辑完全不相关的,写这个业务的开发人员只需要知道订单表的结构,不需要了解订单应用后台代码。