系列目录:

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

本系列第一篇: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. 1、默认是绑定约定好的端口,因此程序无法多开。
  2.  
  3. 2、将绑定端口设置为0,即随机端口,让程序允许多开。

不过仅是多开,还不够。

因为对于微服务程序,需要在程序启动时,自动将自身的访问地址告诉注册中心。

默认的随机端口,无法知晓自己的运行地址,便无法发送到注册中心去。

因此,需要提前获知运行的地址(给MicroService.App.RunUrl赋值,便于发送到注册中心)。

通过小小思考,可以先获取随机可用端口,再指定该端口,即可解决这个个问题。

下面看具体的实现:

1、修改配置文件,使用随机端口:

这里设置启动端口号,和绑定的端口号都为0,0即随机。

注册中心地址是固定的,因此直接写。

  1. {
  2. "AppSettings": {
  3.  
  4. "MicroService.Client.Name": "*",//注册所有模块
  5. "MicroService.Client.RegUrl": "http://192.168.188.95:9999",//注册中心的地址,这是固定的

  6. "MicroService.App.RunUrl": "http://localhost:0",//设置当前运行的访问地址的随机端口0,代码运行时再替换该值
  7. "Host": "http://*:0"//监听端口为随机,代码运行时再替换该值
  8. }
  9. }

接下来,需要在启动程序里,把0这个随机端口提前修改为可用端口,并做端口替换。

2、修改启动代码:.NET5、NET6、NET7...系列的:Program.cs

  1. using Microsoft.AspNetCore.Server.Kestrel.Core;
  2. using System.Net;
  3. using System.Net.Sockets;
  4.  
  5. var builder = WebApplication.CreateBuilder(args);
  6. string host = CYQ.Data.AppConfig.GetApp("Host");
  7. string runUrl = Taurus.Core.MicroService.Config.AppRunUrl;
  8. if (host.Contains(":0"))//随机端口
  9. {
  10. TcpListener tl = new TcpListener(IPAddress.Any, 0);
  11. tl.Start();
  12. int port = ((IPEndPoint)tl.LocalEndpoint).Port;//获取随机可用端口
  13. tl.Stop();
  14. host = host.Replace(":0", ":" + port);//替换监听端口号
  15. if (runUrl.Contains(":0"))
  16. {
  17. Taurus.Core.MicroService.Config.AppRunUrl = runUrl.Replace(":0", ":" + port);//替换设置启动路径的端口号
  18. }
  19. }
  20. builder.WebHost.UseUrls(host);
  21. builder.Services.AddHttpContext();
  22. builder.Services.Configure<KestrelServerOptions>(x => x.AllowSynchronousIO = true).Configure<IISServerOptions>(x => x.AllowSynchronousIO = true);
  23.  
  24. var app = builder.Build();
  25. app.UseHttpContext();
  26. app.UseTaurusMvc(app.Environment);
  27. app.Run();

这里,先产生可用的监听端口,再用这个端口号赋值后再监听。

3、修改启动代码:ASP.NET Core 2.N到3.N系列:Program.cs

代码是一样的:

  1. using System;
  2. using Microsoft.AspNetCore;
  3. using Microsoft.AspNetCore.Hosting;
  4. using CYQ.Data;
  5. using System.Net.Sockets;
  6. using System.Net;
  7. using Taurus.Core;
  8.  
  9. namespace Taurus.View
  10. {
  11. public class Program
  12. {
  13. public static void Main(string[] args)
  14. {
  15.  
  16. BuildWebHost(args).Run();
  17.  
  18. }
  19.  
  20. public static IWebHost BuildWebHost(string[] args) =>
  21. WebHost.CreateDefaultBuilder(args)
  22. .UseStartup<Startup>()
  23. .UseUrls(GetUrl())
  24. .Build();
  25. public static string GetUrl()
  26. {
  27. string host = AppConfig.GetApp("Host");
  28. string runUrl = MicroService.Config.AppRunUrl;
  29. if (host.Contains(":0"))//随机端口
  30. {
  31. TcpListener tl = new TcpListener(IPAddress.Any, 0);
  32. tl.Start();
  33. int port = ((IPEndPoint)tl.LocalEndpoint).Port;//获取随机可用端口
  34. tl.Stop();
  35. host = host.Replace(":0", ":" + port);
  36. if (runUrl.Contains(":0"))
  37. {
  38. MicroService.Config.AppRunUrl = runUrl.Replace(":0", ":" + port);//设置启动路径
  39. }
  40. }
  41. return host;
  42. }
  43. }
  44. }

