一,引言
上一篇文章講到如何在Web App中創建 “Deployment Slot” 進行快速無停機部署新功能代碼,也使用VS進行發布項目到創建的 Web App 中創建的新的部署槽位中,同時也引出了另外一個問題,環境變量怎么切換,切換槽位后,生產環境的的項目配置的數據庫連接字符串怎么辦。本篇文章,我會繼續進行配置部署槽設置,同時在交換槽位的時候,測試環境/生產環境都能夠准確的連接到對於的數據庫。😎😎😎😎😎
--------------------我是分割線--------------------
Azure Web App 和Azure VM 部署系列:
1,Azure Web App(一)發布你的Net Core Web 項目
2,Azure Web App(二)使用部署槽切換部署環境代碼
3,Azure Web App(三)切換你的Net Core Web 項目的數據庫連接字符串
4,Azure Traffic Manager(一) 為我們的Web項目提供負載均衡
5,Azure Traffic Manager(二) 基於權重與基於優先級的路由策略為我們的Web項目提供負載均衡
6,Azure Load Balance(一) 為我們的Web項目提供負載均衡
7,Azure Load Balancer(二) 基於內部的負載均衡來轉發訪問請求
8,Azure Application Gateway(一)對后端 Web App 進行負載均衡
9,Azure Application Gateway(二)對后端 VM 進行負載均衡
二,正文
1,新建Net Core Web 項目
項目名稱 “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 }
F5運行看看,可以看到 當前appsettings 的配置文件獲取的是 開發環境 的配置信息
切換 launchSettings.json 中的 “ASPNETCORE_ENVIRONMENT” 的參數 為 “Production”
F5再次調試運行看看
bingo,我們在VS的調試運行中通過環境變量來控制項目連接的是那種環境,並且通過這種環境變量也獲取到不同的數據庫連接字符串。
接下來,我們就可以在Azure Portal 中進行設置了
2,Web App 配置環境變量
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” 的環境變量,以及它的參數,這里就不過多演示了,和上面的做法一樣。
3,模擬場景,發布項目
再次回到我們的VS之中,先直接發布項目到生產環境,模擬生產環境現在已有的項目在運行,以及測試生產環境連接到正確的數據庫
選擇之前創建的 “CnBateBlogWeb” 的 Web App,點擊 “發布”,詳細發布步驟請移步:Azure Web App(一)發布你的Net Core Web 項目
發布進行中
發布完成
發布完成后,瀏覽器會自動打開,直接跳轉到當前發布的 Web App 對應的二級目錄,測試成功
或者,復制VS 發布頁面的 站點URL
在或者在Azure Portal 中找到項目對應的Web App 點擊 “Browse”
4,將集成環境測試好的新功能的代碼部署到生產環境
再次回到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
項目代碼:https://github.com/yunqian44/CnBateBlogWeb.git
版權:轉載請在文章明顯位置注明作者及出處。如發現錯誤,歡迎批評指正。