测试私有方法 重构_一个全栈工程师重构之路:中小公司 DevOps 落地实践

fb5d100d1ff2ab6ccd601efa0f74da7f.gif

6d4ad7f14c40ee6dde527842e9456295.png

为了这篇文章,我前后写了将近十篇文章铺垫,才将这篇整体重构思想引出。

背景

先说下背景,我们是一家小公司,虽然打着做产品的旗帜,但是每个客户都有大量的个性化功能,这里指各个客户的java端、Android端、ios端(大部分功能代码是相同的,个性化功能代码不同)。我之前是做 Android的,实践证明,特殊情况下,只有我们Android组可以随意切换到任意一家客户,任意一版本的代码。并且修复一处公共bug,所有客户的版本都会更新。我也一直在介绍这种开发模式,但并得不到支持,直到年初,我晋升为移动端组长,加上,后来java组组长跳槽,我才有机会全面实施重构计划。

前言

因为我做过很多年的运维(网吧软硬件运维等),对服务器硬件以及软件有较高的认识,加之我对各门语言有一定的开发经验,算是一位全栈工程师,对各端都比较熟悉。这一切,为我的实施带来了很大的帮助。本人申明以下所有重构思路均出自本人想法,实施上,由我统一安排培训后落实。(虽然落实阻力极大,但最终效果不错)

先说说效果

之前,我们每接入一个客户项目,完成java端、Android端、ios端和部署服务器环境等,需要2周的时间。现在,我们大概需要30分钟。并且每位客户个性化需求再多,我们也能灵活开发及切换到各个客户的代码上。之前,我们开发流程极为混乱,没有文档,没有各种开发流程,现在我们逐渐规范,至少节约50%的开发成本。当然,我们还在不断改善中。

Java 项目组

我们的java项目,原来分为接口服务、后台管理服务,但是都在一个git库里,我将它分为:

  1. 接口服务

  2. 后台服务

  3. html5包

  4. 公共包服务

因为本次重构,我逐步采用前后端分离方案,所以多出了h5包。

bc26ec6b2355e7bcbc6bedabcfa47ad5.png

每个库分为多个分支,其中定义master为主分支,各个客户为新开的一个分支,通过分支来解决各个客户各种不同需求,(因为客户需求实在过细,有些文字都得改,单纯的插件化开发的话,每个插件都要n多个版本,这样对于我们小公司,做不起来),当然各个客户也应该有个开发分支,但受限于我们人员较少,一期省去了开发分支,把本地暂存区作为开发分支。

开发流程如下:27b4eaca489497c324f38959fa00ad13.png

开发人员只需要本地调试后,提交代码到git库的某个项目分支上,由Jenkins自动编译。

如果编译错误会通过邮件反馈到影响代码的开发人员邮箱中,另外测试人员一键部署后,测试出问题,也可以通过jira提单给开发人员。开发人员收到后,继续提交代码,不再像我们之前,必须通知开发人员,开发人员本地打包,这样无法跟踪项目代码。

补充:

因为我们项目比较多,人为维护版本号会费时费力,我决定一期采用Jenkins自动填入版本号到项目中,并在文件名中体现,所以,项目编译出的包可能是1.war、2.war、3.war,我们内部将其(1、2、3)作为版本号,当然war包内部我也写入了版本号。其次,我们剔除了大量含状态的代码,使得每个war在测试环境和生产环境自动加载不同配置来运行,因为无状态,所以war包、h5包在测试环境和生产环境都是一套代码。这里我们花了几周时间完成抽取无状态代码。

一键部署:
我们做了一套管理平台,可升级tomcat中间件下的各个war和h5。可以看看我们现在的效果:

e3d613e46b2222d1a4458889012114a9.png

主要功能如下:

  1. 升级、显示当前版本

  2. 对war包有效期,真实性校验

  3. 开发人员将公共sql放入公共.sql里

  4. 各个客户定制化需求的sql放入各个客户.sql里

每次只需要点后面的升级按钮,即可升级sql脚本或服务。
文章是之前写的,逻辑上有些变化,这里不做介绍。

客户端组