4、修改启动代码:再优化一下,实现跨主机:

在上面的配置中:

  1. "MicroService.App.RunUrl": "http://localhost:0",//设置当前运行的访问地址的随机端口0,代码运行时再替换该值

如果指定了localhost,默认情况下,仅适合单主机运行,无法跨主机直接运行。

因此,代码可以再优化一下,把localhost替换成本机局域网IP:

  1. public static string GetUrl()
  2. {
  3. string host = AppConfig.GetApp("Host");
  4. string runUrl = MicroService.Config.AppRunUrl;
  5. if (host.Contains(":0"))//随机端口
  6. {
  7. TcpListener tl = new TcpListener(IPAddress.Any, 0);
  8. tl.Start();
  9. int port = ((IPEndPoint)tl.LocalEndpoint).Port;//获取随机可用端口
  10. tl.Stop();
  11. host = host.Replace(":0", ":" + port);
  12. if (runUrl.Contains(":0"))
  13. {
  14. runUrl = runUrl.Replace(":0", ":" + port);//替换启动路径
  15. }
  16. if (runUrl.Contains("localhost"))//替换成内网IP
  17. {
  18. System.Net.IPAddress[] addressList = Dns.GetHostEntry(Dns.GetHostName()).AddressList;
  19. foreach (var address in addressList)
  20. {
  21. if (!address.ToString().Contains(":"))
  22. {
  23. runUrl = runUrl.Replace("localhost", address.ToString());//替换启动路径
  24. break;
  25. }
  26. }
  27. }
  28. MicroService.Config.AppRunUrl = runUrl;
  29.  
  30. }
  31.  
  32. return host;
  33. }

总结:

通过以上配置,发布后的应用程序,可以在任何主机上实现多开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. 阿里巴巴开源限流组件Sentinel初探

    1 Sentinel主页 https://github.com/alibaba/Sentinel/wiki/主页 1.1 Sentinel介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要. ...

  2. 深度学习与CV教程(13) | 目标检测 (SSD,YOLO系列)

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  3. 超级重磅!Apache Hudi多模索引对查询优化高达30倍

    与许多其他事务数据系统一样,索引一直是 Apache Hudi 不可或缺的一部分,并且与普通表格式抽象不同. 在这篇博客中,我们讨论了我们如何重新构想索引并在 Apache Hudi 0.11.0 版 ...

  4. 【Java面试】Mybatis中#{}和${}的区别是什么?

    一个工作2年的粉丝,被问到一个Mybatis里面的基础问题. 他跑过来调戏我,说Mic老师,你要是能把这个问题回答到一定高度,请我和一个月奶茶. 这个问题是: "Mybatis里面#{}和$ ...

  5. 物联网微消息队列MQTT介绍-EMQX集群搭建以及与SpringBoot整合

    项目全部代码地址:https://github.com/Tom-shushu/work-study.git (mqtt-emqt 项目) 先看我们最后实现的一个效果 1.手机端向主题 topic111 ...

  6. numpy学习笔记 01

    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. NumPy 是一个运行速度非常快的数学库 ...

  7. pyenv安装及使用教程

    pyenv安装及使用教程 pyenv 安装 git clone https://github.com/pyenv/pyenv.git ~/.pyenv # 编辑 bashrc vim ~/.bashr ...

  8. 重学ES系列之模版字符串

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. dubbox、zookeeper BUG记录

    主要错误信息: dubbo:com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method... Caused by: com.alib ...

  10. 不要让Microsoft edge 打开IE浏览器的设置(兼容性问题)

    1打开Microsoft edge 2 打开设置 3 搜索栏搜索IE,打开即可