前言 微服務架構已經成為搭建高效、可擴展系統的關鍵技術之一,然而,現有許多微服務框架往往過於複雜,使得我們普通開發者難以快速上手並體驗到微服務帶了的便利。為瞭解決這一問題,於是作者精心打造了一款最接地氣的 .NET 微服務框架,幫助我們輕鬆構建和管理微服務應用。 本框架不僅支持 Consul 服務註 ...
微服務架構已經成為搭建高效、可擴展系統的關鍵技術之一,然而,現有許多微服務框架往往過於複雜,使得我們普通開發者難以快速上手並體驗到微服務帶了的便利。為瞭解決這一問題,於是作者精心打造了一款最接地氣的 .NET 微服務框架,幫助我們輕鬆構建和管理微服務應用。
本框架不僅支持 Consul 服務註冊與發現,還自帶了一系列高級特性,包括配置中心、鏈路跟蹤(APM)、服務網關等,極大地簡化了微服務的開發和運維過程。
此外框架還實現了 Saga 分散式事務、RabbitMQ 事件匯流排等功能,確保系統能夠高效處理複雜的業務邏輯。更重要的是提供了一個人性化的 Dashboard 管理面板,使得監控和管理微服務集群變得方便。
通過本文的介紹大家可以學習到如何快速上手並充分利用這些特性,從而構建出既高效又穩定的微服務應用。
項目介紹
Wing 致力於打造一個功能強大且易於使用的 .NET 微服務框架,支持 .NET 6+ 運行平臺。
該框架具備以下特點:
1、服務註冊與發現:支持 Consul 服務註冊與發現機制,確保服務間的自動發現和動態管理。
2、服務間通訊:支持 HTTP 和 gRPC 兩種調用方式,內置負載均衡器,實現高效的服務間通信。
3、服務策略與異常處理:提供服務策略配置,支持服務異常降級處理,確保系統的穩定性和可靠性。
4、Saga 分散式事務:支持三種恢復策略(向前恢復、向後恢復、先前再後),確保事務的一致性和完整性。
5、配置中心:內置配置中心,實現服務配置的線上集中統一管理。
6、鏈路追蹤與性能監控:支持 HTTP/gRPC/SQL 的鏈路追蹤(APM)及耗時分析統計,幫助開發者快速定位性能瓶頸。
7、服務網關:內置服務網關,支持全局服務策略和個性化服務策略配置,簡化服務入口管理。
8、事件匯流排:支持 RabbitMQ 事件匯流排,實現服務間的非同步通信和事件傳遞。
9、管理界面:提供人性化的 Dashboard 管理界面,便於監控和管理整個微服務集群。
Wing 框架為開發者提供一個強大而直觀的開發平臺,幫助快速構建和管理高效、可擴展的微服務應用。
快速入門
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
,具體如下圖所示:
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、服務發現與調用
什麼是服務發現?
服務發現是指服務啟動後將服務註冊信息定時同步刷新到本地或實時獲取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<HealthCheckResponse> Check(HealthCheckRequest request, ServerCallContext context) { return Task.FromResult(new HealthCheckResponse() { Status = HealthCheckResponse.Types.ServingStatus.Serving }); } public override async Task Watch(HealthCheckRequest request, IServerStreamWriter<HealthCheckResponse> 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<GreeterService>(); 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<string> 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; }); }
運行示例
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 官方文檔,具體內容如下所示
項目地址
Github:https://linguicheng.github.io/Wing
Gitee:https://gitee.com/linguicheng/Wing
文檔地址:https://linguicheng.github.io/Wing
示例地址:https://gitee.com/linguicheng/wing-demo
開源協議:基於MIT協議永久開源免費使用
如果你覺得這篇文章對你有幫助,不妨點個贊支持一下!你的支持是我繼續分享知識的動力。如果有任何疑問或需要進一步的幫助,歡迎隨時留言。
也可以加入微信公眾號[DotNet技術匠] 社區,與其他熱愛技術的同行一起交流心得,共同成長!