人過35,被年輕人卷走了一大半,還停留在這個行業的,不是在創業,就是在創業的路上。
創業很難,剛開始沒錢沒人,啥都要自己幹,一個字累。好處是地基是自己搭的,心裡有底。不過部落客最近健忘的毛病愈發嚴重了,趁還清醒紀錄點滴。
部落客做的是物聯網項目,目前涉及到的通信協定有<code>lora</code>、<code>4G/Cat1</code>、<code>BLE</code>,傳輸協定有<code>MQTT</code>、<code>HTTP</code>、<code>TCP私有協定</code>。大緻草圖如下:

一般來說,MQTT能滿足大部分業務需求,但在某些場景比如檔案下發/自定義分包拼包時處理起來比較複雜,這時使用HTTP更合适,但對于裝置并不友好(MQTT與HTTP誰最适合物聯網?),是以有時自定義協定也不可避免。另外如果覺得MQTT實作或對接起來太麻煩,很多特性又用不到,那其它協定或自定義協定是更好的選擇。
MQTT雖然通用,但不是萬能的,不是非它不可的,說到底,它也隻是一套誕生于具體場景,為了解決某些問題,一步步發展起來的協定罷了。
MQTT是長連接配接。
然後買伺服器,走阿裡雲,買多少呢?主要是ECS,有以下幾點要求:
前台、背景、PaaS網關分開部署;
還有各類中間件,前期就把它們一塊放一台機子上得了;
一個私有docker鏡像倉庫用于CI/CD,與業務無關,獨立部署,帶寬也獨立(上行為主,幾乎不下行,是以開個最小1M帶寬即可)。
這麼看來至少5台ECS,網絡架構如下:
麻雀雖小,五髒俱全。橫向和縱向都有較好劃分,界限清晰,友善以後擴充。
考慮到便于運維/CI/CD/微服務/日後引入K8S,所有服務都以docker容器形式部署。
為了省錢&安全計,隻給必要的兩台ECS開了公網(EIP),除docker鏡像倉庫外,挂載nginx的那台也要開通公網對外提供服務,對内轉發請求。需要注意的是,ECS若沒有公網IP,則自身也無法通路外網(記得以前可不是這樣的)。那如果内網ECS要調用外部第三方接口怎麼辦呢?同樣可經由nginx轉發。在此場景下,nginx兼具反向和正向代理的職責。
内網ECS擷取公網docker鏡像也存在無法拉取的問題,可以在私有倉庫的那台機子上先拉取下來,然後打個tag,再push到本地倉庫,如此其它ECS就能在私有倉庫裡pull到該鏡像了。示例如下:
阿裡雲ecs.s6-c1m2.xlarge 4M帶寬(固定)比ecs.t5-lc1m4.large (無性能限制執行個體) 5M帶寬 (固定)下行速率更快更穩定,後者卡的一筆,經常斷連(可能受其它共享主機影響?),直接更新到15M後可正常使用。
反向代理,除了nginx,我們還使用了<code>HAProxy</code>。前者處理http轉發(L7),後者處理tcp轉發(L4)。雖然nginx從1.9.0版本開始,新增了ngx_stream_core_module子產品,使nginx支援四層負載均衡。然而其預設編譯的時候該子產品并未編譯進去,需要編譯的時候添加--with-stream,使其支援stream代理。目前官方也沒有提供預設有該功能的docker鏡像,需要自己打包,稍顯麻煩。
自動釋出是CI/CD的基礎。本人使用的是<code>gitlab-ci</code>,相比<code>jenkins</code>,gitlab-ci資料并不多,不過其官方文檔已經挺全面了,遇到問題基本上也有前人踩過坑,可參看部落客以前寫的一篇随筆GitLab-CI/CD入門實操。
以後端應用為例,流程大緻如下:
有幾點圖中未表明:
代碼送出/merge到不同分支,将觸發各自分支的釋出流程。比如dev分支将釋出到内網測試環境,master分支将釋出到線上生産環境。
對于前面說的生産伺服器沒有公網位址的情況,公司内網的<code>gitlab-runner</code>無法直接登入,就需要擁有公網位址的伺服器作為跳闆機登入。
如果在釋出流程中加入代碼規範check、code review、通知機制、及手動幹預功能(如提供管理界面,測試人員點選測試通過或不通過按鈕控制流程走向)等,那CI/CD就初具雛形了。
順便再說說代碼分支。一直都存在的有master和dev分支。master對應線上生産版本代碼,dev對應本地開發版本代碼。生産部署都走master分支,當線上有bug或緊急需求時,從master分支切一個<code>hotfix</code>分支出來,開發測試完畢之後并回master并删除該hotfix分支。而産品疊代需要處理的bug和需求,從dev切分支,一次疊代一般起一個<code>feature</code>分支,開發測試完畢後并回dev分支(或并回後做測試,視情況而定),然後dev再merge到master,上線。流程大緻如下:
注意hotfix和feature分支可能同時會有多個,完成之後即删除。
為什麼用MQTT而不用TCP長連接配接透傳
網際網路推送服務原理:長連接配接+心跳機制(MQTT協定)
LoRaWAN介紹 - LoRa從業者讀這篇就夠了
基于GitLab的工作流程設計