客户端开发流程,这里ios和Android一起说,我们提交代码后,Jenkins都会同时生产两套连接服务器地址不同的ipa、apk,这里因为很多情况在不同网络环境下需要看测试环境和生产环境,所以,我采用同时发2套包方案。

dc1771fad9cf5e9306d3ab9ad2ef1b35.png

Android的同时2套包方案可参照我之前Android利用gradle同时编译多包(测试环境地址、生产环境地址)IOS同时发2套ipa包方案可参照我之前的IOS利用Xcode同时编译多包(测试环境地址、生产环境地址)在ios上架appstore流程上,我采用了半自动化发包策略,将其上传到开发者平台后,手动上架。各个客户,各个版本我们采用多分支的方案,和上文java同理,不同分支处理不同客户项目。

测试组

测试组流程

20cad222fb039e85613641b5e34e1789.png

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

而因为安卓和ios均是同时发2个包,java项目、h5项目无状态,所以生产环境和测试环境都可快速部署测试。

图中,以real文件名结尾的是连接生产环境地址。

项目经理

项目经理流程

b3aefd5278b5ecd503426876037b5313.png

我采用新客户新流程,老客户老流程,并逐步迁移到新流程中。其中执行数据库脚本已经被省略,由统一部署平台执行。

运维组

bf401c981c8de304da666f5095e9e2a6.png

这张图是以前的逻辑,因为每个时期,每个客户给的服务器和服务器系统各不相同,运维起来极为复杂。我采用docker容器统一方案解决此问题,使得每个客户机器环境均相同。

下图我是我解决后的模型图:

f1cbb18b113087ba882e7b169d962e39.png

我们把各个客户的服务器都整成docker集群,然后通过我们公司统一管理平台管理,然后将各个容器分配给不同的角色,这里我们是用Portainer来解决,并二次开发了一些需求。

这里的管理都不需要linux机器的密码,通过tls证书进行控制,而Windows机器将废弃不用。

该方案优点:

  1. 在docker下,所有客户生产环境相同

  2. 易于备份、迁移、恢复

  3. 可建高可用环境,发包时采用灰度发包,蓝绿部署不中断服务

  4. 可支持弹性伸缩设计,支持扩展

  5. 支持负载均衡,域名转发,意外切换容器等

  6. 有利于转型微服务架构

  7. 快速搭建环境

而建立docker集群需要我们自动化完成,这里我采用了Ansible工具来实施,我们可通过指令分发,指令获取所有机器某个包的版本,执行不同的代码。

然后通过image镜像对客户进行统一部署容器,这里我们建立了私服。

私服篇

这里我建立了各种仓库,方便java开发,我建立了一个私有仓库,一个maven官方代理仓库,一个阿里云代理仓库;

docker上我为了方便开发打包其他环境,我创建了docker私有仓库;还有一些为了解决统一管理linux服务器而创建npm仓库;

以及安卓所要使用的gradle私有仓库,未来,我可能还会创建更多仓库,能支持的仓库列表都在下面:

ba4d566bddcfaae6ef229be34659de8a.png

大数据篇

大数据一直以来是很多公司核心产品,对于小公司,如何低成本实施呢,我研究了一套强大的大数据框架,并对其做了部分的二次开发。

接口篇

我全面统一采用restful风格api开发接口,接口文档自动生成,这里涉及几篇文章,暂时还没来得及写,后续补上。

文化篇

之前,我们开发需求完全依靠项目经理分配,现在我安排不断重构项目,带来了很多新的流程,这里征得领导同意,安排每周或每2周分别对各部门,培训后分配账号,实施。这个涉及公司内部业务,不便详说,敬请谅解。

后续

我写了几个月各方面的文章,大部分读者可能以为我是胡写一通。今天,终于把他们汇聚到一起,说实话,心情还是蛮激动的。

我承认我所有的重构对于很多大公司都是提不上台面的,但对于我们小公司,很多东西形成体系,说实话,真的很难。还有些内容,我不方便说,或者是忘记了说。事实上,我们做的远比文章里的内容要多得多。

还有,部分文章可能是几个月前写的,逻辑上和流程上,我们都已经做了很多优化和调整,但是主体思想都没有变,不影响阅读。

