【效率專精系列】Beta環境不須要,本地聯調拯救開發效率

目前團隊中先後端聯調是較之我的單獨開發相對耗時的一個環節,主要體如今:html

  1. beta環境下的部署時間較長。首先部署beta須要通過push分支、合併衝突、build、部署四個步驟。在不考慮分支衝突的狀況下,因爲白天CI服務器壓力較大,以商戶後臺應用爲例,build耗時約1-2min,部署耗時約3-5min。本地的build則相對快得多,冷部署時間則和beta服務器差很少。
  2. 代碼迭代過程當中等待時間所佔比例較多。迭代具體指代碼更新 - 編譯&部署 - 驗證 - 代碼更新的開發循環,而在beta編譯和部署時間則是這個循環的大頭,包括切換CI頁面的時間、操做push&update的時間、等待build的時間、等待部署的時間,每一步都須要肉眼確認,沒法自動化。雖然人腦上下文切換的時間若是熟練以後也挺快的,可是beta部署不像本地部署能夠應用熱部署技術,beta部署的時間代價沒法縮減。
  3. 其餘分支可能的干擾。因爲beta上存在其餘並行開發的分支,若是存在分支衝突,根據衝突行數和對業務代碼的瞭解程度的不一樣,則存在極不肯定的merge時間,可是實際上merge步驟應該放到聯調後和上線前,以保證不會由於分支上線時間的調整致使merge工做量的浪費。

本文的目的是經過將聯調本地化,減小部分枯燥勞動、以及無效的等待時間,提升團隊的開發效率。前端

業務團隊目前開發的API基本是兩種形式:WebAPI和RpcAPI,WebAPI一般是指以超文本傳輸協議(HTTP/HTTPS)爲基礎的API,是現代流行的對外部第三方開發者提供服務的方式。例如Github API,它的編碼風格——特徵狀態轉移(Rest)被你們視爲經典;RpcAPI則是經過各種RPC協議爲基礎的API,各個公司的組件有所不一樣,團隊中用的是Pigeon。web

下文將分爲相應的兩個部分闡述。apache

基於Tomcat的WebAPI

爲了作到本地聯調,只須要確保前端能訪問到後端Tomcat上的應用便可。以macOS爲例,我收集了相關的資料,有些步驟是實驗證實沒必要要的,有些步驟則是必須的。segmentfault

防火牆權限和端口映射配置

【不須要】關閉系統偏好設置-安全性與隱私-防火牆後端

【須要】設置防火牆的端口轉發和訪問本機外網IP的權限。具體的設置方法再也不贅述。安全

# 對本地IP的Tomcat默認端口8080訪問重定向到80端口,這樣就能夠直接使用域名訪問了,避免有些應用會禁止非80端口的訪問。
rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080
rdr pass on en0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080

# 相似的,容許外部機器經過外網IP(172.22.54.89)訪問本機,順便把8080端口重定向也設置了
rdr pass on lo0 inet proto tcp from any to 172.22.54.89 port 80 -> 172.22.54.89 port 8080
rdr pass on en0 inet proto tcp from any to 172.22.54.89 port 80 -> 172.22.54.89 port 8080

Hosts配置

配置文件位於/etc/hosts服務器

【不必定須要】將beta域名的DNS地址重定向到本地網絡

#127.0.0.1    web-application.dev.meituan.com

IP地址配置

【不必定須要】雙方機器的IP切換到不一樣路由器下。app

這是由於無線熱點配置了AP隔離的安全特性:掛在同一Wifi AP下的機器禁止經過路由機(實際上是交換機)自己相互訪問。

ID 機器 SSID IP
1 mac mtdp 172.22.54.89
2 mobile mtdp_tech 172.22.38.121
3 mobile mtdp 172.22.50.98

1號機訪問2號機的traceroute回顯,能夠看到正常訪問。
clipboard.png

1號機訪問3號機的traceroute回顯,能夠看到網絡包在網關這一層就被丟棄了。這也就解釋了mac和手機處於mtdp時,Charles抓包失敗的狀況。
clipboard.png

Tomcat的配置

配置文件位於%TOMCAT_HOME%/conf/context.xml

【不須要】設置以下的IP過濾器,保持默認便可。

<Context privileged="true" antiResourceLocking="false" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="xxx.xxx.xxx.xxx"/>
</Context>

【不須要】更改Engine的defaultHost爲外部IP,保持localhost便可。

<Engine name="Catalina" defaultHost="xxx.xxx.xxx.xxx">

【不須要】更改Host的name爲外部IP,保持localhost便可。

<Host name="xxx.xxx.xxx.xxx"  appBase="webapps"
           unpackWARs="true" autoDeploy="true">

基於Pigeon的RpcAPI

【須要】配置相同的泳道。

Pigeon是公司內部的Rpc組件,支持泳道特性,大大簡化了配置過程。配置了泳道,全部的請求也會被隔離起來了,在A泳道里的請求只會發送給A,而不會發送給B。利用該特性,咱們能夠把Rpc上下游的服務都加入到同一個泳道中,使雙方的IP位於服務發現列表的第一位。

上下游雙方編輯本地文件/data/webapps/appenv,在文件末尾新添加一行swimlane=XXX,此處的值能夠是任意的,儘可能不要和其餘人配置相同就能夠了。而後雙方各自啓動服務,在test.pigeon.sankuai.com中或者訪問ServiceIP:4080/services確認已位於統一泳道。

Reference

  1. 【二層隔離技術漫談】「一:爲何要二層隔離」&「二:端口隔離技術」
  2. 泳道配置
相關文章
相關標籤/搜索