Taurus.MVC 微服務框架 入門開發教程:項目部署:1、微服務應用程式常規部署實現多開,節點擴容。

系列目錄:

本系列分為項目集成、項目部署、架構演進三個方向,後續會根據情況調整文章目錄。

本系列第一篇: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個節點。

隨時隨地實現節點的動態新增擴容。