其次,我申明,本文中所有介绍,绝对不是最好的解决方案,很多方案是我对公司进行分析后定下的,绝不是每个小公司都适合。但我觉得本文一定能给你带来不少的灵感。

最后,本人能力有限,开发圈子也比较小,难免有考虑不周的地方,如果您有任何高见,欢迎告知,小生在此谢过大家。

作者:邵磊
链接:https://juejin.im/post/59e1d92d51882578db27c2e1

互联网、金融、通信 DevOps 转型落地经验,就在 GOPS 2020 · 深圳站2aa354525f9dffcfcded6583c54e752f.png

重磅!2020 年 DevOps 持续交付标准和技术运营标准评估报名正式启动!

远程办公条件下,DevOps 如何加快研发交付

持续交付体系在高德的实践历程

“DevOps时代”公众号诚邀广大技术人员投稿。投稿邮箱:jiachen@greatops.net 或 添加联系人微信:135 2116 9787(同微信)。点击,立即报名 GOPS 2020 · 深圳站444c1e1391df42ad0f36676d44348853.png你点的每个赞,我都认真当成了喜欢

“DevOps时代”公众号诚邀广大技术人员投稿。

投稿邮箱:jiachen@greatops.net 或 添加联系人微信:135 2116 9787(同微信)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

puppeteer执行js_使用Node.js和Puppeteer与表单和网页进行交互– 2

puppeteer执行jsHi guys! Today lets look at another powerful function of the puppeteer API using Node.js part 2. 嗨,大家好! 今天,让我们看看使用Node.js第2部分的puppeteer API的另一个强大功能。 In the first part of this sectio…

好用的平板电脑_小熊分享|这五款平板电脑的性价比绝了!

【叶紫网】独乐乐不如众乐乐,点击上方头像并添加关注,与叶紫科技小熊一起探索科技的奥秘。要说当代年轻人的消费观,我们也是说要该花花,该省省,像现在的科技产品更新换代的速度,就算我们的荷包相当的鼓&…

交际过程的两个基本环节_跨文化交际学概论笔记(二)

第二部分 基本概念:文化与交际第一章 文化的定义与特征一、文化的定义1. 文化的定义为何重要首先,在跨文化交际学中文化是一个至关重要的问题。研究时,不可避免进行文化对比。其次,在研究任何学科前,术语的界定是前提。…

lcd图片转二进制工具_辽宁2.8寸LCD屏价格,测距仪LCD显示屏_思迈微

首页 > 新闻中心发布时间:2020-11-15 08:27:09 导读:思迈微为您提供辽宁寸LCD屏价格,测距仪LCD显示屏的相关知识与详情: 以上便是对LED点阵式显示屏的软硬件系统、组成等的技术知识的粗略的介绍。以这款名为《液晶显示器亮点坏点修复工具》…

ps如何修改图片大小尺寸_PS新手入门教程:学习如何修改画布的大小

PS新手入门教程:学习如何修改画布的大小。在photoshop中,可以把画布理解为一张白纸,而我们要处理的图像可以理解为这张白纸表面上的画。我们修改画布的大小时,图像并不会随着画布的大小而整体变大或缩小,这是修改画布大…

jfinal poi

2019独角兽企业重金招聘Python工程师标准>>> 最近项目采用jfinal的项目要对一些excel进行操作,经过考虑采用jfinalpoi,在一些学习,使用后总结并分享一些代码片段。 导入excel protected Workbook workbook null;protected File filenull;publ…

python 函数 类 模块

python基础语法5函数作用域函数参数函数对象无名函数回调函数函数嵌套类类的创建类的调用初始化方法类的继承类的定制模块使用模块函数 封装好,进行某种功能 del 函数名(参数):函数体return 返回值(可以没有return语句)作用域 …

activemq nodejs stomp 重连机制_5分钟优劣分析 Kafka、RabbitMQ、RocketMQ、ActiveMQ消息队列...

一、资料文档Kafka:中,有kafka作者自己写的书,网上资料也有一些。 rabbitmq:有一些不错的书,网上资料多。 zeromq:少。没有专门写zeromq的书,网上的资料多是一些代码的实现和简单介绍。 rocketm…

