系列目录:

本系列分为项目集成、项目部署、架构演进三个方向,后续会根据情况调整文章目录。

本系列第一篇: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": "http://192.168.188.95:9999",//注册中心的地址,这是固定的

"MicroService.App.RunUrl": "http://localhost:0",//设置当前运行的访问地址的随机端口0,代码运行时再替换该值
"Host": "http://*: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": "http://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个节点。

随时随地实现节点的动态新增扩容。

Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。的更多相关文章

  1. Taurus.MVC 微服务框架 入门开发教程:项目部署:2、让Kestrel支持绑定多个域名转发,替代Ngnix使用。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  2. Taurus.MVC 微服务框架 入门开发教程:项目部署:3、微服务应用程序版本升级:全站升级和局部模块升级。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  3. Taurus.MVC 微服务框架 入门开发教程:项目集成:1、服务端:注册中心、网关(提供可运行程序下载)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  4. Taurus.MVC 微服务框架 入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目集成:应用中心。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  5. Taurus.MVC 微服务框架 入门开发教程:项目集成:5、统一的日志管理。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  6. Taurus.MVC 微服务框架 入门开发教程:项目集成:4、默认安全认证与自定义安全认证。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  7. Taurus.MVC 微服务框架 入门开发教程:项目部署:4、微服务应用程序发布到Docker部署(上)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  8. Taurus.MVC 微服务框架 入门开发教程:项目部署:5、微服务应用程序发布到Docker部署(下)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  9. Taurus.MVC 微服务框架 入门开发教程:项目部署:6、微服务应用程序Docker部署实现多开。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

随机推荐

  1. CF1625D - Binary Spiders[trie树优化dp]

    官方题解 题意:给数列a[],选择尽量多的数满足任意两个异或起来<=k 1625D - Binary Spiders 思路:首先,将数列排序得到,然后升序取得的值的任意两个最小值为相邻两个异或的 ...

  2. Ubuntu远程桌面助手(URDC)

    目前自动驾驶域控制器项目中使用了英伟达的Orin芯片+Ubuntu20.04系统.域控属于典型的Headless设备,开发调试时需要连接显示器(HDMI/DP).鼠标和键盘,或者使用NoMachine ...

  3. web自动化之元素定位篇

    一.web自动化元素定位的方式有8种.------腾讯课堂 1.1 id定位: 1.2 class定位: 1.3 classname定位 1.4 tag_name 1.5

  4. 摸鱼人常备5个Python迷你项目,玩一整天不是问题(附源码)

    大家好鸭,我是小熊猫 在使用Python的过程中,我最喜欢的就是Python的各种第三方库,能够完成很多操作. 下面就给大家介绍5个通过Python构建的项目,以此来学习Python编程. 一.石头剪 ...

  5. Python爬取全球是最大的电影数据库网站IMDb数据

    在使用 Python 开发爬虫的过程中,requests 和 BeautifulSoup4(别名bs4) 应用的比较广泛,requests主要用于模拟浏览器的客户端请求,以获取服务器端响应,接收到的响 ...

  6. 从svn下载项目后出现 Error:java: Compilation failed: internaljava compiler error 解决办法

    原因:出现这个问题的话,主要是因为导入的项目JDK版本与自己的不匹配. 解决方法如下: 最后,酱紫

  7. NC202492 仓库选址

    NC202492 仓库选址 题目 题目描述 牛能在某小城有了固定的需求,为了节省送货的费用,他决定在小城里建一个仓库,但是他不知道选在哪里,可以使得花费最小. 给出一个 \(m \times n\) ...

  8. ctfshow的web入门171

    web入门171 看到这个查询语句,我们可以进行相关操作 $sql = "select username,password from user where username !='flag' ...

  9. Proxmox-VE虚拟环境

  10. 网络通讯之Socket-Tcp(二)

    网络通讯之Socket-Tcp  分成2部分讲解: 网络通讯之Socket-Tcp(一): 1.如何理解Socket 2.Socket通信重要函数 3.Socket Tcp 调用的基本流程图 4.简单 ...