Azure Service Fabric 踩坑日誌

近期項目上面用到了Azure Service Fabric這個服務,它是用來做微服務架構的,由於這套程式碼和架構都是以前同學留下來的,缺少文檔,項目組在折騰時也曾遇到幾個問題,這裡整理如下,以供參考。

我屬於Service Fabric的初學者和使用者,很多概念也都是臨時學習的,我們的工程師後續會更加細緻的研究它。本文僅從故障排查經驗總結的角度做了一點整理,有關這個服務的詳細功能,或者官方推薦的最佳實踐,請參考 //docs.microsoft.com/en-us/azure/service-fabric/service-fabric-overview

  1. 有兩種不同的service fabric可供選擇。有條件(錢多)的話,可以選擇 managed cluster, 省事,因為相當於在service fabric 基礎上又封裝了一層,簡化了管理。

  2. 開發環境沒有必要設置那麼多node,除非你的錢真的富裕得難受了。以上 managed cluster 最少有5個 node(節點),我建議開發環境用原生的 service fabric,然後 1個node就可以了,但可以把虛擬機的尺寸稍微調高一點。它會提示你說這樣的設置不適合生產環境,讓它提示。

  3. 選擇一個富裕一點的region,以便更快的擴容,如果真的有那麼一天。例如目前 China Region 3 因為是新的,比較富裕。

  4. 選擇新的作業系統,避免一些出現不必要的問題,如果能用container,更好。

  5. 這個 service fabric 是基於一個所謂的 vm scale set 來進行擴展的。這個scale set,你要隨時注意它有沒有問題。你可以通過調整下面的參考來改變node數量,但要做好心理準備,可能需要的時間比較長。但是正常情況下,你的服務應該不至於down,因為理論上它是逐個機器更新的。

  6. 創建service fabric 服務會出現一堆東西,你可能不了解它,但你不能隨便刪除它,萬一有用呢

  7. 如果你修改了 vm scale set的東西,一定要及時查看 service fabric cluster的狀態,如果它顯示為 updating,那麼恭喜你,它可能正在更新。但如果它一直顯示為updating,你就可能要跟我們一樣加幾個班了。目前沒有看到命令可以重啟 service fabric,且錯誤日誌不清晰,所以有時候會讓人抓狂。

  8. 以上做好了,你可能以為就結束了。然鵝並不是。service fabric的資源中,雖然可以看到有一個 loadbalance的組件,而且也有一個對外的ip地址,但是它不能用來直接做微服務的對外訪問,因為你的微服務可能會有N個(理論上),而每個微服務呢,建議要有獨立的埠才行。這個無法在loadbalance組件中做設置。

  9. 所以你需要有一個Application Gateway 的東西,能接管前端的用戶請求,並且做路由。我萬萬沒想到,在這個環節會遇到一些挑戰,教訓非常慘痛。首先,你需要映射https的埠的話,當然需要準備證書。這個證書,我們建議放在 key vault中。這裡要命的地方是,它在創建https listener時會讓你上傳一個pfx文件,並且必須要有一個password,而從key vault中導出的pfx,默認並不需要password。所以你可能需要下一段程式碼。

    點擊查看程式碼
    Install-Module AzureRM
    Connect-AzureRMAccount -Environment AzureChinaCloud
    
    $vaultName = "xxxxx"
    $certificateName = "xxxxx"
    $pfxPath = [Environment]::GetFolderPath("Desktop") + "\$certificateName.pfx"
    $password = "pass@word1"
    $pfxSecret = Get-AzureKeyVaultSecret -VaultName $vaultName -Name $certificateName
    $pfxUnprotectedBytes = [Convert]::FromBase64String($pfxSecret.SecretValueText)
    $pfx = New-Object Security.Cryptography.X509Certificates.X509Certificate2
    $pfx.Import($pfxUnprotectedBytes, $null, [Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
    $pfxProtectedBytes = $pfx.Export([Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $password)
    [IO.File]::WriteAllBytes($pfxPath, $pfxProtectedBytes)
    

先記錄了這麼多