excel保存快捷键_干货 | 快速提高工作效率的电脑快捷键!

点击标题下「蓝色微信名」可快速关注随着科学技术的发展,电脑已经成为每个人生活和工作的必备工具。然而,很多人在使用电脑的过程中非常依赖鼠标,导致双手需要频繁离开键盘,造成工作间歇中断,导致用电脑处理工作的效率…

钉钉 ISV 应用开发的一些心得

1. 背景 前段时间从前到后完整地做完了一个简单的钉钉上的 ISV 应用 —— 猿活动。 最开始想做这么一个小工具,是想到,平时部门中经常会组织一些分享活动,但是这些分享活动却没有一个比较直观的“站点”来记录一次又一次的,很多人…

python 编码 解码 读写文件

python基础语法6编码解码encode编码与decode解码读写文件编码解码 计算机是以二进制(0或1)存储的,以字节为单位,1byte8bit,1KB1024B;1MB1024KB;1GB1024MB 编码表:ASCII码&#xff0…

电脑如何设置不休眠_电脑休眠了却没法唤醒?设置一下就好!

关注全新【HP惠课厅】,惠普消费新品全知晓逐步复工,办公室环境又渐渐熟悉了起来午休外出吃饭、忙里偷闲散步、下班不想关电脑……随手就把电脑休眠了开机也快,网页和工作内容也不会被关掉休眠功能是挺好用的可有时候,无论怎么点开…

node+bower+gulp+webpack初见

2019独角兽企业重金招聘Python工程师标准>>> node node模块管理是通过NPM(即 Node Package Manage,是 NodeJS 模块管理工具)来处理各模块之间的依赖。NPM按树状结构来管理的,支持某模块的不同版本。 [前提是本机已安装…

hbuilder php mysql_xampp本地服务器+HBuilder配置php环境

HBuilder配置PHP环境:下载,运行HBuilder编辑器打开右侧小窗口,点击设置图标—>设置web服务器—>外置web服务器输入你想要浏览器运行的URL,点击两个确定,再重新点击设置web服务器,选择PHP类文件(选择之…

百度地图手机和电脑不一致_你可能不知道的电脑手机冷知识

各位好久不见呀,自科部科科又回来了!平时我们经常使用电脑,你可能以为你对电脑和手机了如指掌,然而下面的冷知识你知道多少个?01一台电脑可以有多个桌面如果你熟练的使用多个桌面这个技巧那么就可以躲着家长领导偷懒了…

RHEL 7 中 systemctl 的用法(替代service 和 chkconfig)

2019独角兽企业重金招聘Python工程师标准>>> 1、systemctl是RHEL 7 的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。可以使用它永久性或只在当前会话中启用/禁用服务。 systemctl可以列出正在运行的服务状态,如图&am…

js 刷新div_vue.js备忘记录(五) vue-router

如果我们采用SPA(单网页应用)的设计方式,服务器会把前端文件一次性发过来,前端通过监听url的改变,选择展示那些内容,也就是前端路由一. 如何改变url但是页面不刷新?方式一: 改变哈希值hash比如,我们随便找一个网页我们在浏览器控制台输入发现网站的url有了些改变查看network却…

css div撑满窗口高度_如何使用CSS将div的高度设置为窗口的100%?

css div撑满窗口高度Introduction: 介绍: Hello there developers! Well, certainly if you are reading this article then that means that you have run into some trouble while creating your web page or website and if you are a beginner in this field, …

.net core image怎么保存_轻量级Vue图片上传插件——Vue-core-image-Upload

介绍vue-core-image-upload 是一款轻量级的 Vue.js 上传插件,它可以支持的图片的上传,裁剪,压缩。它同样也支持在移动端的图片处理,它定义了诸多上传周期,你可以自由的进行流程控制。Githubhttps://github.com/Vanthin…

mysql确认半同步命令_怎么判断mysql是否是半同步复制

AFTER_COMMIT(5.6默认值)master将每个事务写入binlog ,传递到slave 刷新到磁盘(relay log),同时主库提交事务。master等待slave 反馈收到relay log,只有收到ACK后master才将commit OK结果反馈给客户端。AFTER_SYNC(5.7默认值,但5.6中无此模式…