Taurus.MVC 微服務框架 入門開發教程:項目部署:1、微服務應用程式常規部署實現多開,節點擴容。
- 2022 年 8 月 15 日
- 筆記
- ASP.NET Taurus.MVC, taurus.mvc, 微服務架構
系列目錄:
本系列分為項目集成、項目部署、架構演進三個方向,後續會根據情況調整文章目錄。
本系列第一篇:Taurus.MVC V3.0.3 微服務開源框架發布:讓.NET 架構在大並發的演進過程更簡單。
Taurus.MVC 微服務框架 入門開發教程:項目集成:1、服務端:註冊中心、網關。
Taurus.MVC 微服務框架 入門開發教程:項目集成:2、客戶端:ASP.NET(C#)程式語言項目集成:應用中心。
Taurus.MVC 微服務框架 入門開發教程:項目集成:3、客戶端:其它程式語言項目集成:應用中心。
Taurus.MVC 微服務框架 入門開發教程:項目集成:4、默認安全認證與自定義安全認證。
Taurus.MVC 微服務框架 入門開發教程:項目部署:1、微服務應用程式常規部署實現多開,節點擴容。
Taurus.MVC 微服務框架 入門開發教程:項目部署:2、微服務應用程式Docker部署實現多開。
Taurus.MVC 微服務框架 入門開發教程:項目部署:3、微服務應用程式發布到Docker部署(上)。
Taurus.MVC 微服務框架 入門開發教程:項目部署:4、微服務應用程式發布到Docker部署(下)。
Taurus.MVC 微服務框架 入門開發教程:項目部署:5、微服務應用程式版本升級。
Taurus.MVC 微服務框架 入門開發教程:項目部署:6、讓Kestrel支援綁定多個域名轉發。
Taurus.MVC 微服務框架 入門開發教程:架構演進:1、從單應用程式簡單過渡到負載均衡。
Taurus.MVC 微服務框架 入門開發教程:架構演進:2、負載均到模組拆分負載。
Taurus.MVC 微服務框架 入門開發教程:架構演進:3、模組拆分負載到多級負載均衡。
前言:
最近在寫相關微服務教程時發現,要構建負載均衡,如果不做點其它處理:
對於同一台主機而言上的ASP.NET Core 應用程式而言,需要通過複製程式,才能運行多份應用運行。
對於ASP.NET Core發布的項目:
1、默認是綁定約定好的埠,因此程式無法多開。 2、將綁定埠設置為0,即隨機埠,讓程式允許多開。
不過僅是多開,還不夠。
因為對於微服務程式,需要在程式啟動時,自動將自身的訪問地址告訴註冊中心。
默認的隨機埠,無法知曉自己的運行地址,便無法發送到註冊中心去。
因此,需要提前獲知運行的地址(給MicroService.App.RunUrl賦值,便於發送到註冊中心)。
通過小小思考,可以先獲取隨機可用埠,再指定該埠,即可解決這個個問題。
下面看具體的實現:
1、修改配置文件,使用隨機埠:
這裡設置啟動埠號,和綁定的埠號都為0,0即隨機。
註冊中心地址是固定的,因此直接寫。
{ "AppSettings": { "MicroService.Client.Name": "*",//註冊所有模組 "MicroService.Client.RegUrl": "//192.168.188.95:9999",//註冊中心的地址,這是固定的
"MicroService.App.RunUrl": "//localhost:0",//設置當前運行的訪問地址的隨機埠0,程式碼運行時再替換該值 "Host": "//*:0"//監聽埠為隨機,程式碼運行時再替換該值 } }
接下來,需要在啟動程式里,把0這個隨機埠提前修改為可用埠,並做埠替換。
2、修改啟動程式碼:.NET5、NET6、NET7…系列的:Program.cs
using Microsoft.AspNetCore.Server.Kestrel.Core; using System.Net; using System.Net.Sockets; var builder = WebApplication.CreateBuilder(args); string host = CYQ.Data.AppConfig.GetApp("Host"); string runUrl = Taurus.Core.MicroService.Config.AppRunUrl; if (host.Contains(":0"))//隨機埠 { TcpListener tl = new TcpListener(IPAddress.Any, 0); tl.Start(); int port = ((IPEndPoint)tl.LocalEndpoint).Port;//獲取隨機可用埠 tl.Stop(); host = host.Replace(":0", ":" + port);//替換監聽埠號 if (runUrl.Contains(":0")) { Taurus.Core.MicroService.Config.AppRunUrl = runUrl.Replace(":0", ":" + port);//替換設置啟動路徑的埠號 } } builder.WebHost.UseUrls(host); builder.Services.AddHttpContext(); builder.Services.Configure<KestrelServerOptions>(x => x.AllowSynchronousIO = true).Configure<IISServerOptions>(x => x.AllowSynchronousIO = true); var app = builder.Build(); app.UseHttpContext(); app.UseTaurusMvc(app.Environment); app.Run();
這裡,先產生可用的監聽埠,再用這個埠號賦值後再監聽。
3、修改啟動程式碼:ASP.NET Core 2.N到3.N系列:Program.cs
程式碼是一樣的:
using System; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; using CYQ.Data; using System.Net.Sockets; using System.Net; using Taurus.Core; namespace Taurus.View { public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseUrls(GetUrl()) .Build(); public static string GetUrl() { string host = AppConfig.GetApp("Host"); string runUrl = MicroService.Config.AppRunUrl; if (host.Contains(":0"))//隨機埠 { TcpListener tl = new TcpListener(IPAddress.Any, 0); tl.Start(); int port = ((IPEndPoint)tl.LocalEndpoint).Port;//獲取隨機可用埠 tl.Stop(); host = host.Replace(":0", ":" + port); if (runUrl.Contains(":0")) { MicroService.Config.AppRunUrl = runUrl.Replace(":0", ":" + port);//設置啟動路徑 } } return host; } } }
4、修改啟動程式碼:再優化一下,實現跨主機:
在上面的配置中:
"MicroService.App.RunUrl": "//localhost:0",//設置當前運行的訪問地址的隨機埠0,程式碼運行時再替換該值
如果指定了localhost,默認情況下,僅適合單主機運行,無法跨主機直接運行。
因此,程式碼可以再優化一下,把localhost替換成本機區域網IP:
public static string GetUrl() { string host = AppConfig.GetApp("Host"); string runUrl = MicroService.Config.AppRunUrl; if (host.Contains(":0"))//隨機埠 { TcpListener tl = new TcpListener(IPAddress.Any, 0); tl.Start(); int port = ((IPEndPoint)tl.LocalEndpoint).Port;//獲取隨機可用埠 tl.Stop(); host = host.Replace(":0", ":" + port); if (runUrl.Contains(":0")) { runUrl = runUrl.Replace(":0", ":" + port);//替換啟動路徑 } if (runUrl.Contains("localhost"))//替換成內網IP { System.Net.IPAddress[] addressList = Dns.GetHostEntry(Dns.GetHostName()).AddressList; foreach (var address in addressList) { if (!address.ToString().Contains(":")) { runUrl = runUrl.Replace("localhost", address.ToString());//替換啟動路徑 break; } } } MicroService.Config.AppRunUrl = runUrl; } return host; }
總結:
通過以上配置,發布後的應用程式,可以在任何主機上實現多開N次,就可以增加N個節點。
隨時隨地實現節點的動態新增擴容。