今天我們演示了一下,如何在 Web App 切換槽位後,通過環境變量的方式來加載不同環境的數據庫連接字符串,以及生產環境/集成測試環境部署槽交換,再一個捎帶講了一下使用FTP上傳部署項目到Azure Web App
作者:Allen
項目代碼://github.com/yunqian44/CnBateBlogWeb.git
版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。
上一篇文章講到今天我們演示了一下,如何在Web App中創建 「Deployment Slot」進行快速無停機部署新功能代碼,也使用VS進行發佈到創建的Web App中創建的新的部署槽位中,同時也引出了另外一個問題,環境變量怎麼切換,切換槽位後,生產環境的數據庫連接字符串怎麼辦。下一篇文章,我會繼續 部署槽,進行配置部署槽設置,同時在交換槽位的時候,測試環境/生產環境都能夠準確的連接到對於的數據庫。😎😎😎😎😎
——————–我是分割線——————–
Azure Web App 部署系列:
項目名稱 「CnBateBlogWeb」
選擇 「Web 應用程序(模型視圖控制器)」,去掉 「為HTTPS 配置」 的勾選,點擊創建
刪除 「launchSettings」 文件中 IIS 配置部分
添加一個名叫 「appsettings.Production.json」 配置文件,裏面當前項目的生產環境的數據庫連接字符串。
」appsettings.Development.json「 配置文件中配置我們開發環境的數據庫連接字符串(測試環境使用相同的方法進行添加問題和配置,這裡就不多說了)
新建 Appsettings 的操作類
Appsetting.cs 類代碼
1 /// <summary> 2 /// appsettings.json操作類 3 /// </summary> 4 public class Appsettings 5 { 6 static IConfiguration Configuration { get; set; } 7 static string contentPath { get; set; } 8 9 public Appsettings(string contentPath) 10 { 11 //string Path = "appsettings.json"; 12 13 14 //如果你把配置文件 是 根據環境變量來分開了,可以這樣寫 15 string Path = $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json"; 16 17 18 19 //Configuration = new ConfigurationBuilder() 20 //.Add(new JsonConfigurationSource { Path = Path, ReloadOnChange = true })//請注意要把當前appsetting.json 文件->右鍵->屬性->複製到輸出目錄->始終複製 21 //.Build(); 22 23 24 //var contentPath = env.ContentRootPath; 25 Configuration = new ConfigurationBuilder() 26 .SetBasePath(contentPath) 27 .Add(new JsonConfigurationSource { Path = Path, Optional = false, ReloadOnChange = true })//這樣的話,可以直接讀目錄里的json文件,而不是 bin 文件夾下的,所以不用修改複製屬性 28 .Build(); 29 30 31 } 32 33 /// <summary> 34 /// 封裝要操作的字符 35 /// </summary> 36 /// <param name="sections"></param> 37 /// <returns></returns> 38 public static string app(params string[] sections) 39 { 40 try 41 { 42 var val = string.Empty; 43 for (int i = 0; i < sections.Length; i++) 44 { 45 val += sections[i] + ":"; 46 } 47 48 return Configuration[val.TrimEnd(':')]; 49 } 50 catch (Exception) 51 { 52 return ""; 53 } 54 55 } 56 }
HomeController 的 Index 方法 返回跟環境變量有關係的參數
HomeController.cs 相關代碼
使用構造函數注入 _env
1 private readonly IWebHostEnvironment _env;
1 public HomeController(ILogger<HomeController> logger, IWebHostEnvironment env) 2 { 3 _env = env; 4 _logger = logger; 5 }
Index 方法
1 public IActionResult Index() 2 { 3 var environmentStr = string.Empty; 4 if (_env.IsDevelopment()) 5 { 6 environmentStr += "開發環境"; 7 } 8 else if (_env.IsProduction()) 9 { 10 environmentStr += "生產環境"; 11 } 12 else 13 { 14 environmentStr += "未知環境"; 15 } 16 ViewBag.Environment = $"當前系統處於:{environmentStr}"; 17 ViewBag.SqlServerConnection = $"{Appsettings.app("SqlServer", "SqlServerConnection")}"; 18 return View(); 19 }
HomeController 控制器完整代碼:
1 public class HomeController : Controller 2 { 3 private readonly IWebHostEnvironment _env; 4 private readonly ILogger<HomeController> _logger; 5 6 public HomeController(ILogger<HomeController> logger, IWebHostEnvironment env) 7 { 8 _env = env; 9 _logger = logger; 10 } 11 12 public IActionResult Index() 13 { 14 var environmentStr = string.Empty; 15 if (_env.IsDevelopment()) 16 { 17 environmentStr += "開發環境"; 18 } 19 else if (_env.IsProduction()) 20 { 21 environmentStr += "生產環境"; 22 } 23 else 24 { 25 environmentStr += "未知環境"; 26 } 27 ViewBag.Environment = $"當前系統處於:{environmentStr}"; 28 ViewBag.SqlServerConnection = $"{Appsettings.app("SqlServer", "SqlServerConnection")}"; 29 return View(); 30 } 31 32 public IActionResult Privacy() 33 { 34 return View(); 35 } 36 37 [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] 38 public IActionResult Error() 39 { 40 return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); 41 } 42 }
View Code
F5運行看看,可以看到 當前appsettings 的配置文件獲取的是 開發環境 的配置信息
切換 launchSettings.json 中的 「ASPNETCORE_ENVIRONMENT」 的參數 為 「Production」
F5再次調試運行看看
bingo,我們在VS的調試運行中通過環境變量來控制項目連接的是那種環境,並且通過這種環境變量也獲取到不同的數據庫連接字符串。
接下來,我們就可以在Azure Portal 中進行設置了
Azure Portal 中找到 之前創建好的叫 「CnBateBlogWeb」 的 Web App,選擇 「Settings」 => “Configuration”
我們可以清楚的看到圖中圈起來的 Application settings 的解釋,主要看後面的最後一句話:Application Setting 可以作為環境變量供應用程序在運行時進行訪問。
添加生產環境的環境變量 「ASPNETCORE_ENVIRONMENT=Production」,點擊 「New application setting」。
Name 輸入 “ASPNETCORE_ENVIRONMENT”,Value 輸入 「Production」,勾選 Deployment slot setting 後,點擊 「Apply」
我們可以在 Configuration 頁面的 應用程序設置的列表中看到剛剛配置好的 ASPNETCORE_ENVIRONMENT 的環境變量,同時我們可以點擊列表上面的 「Show values」進行查看具體的環境變量的參數。
點擊 「Show values」 後,我們可以看到我們具體設置到的一個具體的環境變量的參數的值。
同樣的,我們在測試環境,或者集成測試環境中配置對於的環境變量的參數
選擇 「Deployment」 =》「Deployment slots」,點擊 「cnbateblogweb-Integration-Testing」 的超鏈接,跳轉到對於的我們之前設置好的集成測試環境的部署槽中
可以看到,我們現在已經切換到 IntegrationTesting 環境的部署槽中
選擇 「Settings」 => “Configuration” ,點擊 「New Application settings」,進行配置集成測試環境部署槽中的環境變量
Name 輸入 「ASPNETCORE_ENVIRONMENT」,Value 輸入 「Development」,勾選 「Deployment slot setting」 後,點擊 「OK」
同樣的,我們也可以查看到自己剛剛在集成測試環境中配置的叫 「ASPNETCORE_ENVIRONMENT」 的環境變量,以及它的參數,這裡就不過多演示了,和上面的做法一樣。
再次回到我們的VS之中,先直接發佈項目到生產環境,模擬生產環境現在已有的項目在運行,以及測試生產環境連接到正確的數據庫
選擇之前創建的 「CnBateBlogWeb」 的 Web App,點擊 「發佈」,詳細發佈步驟請移步:Azure Web App(一)發佈你的Net Core Web 項目
發佈進行中
發佈完成
發佈完成後,瀏覽器會自動打開,直接跳轉到當前發佈的 Web App 對應的二級目錄,測試成功
或者,複製VS 發佈頁面的 站點URL
在或者在Azure Portal 中找到項目對應的Web App 點擊 「Browse」
再次回到VS,我們修改首頁,添加上一些 「新功能」
F5運行看看,成功的顯示出,我們新加的 「功能」
發佈項目,選擇之前創建的 」cnbateblogweb-IntegrationTesting「 的部署槽,詳細發佈步驟請移步:Azure Web App(一)發佈你的Net Core Web 項目
發佈完成後,瀏覽器會自動打開,直接跳轉到當前發佈的 Web App 的集成環境的部署槽對應的二級目錄,當前環境也是集成測試環境,新功能也有了(這裡要說明一點,這裡的開發環境指的就是集成測試環境)
成功。接下來,我們進行完集成測試後,就可以發佈到正式環境。
切換部署槽,將 「集成測試環境」 的代碼切換到 「生產環境」 中去,點擊 「Swap」
點擊 「Swap」
我們訪問生產環境部署的項目的url,顯示 數據庫鏈接正常,「新功能」也加上了
回過頭,我們看看集成測試環境的訪問顯示情況
bingo🎉🎉🎉🎉🎉
今天成功的通過環境變量的控制訪問不同環境的數據庫鏈接字符串,也通過部署槽交換的方式,減少了傳統項目的停機中斷,做到無縫切換環境,發佈。
——————–額外話題——————–
今天順便演示一下使用FTP發佈項目代碼到Azure Web App
下載發佈的配置文件
使用notepad++ 打開這個文件,我們可以在這個文件中找到 FTP 上傳的 publishUrl,userName,userPWD
使用FTP工具,輸入相應的參數
點擊 「連接」,連接成功後,我們就可以通過FTP工具看到,對應的 Azure Web App 的 遠程路徑,我們就可以把本地 VS publish 好的項目的文件上傳上去
我們在azure portal 中項目對於的 Web App 點擊 「Restart」 重啟一下,最後點擊 「Browse」 進行測試
ok,使用FPT上傳的方式部署項目代碼的分享到此結束。
今天我們演示了一下,如何在 Web App 切換槽位後,通過環境變量的方式來加載不同環境的數據庫連接字符串,以及生產環境/集成測試環境部署槽交換,再一個捎帶講了一下使用FTP上傳部署項目到Azure Web App
作者:Allen
項目代碼://github.com/yunqian44/CnBateBlogWeb.git
版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。