實用接地氣的 .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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...