系列目录:

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

开源地址:https://github.com/cyq1162/Taurus.MVC

本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单。

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

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

Taurus.MVC 微服务框架 入门开发教程:项目集成:3、客户端:其它编程语言项目集成:应用中心。

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

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

Taurus.MVC 微服务框架 入门开发教程:项目集成:6、微服务的二次开发。

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

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

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

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

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

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

Taurus.MVC 微服务框架 入门开发教程:架构演进:1、从单应用程序简单过渡到负载均衡。

Taurus.MVC 微服务框架 入门开发教程:架构演进:2、负载均到模块拆分负载。

Taurus.MVC 微服务框架 入门开发教程:架构演进:3、模块拆分负载到多级负载均衡。

Taurus.MVC 微服务框架 入门开发教程:运行示例:https://github.com/cyq1162/Taurus.MVC.MicroService.Demo

前言:

对于Taurus.MVC 微服务应用程序而言,程序需要在启动时,将自身的可访问地址告诉注册中心。

而通过Docker发布时,其访问路径(IP)或端口(被映射)改变了,而且是后期在部署时才变化的。

那如果在程序启动之时,就获知自身的可访问地址呢?

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

通过本地的配置随机端口,实现节点的多开。

但对于部署到Docker中的而言,走的是镜像的端口映射,因此,情况有所不同。

好在,发现Docker可以在增加节点时设置环境变量。

因此,可将映射后的地址或端口,通过环境变量注射进来,在应用程序中预先读取即可。

下面是经过优化,同时兼容两者的示例代码:

1、Net5、NET6、NET7....系列:Program.cs

using CYQ.Data;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using System.Net;
using System.Net.Sockets;
using Taurus.Core; var builder = WebApplication.CreateBuilder(args);
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);//设置启动路径
}
}
else
{
//判断是否Docker部署,通过环境变量传递当前运行地址,或端口:
string dockerHost = Environment.GetEnvironmentVariable("DockerHost");//跨服务器配置完整路径host:port
if (!string.IsNullOrEmpty(dockerHost))
{
MicroService.Config.AppRunUrl = host;
}
else
{
// Docker部署:设置映射后的地址
//判断是否Docker部署,通过环境变量传递当前运行地址,或端口:
string dockerUrl = Environment.GetEnvironmentVariable("DockerUrl");//跨服务器配置完整路径:http://host:port
if (!string.IsNullOrEmpty(dockerUrl))
{
MicroService.Config.AppRunUrl = dockerUrl;
}
else
{
string dockerHost = Environment.GetEnvironmentVariable("DockerHost");//本机服务器IP,仅配置端口即可。
string dockerPort = Environment.GetEnvironmentVariable("DockerPort");//本机服务器,仅配置端口即可。 if (!string.IsNullOrEmpty(dockerHost) || !string.IsNullOrEmpty(dockerPort))
{
string http = "http";
if (!string.IsNullOrEmpty(runUrl))
{
Uri uri = new Uri(runUrl);
http = uri.Scheme;
if (string.IsNullOrEmpty(dockerHost))
{
dockerHost = uri.Host;
}
if (string.IsNullOrEmpty(dockerPort))
{
dockerPort = uri.Port.ToString();
}
}
if (string.IsNullOrEmpty(dockerHost))
{
dockerHost = "localhost";
}
if (string.IsNullOrEmpty(dockerHost))
{
dockerHost = "80";
}
MicroService.Config.AppRunUrl = http + "://" + dockerHost + ":" + dockerPort;
}
}
}
}
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();

