測試私有方法 重構_一個全棧工程師重構之路:中小公司 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.pswp.cn/news/542811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542811.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python變量 數據類型 列表 元組 字典

python基礎語法2變量數據類型與類型轉換列表添加列表元素修改元素刪除列表元素組織列表創建數值列表操作列表元組元組轉列表字典創建字典列表取值字典刪除增加修改變量 變量命名要求: 1.只能是一個詞 2.只能包含字母、數字、下劃線 3.不能用數字開頭 變量定義位置不…

HDU 5777 domino

貪心一下。有k次機會&#xff0c;也就是那些數字中&#xff0c;最大的k-1可以不選擇。答案為&#xff1a;sum{a[i]}-sum{最大的k-1個a[i]}n。注意&#xff1a;k>n的時候直接輸出n。 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio&…

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. 嗨&#xff0c;大家好&#xff01; 今天&#xff0c;讓我們看看使用Node.js第2部分的puppeteer API的另一個強大功能。 In the first part of this sectio…

好用的平板電腦_小熊分享|這五款平板電腦的性價比絕了!

【葉紫網】獨樂樂不如眾樂樂&#xff0c;點擊上方頭像并添加關注&#xff0c;與葉紫科技小熊一起探索科技的奧秘。要說當代年輕人的消費觀&#xff0c;我們也是說要該花花&#xff0c;該省省&#xff0c;像現在的科技產品更新換代的速度&#xff0c;就算我們的荷包相當的鼓&…

python if語句 for語句 while語句

python基礎語法3if語句for循環while循環else語句退出循環if語句 執行條件判斷&#xff0c;符合執行if內語句&#xff0c;否則執行elif或者else。 if、elif、else都要接冒號&#xff0c;注意縮進 各級條件互斥 后面的條件可以接列表&#xff0c;表示或關系 contribution860 if…

交際過程的兩個基本環節_跨文化交際學概論筆記(二)

第二部分 基本概念&#xff1a;文化與交際第一章 文化的定義與特征一、文化的定義1. 文化的定義為何重要首先&#xff0c;在跨文化交際學中文化是一個至關重要的問題。研究時&#xff0c;不可避免進行文化對比。其次&#xff0c;在研究任何學科前&#xff0c;術語的界定是前提。…

Python中列表的del,remove和pop函數之間的區別

1)Python del函數 (1) Python del function) del is nothing but "delete". del is a keyword which basically goes on the position given by the user in del(position) and deletes that element and also changes the positions of all the other elements as i…

lcd圖片轉二進制工具_遼寧2.8寸LCD屏價格,測距儀LCD顯示屏_思邁微

首頁 > 新聞中心發布時間&#xff1a;2020-11-15 08:27:09 導讀&#xff1a;思邁微為您提供遼寧寸LCD屏價格,測距儀LCD顯示屏的相關知識與詳情&#xff1a; 以上便是對LED點陣式顯示屏的軟硬件系統、組成等的技術知識的粗略的介紹。以這款名為《液晶顯示器亮點壞點修復工具》…

python 布爾值 布爾運算 運算符

python基礎語法4布爾值布爾運算運算符算術運算符賦值運算符比較運算符邏輯運算符布爾值 布爾值&#xff1a;Ture&#xff08;真&#xff09; Flase&#xff08;假&#xff09; 假&#xff1a;Flase、0、’’&#xff08;空字符串&#xff09;、[]&#xff08;空列表&#xff0…

python代碼安全性問題_這個python代碼對注入安全嗎?

我在Python中有一個服務器/客戶機套接字對。服務器接收特定的命令&#xff0c;然后準備響應并將其發送到客戶端。在在這個問題中&#xff0c;我關心的只是代碼中的可能的注入&#xff1a;如果可以要求服務器對第二個參數做一些奇怪的事情——如果對命令內容的控制不足以避免不希…

Python | 使用+ =運算符在字符串末尾附加文本

