关于.net core微服务的文章介绍很完整,可以参考
https://www.cnblogs.com/edisonchou/p/dotnetcore_microservice_foundation_blogs_index_final.htm
我以下写的内容是自己的学习笔记,主要是自己做了些封装,简化新项目接入流程:
一、封装了Consul服务注册类库
1、新建类库,版本.net core 3.1
2、应用包:
Consul
Microsoft.NETCore.App
Microsoft.AspNetCore.Hosting.Abstractions
Microsoft.Extensions.Hosting.Abstractions
3、注册服务类 :AppBuilderExtensions
///
/// Consul 注册服务类
///
public static class AppBuilderExtensions
{
///
/// 注册运行url
///
///
///
///
public static IWebHostBuilder RegiterUseUrls(this IWebHostBuilder applicationBuilder, string[] args)
{
string strIpAddress = "";
int intPort = 0;
foreach (var item in args)
{
if (item.Contains("ip="))
{
strIpAddress = item.Replace("--ip=", "");
}
if (item.Contains("port="))
{
intPort = int.Parse(item.Replace("--port=", ""));
}
}
if (string.IsNullOrWhiteSpace(strIpAddress))
{
//默认还是读取配置文件
strIpAddress = "localhost";
intPort = 50001;
}
else
{
applicationBuilder.UseUrls(new string[] { $"http://{strIpAddress}:{intPort}" });
}
return applicationBuilder;
}
///
///
///
///
///
///
///
public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IHostApplicationLifetime lifetime, ServiceEntity serviceEntity)
{
var consulClient = new ConsulClient(x => x.Address = new Uri($"http://{serviceEntity.ConsulIP}:{serviceEntity.ConsulPort}"));//请求注册的 Consul 地址
var httpCheck = new AgentServiceCheck()
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册
Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔
HTTP = $"http://{serviceEntity.IP}:{serviceEntity.Port}{serviceEntity.HealthUrl}",//健康检查地址
Timeout = TimeSpan.FromSeconds(5)
};
// Register service with consul
var registration = new AgentServiceRegistration()
{
Checks = new[] { httpCheck },
ID = Guid.NewGuid().ToString(),
Name = serviceEntity.ServiceName,
Address = serviceEntity.IP,
Port = serviceEntity.Port,
Tags = new[] { $"urlprefix-/{serviceEntity.ServiceName}" }//添加 urlprefix-/servicename 格式的 tag 标签,以便 Fabio 识别
};
consulClient.Agent.ServiceRegister(registration).Wait();//服务启动时注册,内部实现其实就是使用 Consul API 进行注册(HttpClient发起)
lifetime.ApplicationStopping.Register(() =>
{
consulClient.Agent.ServiceDeregister(registration.ID).Wait();//服务停止时取消注册
});
return app;
}
}
///
/// Consul 参数定义类
///
public class ServiceEntity
{
///
/// 服务运行的IP地址
///
public string IP { get; set; }
///
/// 服务运行的短裤
///
public int Port { get; set; }
///
/// 运行的服务名称
///
public string ServiceName { get; set; }
///
/// consul的服务ip地址
///
public string ConsulIP { get; set; }
///
/// consul的服务端口
///
public int ConsulPort { get; set; }
///
/// 监控检查地址
///
public string HealthUrl { get; set; } = "/Api/Health/Index";
}
二、web项目或WebApi项目引用
1、配置文件appsettings.json,新增配置
"Service": {
"Name": "net5.consul.webapi" //服务名称
},
"Consul": {
"IP": "你的IP地址",//consul服务地址
"Port": "8500"
}
2、Program.cs服务端口注册(此处主要解决部署或命令动态启动时候的ip和端口传入)
启动命令:
dotnet run --ip=你的IP地址 --port=7002
dotnet run --ip=你的IP地址 --port=7003
dotnet run --ip=你的IP地址 --port=7004
docker服务部署命令:
dotnet /app/webpai.dll --ip=192.168.3.230 --port=5727
其中的ip和port参数在程序启动时候,string[] args中接受,也会自动加载到
Configuration["ip"]和Configuration["port"]中
public IHostBuilder CreateHostBuilder(string[] args)
{
return Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup().RegiterUseUrls(args);//启动服务的ip和端口设置
});
}
3、Startup.cs中的服务注册到Consul
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime applicationLifetime)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//......其他代码省略
//applicationLifetime.ApplicationStarted.Register((Started));//程序启动时候注入
//applicationLifetime.ApplicationStopped.Register((Started));//程序停止时注入
// register Consul service
ServiceEntity serviceEntity = new ServiceEntity
{
IP = string.IsNullOrWhiteSpace(Configuration["ip"]) ? "localhost" : Configuration["ip"],//服务器IP注册,Configuration["ip"]启动时候参数传入
Port = string.IsNullOrWhiteSpace(Configuration["port"]) ? 7001 : int.Parse(Configuration["port"]),//命令行参数必须传入
ServiceName = Configuration["Service:Name"],//注册到Consul的服务名称
ConsulIP = Configuration["Consul:IP"],//Consul服务器IP
ConsulPort = Convert.ToInt32(Configuration["Consul:Port"]),//Consul服务端口
HealthUrl = "/api/Health/Get"//监控检查地址
};
app.RegisterConsul(applicationLifetime, serviceEntity);//注册到Consul
}
三、以上流程搭建完毕就可以运行(此处忽略iis启动),直接介绍命令运行
1、找到项目的文件夹,直接输入cmd
2、运行命令,需要起多个窗口输入命令
dotnet run --ip=你的IP地址 --port=5002
dotnet run --ip=你的IP地址 --port=5003
dotnet run --ip=你的IP地址 --port=5004
3、运行结果