2、ASP.NET 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;
using System.Net.Http; namespace Taurus.View
{
public class Program
{
public static void Main(string[] args)
{
try
{
BuildWebHost(args).Run();
}
catch (Exception err)
{
Console.WriteLine(err.Message);
Console.Read();
}
} public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseUrls(GetUrl())
.Build();
public static string GetUrl()
{
//ServicePointManager.DefaultConnectionLimit = 10000;
//System.Threading.ThreadPool.SetMaxThreads(1000, 1000);
//HttpClientHandler. = 10000; 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"))
{
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; }
else
{
// Docker部署:设置映射后的地址
//判断是否Docker部署,通过环境变量传递当前运行地址,或端口:
string dockerUrl = Environment.GetEnvironmentVariable("DockerUrl");//跨服务器配置完整路径:http://host:port
if (!string.IsNullOrEmpty(dockerUrl))
{
MicroService.Config.AppRunUrl = dockerUrl;
}
else
{
string dockerHost = Environment.GetEnvironmentVariable("DockerHost");//本机服务器IP,仅配置端口即可。
string dockerPort = Environment.GetEnvironmentVariable("DockerPort");//本机服务器,仅配置端口即可。 if (!string.IsNullOrEmpty(dockerHost) || !string.IsNullOrEmpty(dockerPort))
{
string http = "http";
if (!string.IsNullOrEmpty(runUrl))
{
Uri uri = new Uri(runUrl);
http = uri.Scheme;
if (string.IsNullOrEmpty(dockerHost))
{
dockerHost = uri.Host;
}
if (string.IsNullOrEmpty(dockerPort))
{
dockerPort = uri.Port.ToString();
}
}
if (string.IsNullOrEmpty(dockerHost))
{
dockerHost = "localhost";
}
if (string.IsNullOrEmpty(dockerHost))
{
dockerHost = "80";
}
MicroService.Config.AppRunUrl = http + "://" + dockerHost + ":" + dockerPort;
}
}
}
//string url = AppConfig.GetApp("Host", host);//"[http|https]://*:8888"
return host;
}
}
}

后续,可以创建增映像的容器时,补上环境变量即可,如图:

也可以通过命令行创建容器时,添加环境变量:

docker run -d -p 8001:80 --name=my8001 ---env dockport=8001 regcenter   //创建容器,容器外对运行端口是8001

添加多个环境变量:

docker run -d -p 8001:80 --name=my8001 ---env dockhost=192.168.1.88 ---env dockport=8001 regcenter   //创建容器,容器外对运行端口是8001

总结:

对于微服务应用程序,需要做的,就是将自身的运行地址,在程序启动之初,就发送到注册中心。

而内部启动时候核心即时读取:MicroService.Config.AppRunUrl 这个属性,其值需要在发送之前设置好即可。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. HMS Core 视频编辑服务开放模板能力,助力用户一键Get同款酷炫视频

    前言 短视频模板,是快捷创作短视频的一种方式,一般由专业设计师或模板创作人制作,用户只需替换视频模板中的部分素材,便可生成一支与模板一样的创意视频.这种省时省力.无需"烧脑"构思创 ...

  2. Vue是怎么渲染template内的标签内容的?

    我们在使用Vue做项目时,都会用到脚手架,相应的我们会在template写标签内容.那么你知道为什么会在template写标签吗?这当中经过了怎样的处理呢? <template> < ...

  3. SAP Web Dynpro-协助类

    在Web Dynpro组件中,您可以创建从抽象类继承的唯一分配的类. 协助类可以存储组件中必需的但未与布局链接的编码. 您可以将动态文本存储在协助类中,也可以在运行时合并文本,也可以将变量存储在文本池 ...

  4. Android multiple back stacks导航的几种实现

    Android multiple back stacks导航 谈谈android中多栈导航的几种实现. 什么是multiple stacks 当用户在app里切换页面时, 会需要向后回退到上一个页面, ...

  5. 简单ELK配置实现生产级别的日志采集和查询实践

    概述 生产问题 集群规模如何规划? 集群中节点角色如何规划? 集群之脑裂问题如何避免? 索引分片如何规划? 分片副本如何规划? 集群规划 准备条件 先估算当前系统的数据量和数据增长趋势情况. 现有服务 ...

  6. sql-自动增长的列

    mysql自动增长 如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长 方式1:创建表时,添加主键约束,并且完成主键自增长 create table stu( id i ...

  7. bat-命令行配置静态IP地址

    查看连接名称ipconfig 打开命令提示符,输入netsh后回车 输入interface后回车 输入ip,回车 输入set address "连接名称" static 新IP地址 ...

  8. 初识Java GUI

    1. 使用Java  Swing 显示的窗口如下 在原有代码基础上添加代码实现对窗口大小 标题等信息

  9. 活动报名 | 如何基于开源项目 Tapdata PDK,快速完成数据源和目标的开发?

      近日,Tapdata 启动 PDK 插件生态共建计划,宣布开源插件开发框架 Tapdata PDK,将自身的数据接口能力开放出来,帮助开发者根据实际需求,自助接入数据源和目标,快速开启「Data ...

  10. JavaWeb的技术体系

    客户端和服务器端的交互 browser/ server(B/S)浏览器/服务器. client/server(C/S)应用/服务器.