Given a string, and we have to append more string (text) at the end of the string using operator in Python. 給定一個字符串&#xff0c;我們必須在Python中使用 運算符在字符串的末尾附加更多字符串(文本)。 There are two methods to add string (text) at the end …

ps如何修改圖片大小尺寸_PS新手入門教程:學習如何修改畫布的大小

PS新手入門教程&#xff1a;學習如何修改畫布的大小。在photoshop中&#xff0c;可以把畫布理解為一張白紙&#xff0c;而我們要處理的圖像可以理解為這張白紙表面上的畫。我們修改畫布的大小時&#xff0c;圖像并不會隨著畫布的大小而整體變大或縮小&#xff0c;這是修改畫布大…

jfinal poi

2019獨角獸企業重金招聘Python工程師標準>>> 最近項目采用jfinal的項目要對一些excel進行操作&#xff0c;經過考慮采用jfinalpoi,在一些學習&#xff0c;使用后總結并分享一些代碼片段。 導入excel protected Workbook workbook null;protected File filenull;publ…

python 函數 類 模塊

python基礎語法5函數作用域函數參數函數對象無名函數回調函數函數嵌套類類的創建類的調用初始化方法類的繼承類的定制模塊使用模塊函數 封裝好&#xff0c;進行某種功能 del 函數名(參數)&#xff1a;函數體return 返回值&#xff08;可以沒有return語句&#xff09;作用域 …

activemq nodejs stomp 重連機制_5分鐘優劣分析 Kafka、RabbitMQ、RocketMQ、ActiveMQ消息隊列...

一、資料文檔Kafka&#xff1a;中&#xff0c;有kafka作者自己寫的書&#xff0c;網上資料也有一些。 rabbitmq&#xff1a;有一些不錯的書&#xff0c;網上資料多。 zeromq&#xff1a;少。沒有專門寫zeromq的書&#xff0c;網上的資料多是一些代碼的實現和簡單介紹。 rocketm…

excel保存快捷鍵_干貨 | 快速提高工作效率的電腦快捷鍵!

點擊標題下「藍色微信名」可快速關注隨著科學技術的發展&#xff0c;電腦已經成為每個人生活和工作的必備工具。然而&#xff0c;很多人在使用電腦的過程中非常依賴鼠標&#xff0c;導致雙手需要頻繁離開鍵盤&#xff0c;造成工作間歇中斷&#xff0c;導致用電腦處理工作的效率…

16位的數字高字節和低字節_掩蓋8位數字的較低和較高半字節| 8085微處理器

16位的數字高字節和低字節Problem statement: 問題陳述&#xff1a; To mask lower and higher nibble of 8-bit number using 8085 Microprocessor. 使用8085微處理器掩蓋8位數字的較低和較高半字節。 Algorithm: 算法&#xff1a; Load the content of accumulator A with…

釘釘 ISV 應用開發的一些心得

1. 背景 前段時間從前到后完整地做完了一個簡單的釘釘上的 ISV 應用 —— 猿活動。 最開始想做這么一個小工具&#xff0c;是想到&#xff0c;平時部門中經常會組織一些分享活動&#xff0c;但是這些分享活動卻沒有一個比較直觀的“站點”來記錄一次又一次的&#xff0c;很多人…

mcq 隊列_MCQ | 8086微處理器中的字符串操作指令

mcq 隊列Question 1: 問題1&#xff1a; A string is a collection of characters. Each Character is an of byte length which is stored at successive locations. In the 8086 microprocessor, which characters are considered in the string? 字符串是字符的集合。 每…

python 編碼 解碼 讀寫文件

python基礎語法6編碼解碼encode編碼與decode解碼讀寫文件編碼解碼 計算機是以二進制&#xff08;0或1&#xff09;存儲的&#xff0c;以字節為單位&#xff0c;1byte8bit&#xff0c;1KB1024B&#xff1b;1MB1024KB&#xff1b;1GB1024MB 編碼表&#xff1a;ASCII碼&#xff0…