實用接地氣的 .NET 微服務框架

来源:https://www.cnblogs.com/1312mn/p/18381195
-Advertisement-
Play Games

前言 微服務架構已經成為搭建高效、可擴展系統的關鍵技術之一,然而,現有許多微服務框架往往過於複雜,使得我們普通開發者難以快速上手並體驗到微服務帶了的便利。為瞭解決這一問題,於是作者精心打造了一款最接地氣的 .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.UIWing微服務框架中的一個可視化操作管理系統,主要功能有服務治理、配置中心、APM管理、Saga分散式事務查詢。

安裝依賴包

安裝服務註冊nuget包Wing.Consul,UI可視化界面管理nuget包Wing.UI,選擇對應的資料庫驅動(參考FreeSql官網),以SqlServer為例,安裝FreeSql.Provider.SqlServer

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);

查看運行效果

程式運行後,瀏覽器訪問 ,運行效果如下圖:

可以看到示例 1.2 註入的服務`Wing.Demo_1.2

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();

運行效果

運行當前程式並啟動示例 1.3,瀏覽器訪問 ,可以看到註入的Grpc服務Wing.Demo_1.4,運行效果如下圖:

在示例 1.2 中調用當前Grpc服務中SayHello方法,代碼如下:

[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;
    });
}

運行示例 1.2,瀏覽器訪問 http://localhost:1210/weatherforecast/hello ,運行效果如下圖:

4、啟動服務網關

服務網關是系統對外的唯一入口,它封裝了系統內部架構,為每個客戶端提供了定製的API,所有的客戶端和消費端都通過統一的網關接入微服務,在網關層處理所有非業務功能。

安裝依賴包

安裝服務註冊nuget包Wing.Consul,服務網關nuget包Wing.Gateway,選擇對應的資料庫驅動(參考FreeSql官網open in new window),以SqlServer為例,安裝FreeSql.Provider.SqlServer,請求日誌支持本地消息隊列和分散式消息隊列進行非同步持久化,基本上不影響網關性能。如果不想記錄請求日誌,可以不安裝該包。

如果想啟用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
    }
  }
}

查看運行效果

運行示例 1.2 並啟動當前示常式序,瀏覽器訪問,運行效果如下圖:

運行示例 1.3,瀏覽器訪問,可以看到網關請求日誌,運行效果如下圖:

服務地址組成

請求服務地址預設是{網關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技術匠] 社區,與其他熱愛技術的同行一起交流心得,共同成長!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
  • 先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...