2018年愛(ài)飛狗第一個(gè)版本上線(xiàn),運(yùn)營(yíng)到2019年中關(guān)閉宽档。爬蟲(chóng)以及數(shù)據(jù)一直沒(méi)有中斷,只是不想去做產(chǎn)品維護(hù)了而已庵朝。2020年底雌贱,自己重新將這個(gè)產(chǎn)品定位為自己的一個(gè)技術(shù)實(shí)踐的產(chǎn)物,作為一個(gè)試驗(yàn)田偿短,實(shí)驗(yàn)新的想法、新的工具馋没。好在云廠商大量的推出廉價(jià)的服務(wù)器資源昔逗,我購(gòu)買(mǎi)了2臺(tái)4核8G內(nèi)存的云服務(wù)器,使得愛(ài)飛狗重新起航有了新的基礎(chǔ)篷朵。
小程序升級(jí)
2018年寫(xiě)的小程序用的是微信當(dāng)年剛出來(lái)小程序不久寫(xiě)的勾怒,用的是原生的小程序的框架加上有贊的ZanUI(當(dāng)年的稱(chēng)呼)婆排。那是一套CSS框架,當(dāng)時(shí)也沒(méi)有小程序組件的機(jī)制笔链。多方對(duì)比段只,這在當(dāng)年也算是一個(gè)比較成熟的框架了。
到2020年底鉴扫,小程序開(kāi)發(fā)也非常的方便了赞枕,出現(xiàn)了很多的多端UI框架,包括Taro-UI坪创、騰訊的kbone等炕婶。為了跨平臺(tái)和H5兼容,這些框架基本上都使用和前端開(kāi)發(fā)一樣的工具莱预,例如使用typescript柠掂、react、mobx等框架依沮,使用npm build等生成小程序相關(guān)的代碼涯贞。從Demo等來(lái)看,一切看起來(lái)都很美好危喉。
Taro-UI看起來(lái)算是成熟度比較高的框架宋渔,所以嘗試將代碼進(jìn)行遷移。在2020年底姥饰,Taro-UI有新出不久的3.0版本傻谁,老版本也已經(jīng)進(jìn)入了維護(hù)狀態(tài)幽邓。但嘗試了一番以后發(fā)現(xiàn)了以下一些問(wèn)題:
- build較為緩慢痕檬,微信小程序無(wú)法根據(jù)build后的生成的小程序源代碼重新刷新界面秕脓,只能自己手動(dòng)刷新襟士,顯得很笨拙凑耻。其實(shí)這種問(wèn)題在其他以npm build為構(gòu)建工具的地方也存在澄港。
- 對(duì)react相關(guān)工具的template支持不好骡苞,配置上比較麻煩辽社。比如用了react+redux以后想換成mobx就比較麻煩费什。
- 對(duì)于非Taro-UI之外的原生微信插件支持的不是很好钾恢,比如需要用到的Echarts,在Taro-UI上調(diào)試一直無(wú)法正常工作鸳址,只能在真機(jī)上實(shí)驗(yàn)瘩蚪。但是Echarts原生組件工作良好。
- npm install的第三方庫(kù)不總是能夠用稿黍,原生程序里面用的好好的東西疹瘦,到這里就會(huì)遇到一些奇怪的問(wèn)題,而且不是太好解決巡球。
- 文檔和相應(yīng)的版本不對(duì)應(yīng)言沐,有些解決方案針對(duì)的是老的版本邓嘹,在新的版本上不工作
在折騰了一段時(shí)間以后,慢慢的挫折感(莫非是自己太笨险胰。汹押。),還是放棄了Taro-UI起便。還原使用騰訊原生的小程序框架棚贾,重新整理了一下代碼,刪除了大量無(wú)用的代碼缨睡。CSS框架重新使用了有贊的Vant Weapp UI組件庫(kù)替換之前的CSS框架鸟悴。替換過(guò)程較為順利,節(jié)約了大量的時(shí)間奖年。
總結(jié)起來(lái)细诸,對(duì)于前端來(lái)講,精力有限陋守、業(yè)務(wù)不復(fù)雜的情況下震贵,還是選擇用騰訊自己原生的一套方案來(lái)得快,兼容性最好水评。
k8s服務(wù)器遷移
在k8s還不是那么容易安裝的前幾年猩系,愛(ài)飛狗的后端以及爬蟲(chóng)都是使用rancher來(lái)運(yùn)行容器的。后來(lái)有了k3s后中燥,發(fā)現(xiàn)在低配置的服務(wù)器上(1核2G)的機(jī)器上寇甸,也能順暢的使用k8s。k3s在長(zhǎng)期的運(yùn)維中也比較穩(wěn)定疗涉,偶爾會(huì)出現(xiàn)集群崩潰的情況拿霉,只需要重啟一下就好了。
為了學(xué)一下新的東西咱扣,我將k3s切換成了microk8s绽淘。然后安裝microk8s就遇到了滿(mǎn)滿(mǎn)的坑:
- 國(guó)內(nèi)服務(wù)器上安裝的話(huà),由于它會(huì)安裝google上面的鏡像闹伪,但是國(guó)內(nèi)服務(wù)器永遠(yuǎn)拉不下來(lái)沪铭。解決方案有。
- 手動(dòng)的將鏡像從其他地方下載并且推送到私有repo偏瓤,但這種方案比較麻煩杀怠。
- 使用代理服務(wù)器。這里需要一個(gè)能夠訪(fǎng)問(wèn)國(guó)外的代理服務(wù)器厅克,然后將代理服務(wù)器配置到container-env文件中的http_proxy中即可赔退。當(dāng)k8s啟動(dòng)后,就可以將代理取消了
- 新版本的microk8s的私有鏡像必須要配置到這里已骇,很多文檔寫(xiě)的是老的配置方案离钝。
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = [ "https://3laho3y3.mirror.aliyuncs.com", "http://f1361db2.m.daocloud.io", "https://mirror.ccs.tencentyun.com", "https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn", "https://registry-1.docker.io" ]
- 由于爬蟲(chóng)占用磁盤(pán)空間很快,所以需要不停的將文件移走褪储,一旦這個(gè)過(guò)程沒(méi)有做好卵渴,k8s服務(wù)器檢測(cè)到磁盤(pán)空間低以后會(huì)開(kāi)始清理image來(lái)嘗試釋放空間。這時(shí)候之前通過(guò)代理下載好的image就會(huì)被清除鲤竹,當(dāng)重新創(chuàng)建pod的時(shí)候浪读,這時(shí)候會(huì)由于找不到sandbox的image并且無(wú)法下載到鏡像(除非開(kāi)了代理)而導(dǎo)致整個(gè)集群的pod停掉。
- 開(kāi)了代理以后辛藻,no_proxy似乎一直沒(méi)有生效碘橘,國(guó)內(nèi)的鏡像也走了代理,很慢吱肌。
除了這幾個(gè)坑意外痘拆,microk8s還算是穩(wěn)定,對(duì)資源占用也和k3s差不多氮墨。更好的是microk8s提供了更為標(biāo)準(zhǔn)化的組件和插件纺蛆,更容易進(jìn)行后期的維護(hù)。在遷移過(guò)程中规揪,k3s默認(rèn)是用的traefik而microk8s用的是nginx桥氏,所以需要一些簡(jiǎn)單的修改。
服務(wù)器選購(gòu)
之前爬蟲(chóng)的服務(wù)器一直放在國(guó)外猛铅,主要是考慮到價(jià)格相對(duì)比較便宜字支,2核4G的機(jī)器一個(gè)月150多元,能夠承受奸忽。但是這個(gè)服務(wù)器的性能就比較低下堕伪,爬蟲(chóng)會(huì)占用所有的CPU資源,導(dǎo)致k8s的集群不是很穩(wěn)定月杉。
雙十一大促的時(shí)候刃跛,華為云推出了4核8G 3年的服務(wù)器,5M的帶寬加上200G的硬盤(pán)苛萎,總價(jià)3080桨昙,算了下真的是白菜價(jià)了。華為云的服務(wù)器的速度非常的理想腌歉,網(wǎng)絡(luò)速度也很贊蛙酪。一般來(lái)講,出口5M是定死的翘盖,入帶寬一般是100M以上桂塞,所以作為爬蟲(chóng)或者APP服務(wù)器已經(jīng)非常的夠用。但是華為云的鏡像服務(wù)有一些同步的問(wèn)題馍驯,每次push到鏡像服務(wù)器中的鏡像阁危,第一次拉回的時(shí)候總會(huì)出現(xiàn)錯(cuò)誤玛痊,要等一些時(shí)間后才能夠拉到正確的鏡像。
后來(lái)又購(gòu)買(mǎi)了騰訊的4核8G 3年的服務(wù)器狂打,5M帶寬擂煞,50G硬盤(pán),總價(jià)3000趴乡,也算是白菜價(jià)对省。但是騰訊云的服務(wù)器不是很理想,CPU速度那些沒(méi)有什么問(wèn)題晾捏,主要的問(wèn)題在于帶寬蒿涎。騰訊的5M的出帶寬,提供的對(duì)等的入帶寬是10M惦辛。這就造成了拉docker image等非常的緩慢劳秋,和華為云、阿里云等的如帶寬相比裙品,騰訊就太摳了俗批。后來(lái)一個(gè)解決方案是將私有的鏡像直接放到騰訊云的鏡像服務(wù)器中,還好現(xiàn)階段沒(méi)有收費(fèi)市怎,速度也夠快了岁忘。最后的痛點(diǎn)是經(jīng)常性的丟包,華為云和騰訊云的服務(wù)器都在廣州区匠,然而騰訊云的服務(wù)器經(jīng)常丟包得根本無(wú)法登陸上去干像。不知道騰訊云的網(wǎng)絡(luò)是怎么搞的,反正用起來(lái)很不爽快驰弄。
后端代碼的重構(gòu)
以前為了學(xué)習(xí)Python麻汰,所以數(shù)據(jù)分析、后端代碼都是使用的Python技術(shù)棧戚篙。其中后端使用的是Flask寫(xiě)的五鲫,也沒(méi)有太大的問(wèn)題。
最近一次重構(gòu)就重寫(xiě)了業(yè)務(wù)邏輯岔擂,使用了Spring Boot位喂、Kotlin、Spring Boot Security來(lái)做乱灵。ETL代碼之前是用Java8寫(xiě)的塑崖,統(tǒng)一也遷移到了Kotlin。
后端架構(gòu)的重構(gòu)
這是以前設(shè)計(jì)的架構(gòu)痛倚,主要麻煩的地方在于由于當(dāng)時(shí)的服務(wù)器性能所限规婆,沒(méi)有將ETL的過(guò)程放到線(xiàn)上進(jìn)行,所以必須要將數(shù)據(jù)同步到本地的PC然后進(jìn)行離線(xiàn)計(jì)算,完成后再同步到線(xiàn)上的數(shù)據(jù)庫(kù)抒蚜。這就造成了需要家里面的電腦長(zhǎng)時(shí)間運(yùn)行掘鄙,在春節(jié)等期間維護(hù)非常的麻煩。
當(dāng)服務(wù)器性能和存儲(chǔ)不是一個(gè)問(wèn)題以后嗡髓,架構(gòu)也隨之改變?yōu)樵诰€(xiàn)數(shù)據(jù)同步通铲、在線(xiàn)ETL,就不用在本地PC做任何操作了器贩。
PS:Tips,這個(gè)圖片使用draw.io的vscode插件朋截,容易修改也容易存儲(chǔ)蛹稍,很贊)