实用接地气的 .NET 微服务框架
1.
微服务架构已经成为搭建高效、可扩展系统的关键技术之一,现有许多微服务框架往往过于复杂,使得我们普通开发者难以快速上手并体验到微服务带了的便利。为了解决这一问题,于是作者精心打造了一款最接地气的 .NET 微服务框架,帮助我们轻松构建和管理微服务应用。
本框架不仅支持 Consul 服务注册与发现,还自带了一系列高级特性,包括配置中心、链路跟踪(APM)、服务网关等,极大地简化了微服务的开发和运维过程。
此外框架还实现了 Saga 分布式事务、RabbitMQ 事件总线等功能,确保系统能够高效处理复杂的业务逻辑。更重要的是提供了一个人性化的 Dashboard 管理面板,使得监控和管理微服务集群变得方便。
通过本文的介绍大家可以学习到如何快速上手并充分利用这些特性,从而构建出既高效又稳定的微服务应用。
2. 项目介绍
Wing 致力于打造一个功能强大且易于使用的 .NET 微服务框架,支持 .NET 6+ 运行平台。
该框架具备以下特点:
1、服务注册与发现:支持 Consul 服务注册与发现机制,确保服务间的自动发现和动态管理。
2、服务间通讯:支持 HTTP 和 gRPC 两种调用方式,内置负载均衡器,实现高效的服务间通信。
3、服务策略与异常处理:提供服务策略配置,支持服务异常降级处理,确保系统的稳定性和可靠性。
4、Saga 分布式事务:支持三种恢复策略(向前恢复、向后恢复、先前再后),确保事务的一致性和完整性。
5、配置中心:内置配置中心,实现服务配置的在线集中统一管理。
6、链路追踪与性能监控:支持 HTTP/gRPC/SQL 的链路追踪(APM)及耗时分析统计,帮助开发者快速定位性能瓶颈。
7、服务网关:内置服务网关,支持全局服务策略和个性化服务策略配置,简化服务入口管理。
8、事件总线:支持 RabbitMQ 事件总线,实现服务间的异步通信和事件传递。
9、管理界面:提供人性化的 Dashboard 管理界面,便于监控和管理整个微服务集群。
Wing 框架为开发者提供一个强大而直观的开发平台,帮助快速构建和管理高效、可扩展的微服务应用。

3. 快速入门
3.1 1、服务注册
什么是服务注册?
服务注册是指服务启动后将该服务的IP、端口等信息注册到Consul。
创建一个Web API 项目
提前准备:安装并启动Consul
打开 Visual Studio 2022 并创建Web API项目
安装依赖包
dotnet add package Wing.Consul
Program代码
builder.Services.AddWing();
添加配置
{ // 是否启用配置中心,默认启用
"ConfigCenterEnabled": false, "Consul": { "Url": "http://localhost:8500", "Service": { //Http Grpc
"Option": "Http", "HealthCheck": { "Url": "http://localhost:1210/health", //单位:秒
"Timeout": 10, //单位:秒
"Interval": 10
}, "Name": "Wing.Demo_1.2.1", "Host": "localhost", "Port": 1210, "Tag": "", "LoadBalancer": { //RoundRobin WeightRoundRobin LeastConnection
"Option": "WeightRoundRobin", //权重
"Weight": 60
}, "Scheme": "http", "Developer": "linguicheng"
}, //定时同步数据时间间隔,单位:秒 小于等于0表示立即响应
"Interval": 10, //数据中心
"DataCenter": "dc1", //等待时间,单位:分钟
"WaitTime": 3
}
}查看运行效果
程序运行后,打开consul UI管理界面,可以看到注册服务Wing.Demo_1.2,具体如下图所示:

3.2 2、启动UI
Wing.UI是Wing微服务框架中的一个可视化操作管理系统,主要功能有服务治理、配置中心、APM管理、Saga分布式事务查询。
安装依赖包
安装服务注册nuget包Wing.Consul,UI可视化界面管理nuget包Wing.UI,选择对应的数据库驱动(
dotnet add package Wing.UI dotnet add package FreeSql.Provider.SqlServer
Program代码
using Wing;var builder = WebApplication.CreateBuilder(args); builder.Host.AddWing(builder => builder.AddConsul()); builder.Services.AddWing().AddWingUI(FreeSql.DataType.SqlServer);
查看运行效果
程序运行后,浏览器访问 ,运行效果如下图:

可以看到示例

3.3 3、服务发现与调用
什么是服务发现?
服务发现是指服务启动后将服务注册信息定时同步刷新到本地或实时获取Consul的服务信息。
安装依赖包
dotnet add package Wing.Consul
Grpc健康检查
protobuf文件
syntax = "proto3";
package grpc.health.v1;
message HealthCheckRequest {
string service = 1;
}
message HealthCheckResponse {
enum ServingStatus {
UNKNOWN = 0;
SERVING = 1;
NOT_SERVING = 2;
}
ServingStatus status = 1;
}
service Health {
rpc Check(HealthCheckRequest) returns (HealthCheckResponse);
rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
}HealthCheck代码
public class HealthCheck : Health.HealthBase
{ public override Task Check(HealthCheckRequest request, ServerCallContext context)
{ return Task.FromResult(new HealthCheckResponse() { Status = HealthCheckResponse.Types.ServingStatus.Serving });
} public override async Task Watch(HealthCheckRequest request, IServerStreamWriter responseStream, ServerCallContext context)
{ await responseStream.WriteAsync(new HealthCheckResponse()
{ Status = HealthCheckResponse.Types.ServingStatus.Serving });
}
} Program代码
using Wing;var builder = WebApplication.CreateBuilder(args); builder.Host.AddWing(builder => builder.AddConsul());// Add services to the container.builder.Services.AddGrpc(); builder.Services.AddWing();var app = builder.Build();// Configure the HTTP request pipeline.app.MapGrpcService(); app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); app.Run();
运行效果
运行当前程序并启动示例

在示例
[HttpGet("hello")]public Task SayHello()
{ return _serviceFactory.InvokeAsync("Wing.Demo_1.4", async serviceAddr =>
{ var channel = GrpcChannel.ForAddress(serviceAddr.ToString()); var greeterClient = new Greeter.GreeterClient(channel); var result = await greeterClient.SayHelloAsync(new HelloRequest { Name = "Wing" }); return result.Message;
});
} 运行示例

3.4 4、启动服务网关
服务网关是系统对外的唯一入口,它封装了系统内部架构,为每个客户端提供了定制的API,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有非业务功能。
安装依赖包
安装服务注册nuget包Wing.Consul,服务网关nuget包Wing.Gateway,选择对应的数据库驱动(
如果想启用EventBus记录请求日志,需要安装RabbitMQ nuget包Wing.RabbitMQ。
dotnet add package Wing.Consul dotnet add package Wing.Gateway dotnet add package Wing.RabbitMQ dotnet add package FreeSql.Provider.SqlServer
Program代码
using Wing;var builder = WebApplication.CreateBuilder(args); builder.Host.AddWing(builder => builder.AddConsul());// Add services to the container.builder.Services.AddControllers(); builder.Services.AddWing() .AddPersistence(FreeSql.DataType.SqlServer) .AddGateWay() .AddEventBus();// 如果不想使用EventBus记录请求日志,可以删除此行代码var app = builder.Build();// Configure the HTTP request pipeline.app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
添加配置
{ // 是否启用配置中心,默认启用
"ConfigCenterEnabled": false, "Consul": { "Url": "http://localhost:8500", "Service": { //Http Grpc
"Option": "Http", "HealthCheck": { "Url": "http://localhost:1510/health", //单位:秒
"Timeout": 10, //单位:秒
"Interval": 10
}, "Name": "Wing.Demo_1.5", "Host": "localhost", "Port": 1510, "LoadBalancer": { //RoundRobin WeightRoundRobin LeastConnection
"Option": "WeightRoundRobin", //权重
"Weight": 50
}, "Scheme": "http", "Developer": "linguicheng"
}, //定时同步数据时间间隔,单位:秒 小于等于0表示立即响应
"Interval": 10, //数据中心
"DataCenter": "dc1", //等待时间,单位:分钟
"WaitTime": 3
}, "ConnectionStrings": { "Wing": "Data Source=192.168.56.96;User Id=sa;Password=wing123.;Initial Catalog=Wing;TrustServerCertificate=true;Pooling=true;Min Pool Size=1"
}, //自动同步实体结构到数据库
"UseAutoSyncStructure": true, // 如果不启用EventBus,可以删除RabbitMQ配置
"RabbitMQ": { "HostName": "192.168.56.99", "UserName": "admin", "Password": "admin", "VirtualHost": "/", "Port": 5672, //消息过期时间,单位:毫秒,过期会自动路由到死信队列,小于或等于0则永久有效
"MessageTTL": 0, "ExchangeName": "Sample.GateWay", //每次投递消息数量
"PrefetchCount": 1
}, "Gateway": { // 请求日志
"Log": { // 是否启用网关日志记录
"IsEnabled": true, // 是否启用事件总线(RabbitMQ)存储日志,生产环境推荐启用,可以提升程序的性能
"UseEventBus": false
}
}
}查看运行效果
运行示例

运行示例

服务地址组成
请求服务地址默认是{网关IP或域名}/{服务名}/{服务路由},例如:http://localhost:1510/Wing.Demo_1.2/weatherforecast
注意:更多具体内容可以访问Wing 官方文档,具体内容如下所示

提示:在享受本文内容的同时,请注意版权归属 徐州鑫坤机电设备有限公司https://www.xzxkjd.com如果您觉得有价值欢迎分享,但请务必注明出处,感谢您的理解,谢谢!
以下部分内容需要登录查看 立即登录
相关内容
- 实用接地气的 .NET 微服务框架
- 供需裂口持续扩大:2025年铜价暴涨,产业链如何应对?
- 铜,新时代的“石油”?2025年价格狂飙背后的战略博弈
- 从能源革命到智能时代:2025铜价暴涨背后的全球新逻辑
- 铜价创历史新高!绿色转型与供需失衡背后的财富浪潮
- 2025铜价为何一飞冲天?三大核心驱动力深度解析
- 上海非急救出租服务全解析
- 深耕中考复读赛道 深圳深才教育为复读生搭建升学桥梁
- 阳光下的童年:那些被温暖照亮的纯真时光
- 群晖DSM7.0-7.21监控套件Surveillance Station 9.20-11289开心版60个许可证设置教程(无重启、无断流、无卡死、史上最完美)
- 云服务器+SD-WAN组网和域名DNS解析
- 在云主机上安装iKuai OS,实现SD-WAN组网,利用云主机80;443端口搭建企业网站。个人博客。让云主机当做你的堡垒机,实现数据本地化。
简体中文
繁體中文
English
Nederlands
Français
Русский язык
Polski
日本語
ภาษาไทย
Deutsch
Português
español
Italiano
한어
Suomalainen
Gaeilge
dansk
Tiếng Việt
Pilipino
Ελληνικά
Maori
tongan
ᐃᓄᒃᑎᑐᑦ
ଓଡିଆ
Malagasy
Norge
bosanski
नेपालीName
čeština
فارسی
हिंदी
Kiswahili
ÍslandName
ગુજરાતી
Slovenská
היברית
ಕನ್ನಡ್Name
Magyar
தாமில்
بالعربية
বাংলা
Azərbaycan
lifiava
IndonesiaName
Lietuva
Malti
català
latviešu
УкраїнськаName
Cymraeg
ກະຣຸນາ
తెలుగుQFontDatabase
Română
Kreyòl ayisyen
Svenska
հայերեն
ဗာရမ်
پښتوName
Kurdî
Türkçe
български
Malay
मराठीName
eesti keel
മലമാലം
slovenščina
اوردو
አማርኛ
ਪੰਜਾਬੀName
albanian
Hrvatski
Suid-Afrikaanse Dutch taal
ខ្មែរKCharselect unicode block name





