小型公司DevOps落地实践案例详解
最近几年DevOps的概念越来越火,各个企业也逐渐意识到DevOps对项目研发效率的重要性,也有不少第三方企业提供整套流程成熟的解决方案。而我们侥幸,在这些第三方平台尚未崛起时,制定了一套适合自己的DevOps流程。
先说下背景,我们公司做的大概可以理解成SaaS服务,即从服务器硬件到系统环境到服务都归我们管。而且每家客户都有很多个性化的需求,在我接手重构前,我们平均半个月才能接入一家,经过我们几个月的改造,我们现在可以接入一家客户大概可以控制在1人天。之前,我们开发流程比较混乱,没有文档,没有各种开发流程,现在我们逐渐规范,形成稳定的流程和体系。
下面我们聊聊Java项目,我们把一个Git库中的2个项目(接口、后台管理)进行拆分:
2、后台服务 3、html5包 4、公共包服务
我们主要做了前后端分离,代码Git库分支化管理(事实上大部分小公司都可以这么拆分)。
使用Jenkins编译,包含我们Java项目、H5项目、安卓项目、iOS项目。
开发人员只需要本地调试后,提交代码到Git库的某个项目分支上,由Jenkins自动编译。如果编译错误会通过邮件反馈到影响代码的开发人员邮箱中,另外测试人员一键部署后,测试出问题,也可以通过Jira提单给开发人员。开发人员收到后,继续提交代码,不再像我们之前,必须通知开发人员,开发人员本地打包。
流程如下:

这里我们做了一点偷懒,我们版本号的维护也交给了Jenkins,通过脚本由Jenkins自动增加版本号。
然后我们做了一个自动化部署的小平台,主要功能如下:
2、对war包有效期,真实性校验 3、开发人员将公共SQL放入公共.sql里 4、各个客户定制化需求的SQL放入各个客户.sql里
项目经理升级时,自动提示未执行的SQL,点击执行即可。
客户端
接下来,我们聊客户端:

测试人员从Jira提单后,开发人员解决后,会看到具体解决的版本号,然后进入OSS存储,安装Android程序,或者IOS程序,一键部署Java项目。

运维组重构先看看之前的图:

因为各个时期部署的系统版本以及服务器型号等都不通,所以线上环境比较混乱。
我们采用Docker容器统一方案解决此问题,使得每个客户机器环境均相同。我知道在座的各位都是Docker大神,我就不多讲了。

我们用的是Portainer框架,简单二次开发了一点功能。
我们用了TLS认证,所以,管理者并不是通过Linux密码控制,而是通过配置平台,然后分配权限给各个项目经理所在的team中,然后,项目经理对team成员权限进行管理分配。
该方案优点:
- 在Docker下,所有客户生产环境相同。
- 易于备份、迁移、恢复。
- 可建高可用环境,发包时采用灰度发包,蓝绿部署不中断服务。
- 可支持弹性伸缩设计,支持扩展。
- 支持负载均衡,域名转发,意外切换容器等。
- 有利于转型微服务架构。
而建立Docker集群需要我们自动化完成,这里我采用了Ansible工具来实施,我们可通过指令分发,指令获取所有机器某个包的版本,执行不同的代码。

大数据篇 大数据一直以来是很多公司核心产品,对于小公司,如何低成本实施呢,我研究了一套强大的大数据框架Superset,并对其做了部分的二次开发。他能实现各种大数据图表展示,如下图:

我们采用了RESTful风格的API,也许很多人说RESTful不是很简单,10分钟上手,30分钟精通,事实上绝对比这要复杂的多。有很多的细节,很多的约束,经过几个月的协调开发后,都未必能避免出现不太和谐的接口。
之前,我们项目,各种接口文档都存在,主要有一下:
- Swagger
- 阿里的RAP
- Word文档
- 其它
对了,之前的接口是这样的:
- …/A项目/模块1/getProducts ----接口
- …/A项目/模块1/Products.html ----页面
- …/A项目/模块1/Products.js ----静态资源
留下了很多的坑,这里不对RESTful再做详细介绍,有兴趣,大家可以自己了解下。我们统一了一个接口文档为postman,可能很多朋友会说postman怎么能作为接口文档,我只想说,他适合小公司,不仅有入参、出参示例(可以多个例子),还能在tests里写接口说明,也方便前端调试,调用服务器使用。
A:因为Portainer是直接通过docker api执行的,并没有在服务器上装有什么客户端(也就是无侵入,这也是我们选用他的原因),我们只是在Docker里面配置了个http的TLS证书,加上我们对它做了一些改造,所以我们使用了Portainer应用生产环境。
Q:请问下测试的时候接口模拟您这边是如何处理的?
Q:请问Docker里跑Java应用性能怎么调优,默认是共享资源池,对Java来说CPU切换很费性能,除了绑定CPU,但这样就没有弹性之说,麻烦说下?
Q:如何实现分布式事务?如何保证数据一致性?
Q:贵司的业务模式跟我们很像,感觉很受用。想问下,多客户、多版本共存的情况下,版本升级这块儿是怎么做的?
Q:日志如何存储和分析?用什么工具?系统异常如何监控?
关于日志收集,目前我们并没有很多公司搞的很高大尚,因为这块,还在改造中。我们就是多容器映射了本地磁盘目录,然后对这些目录日志文件进行合并,对那种error级别的日志,筛选出来。
原创:邵磊