.Net Core微服務入門全紀錄(完結)——Ocelot與Swagger

来源:https://www.cnblogs.com/xhznl/archive/2020/07/16/13305767.html
-Advertisement-
Play Games

Tips:本篇已加入系列文章閱讀目錄,可點擊查看更多相關文章。 前言 上一篇【.Net Core微服務入門全紀錄(八)——Docker Compose與容器網路】完成了docker-compose.yml文件的編寫,最後使用docker compose的一個up指令即可在docker中運行整個複雜的 ...


Tips:本篇已加入系列文章閱讀目錄,可點擊查看更多相關文章。

前言

上一篇【.Net Core微服務入門全紀錄(八)——Docker Compose與容器網路】完成了docker-compose.yml文件的編寫,最後使用docker compose的一個up指令即可在docker中運行整個複雜的環境。本篇簡單介紹一下Ocelot與Swagger的集成,方便在網關項目中統一查看各個服務的api文檔。

開始

首先,網關項目,服務項目 NuGet安裝Swashbuckle.AspNetCore

服務項目

Order.API項目Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "Order API", Version = "v1", Description = "# order service api..." });
        // Set the comments path for the Swagger JSON and UI.
        var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
        var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
        c.IncludeXmlComments(xmlPath);
        c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
        {
            Description = "在下框中輸入請求頭中需要添加Jwt授權Token:Bearer Token",
            Name = "Authorization",
            In = ParameterLocation.Header,
            Type = SecuritySchemeType.ApiKey,
            BearerFormat = "JWT",
            Scheme = "Bearer"
        });

        c.AddSecurityRequirement(new OpenApiSecurityRequirement
        {
            {
                new OpenApiSecurityScheme{
                    Reference = new OpenApiReference {
                        Type = ReferenceType.SecurityScheme,
                        Id = "Bearer"}
                },new string[] { }
            }
        });
    });

    services.AddControllers();

    ......
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime, OrderContext orderContext)
{
    ......

    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "Order API V1");
    });

    app.UseRouting();

    ......
}

打開項目文件Order.API.csproj,添加生成文檔的配置,swagger要用到:

<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);1591</NoWarn>

Product.API項目也是類似的修改,就不貼了。

網關項目

然後是Ocelot網關項目的Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1",
            new OpenApiInfo {Title = "Gateway API", Version = "v1", Description = "# gateway api..."});
    });

    services.AddControllers();

    ......
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/order/swagger/v1/swagger.json", "Order API V1");
        c.SwaggerEndpoint("/product/swagger/v1/swagger.json", "Product API V1");
    });

    //設置Ocelot中間件
    app.UseOcelot().Wait();
}

ocelot.json配置文件,Routes節點下增加2個路由配置,不做授權,限流,熔斷等限制:

{
  "DownstreamPathTemplate": "/swagger/v1/swagger.json",
  "DownstreamScheme": "http",
  "UpstreamPathTemplate": "/product/swagger/v1/swagger.json",
  "UpstreamHttpMethod": [ "Get" ],
  "ServiceName": "ProductService",
  "LoadBalancerOptions": {
    "Type": "RoundRobin"
  }
},
{
  "DownstreamPathTemplate": "/swagger/v1/swagger.json",
  "DownstreamScheme": "http",
  "UpstreamPathTemplate": "/order/swagger/v1/swagger.json",
  "UpstreamHttpMethod": [ "Get" ],
  "ServiceName": "OrderService",
  "LoadBalancerOptions": {
    "Type": "RoundRobin"
  }
}

運行測試

使用docker-compose build:

build完成後啟動:

瀏覽器訪問網關項目:http://localhost:9070/swagger

介面測試:

此時因為沒有授權所以返回401,為了方便獲取token,我在IDS4.AuthCenter項目增加了一個客戶端配置:

new Client
{
    ClientId = "postman client",
    ClientName = "Postman Client",

    AllowedGrantTypes = GrantTypes.ClientCredentials,
    ClientSecrets = { new Secret("postman client secret".Sha256()) },

    AllowedScopes = new [] {"orderApiScope", "productApiScope"},
}

使用postman獲取token:

拿到token填入文本框,格式是Bearer xxxxxx,註意空格。這裡的提示文字亂碼了,應該是在docker中運行的原因,這個不影響先不管他。

填入token後再次請求介面,就可以正常返回了:

至此,Ocelot與Swagger的集成就完成了。本篇內容比較簡單,swagger應該大部分人都用過。

最後

這個系列博客就到此結束了,本來也就是入門級別的。再往後可能就是更深入的服務治理,比如日誌、監控、鏈路追蹤等;服務的持續集成、持續部署;容器編排(k8s);服務網格(Service Mesh)等等。。。這些都不屬於入門的範圍了。

當然,不是每個公司都適合k8s,也不是每個項目都要做微服務。為了盲目推崇某個技術而去使用它時,它便失去了原本的價值。技術本不分高低,適合自己的就是最好的。感謝關註我的小伙伴們。。。


推薦幾個學習入口:
https://space.bilibili.com/361469957/
https://space.bilibili.com/431596483/
https://github.com/dotnet-architecture/eShopOnContainers
https://docs.microsoft.com/


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

-Advertisement-
Play Games
更多相關文章
  • Xunit.DependencyInjection 7.0 發佈了 Intro 上次我們已經介紹過一次大師的 Xunit.DependencyInjection https://www.cnblogs.com/weihanli/p/xuint-dependency-injection.html ,最 ...
  • 工作上什麼不順的bug就記錄在這吧。。。。。。 1,空異常會常常考慮到,但是這裡容易報一個序列不包含任何元素異常,假如dt沒有行。 dt.AsEnumerable().Max(row => row[column].ToString().Length); ...
  • ViewFaceCore 0.2 超簡單的 C# 人臉識別庫 前言: 首先謝謝大家對這個庫的關註,前一篇博文得到了大家的 支持 和 Star,十分開心。本想儘快實現大家的期待的活體檢測功能,但是前段時間太忙了,是在抱歉!!! ⭐、GitHub & Important 本次更新的內容在 antispo ...
  • 本文介紹如何通過C# 和VB.NET代碼實現在Word文檔中添加條碼和二維碼。代碼中將分為在Word正文段落中、頁眉頁腳中等情況來添加。 使用工具:Free Spire.Office for .NET (免費版) 工具簡介:這是Spire所有.NET平臺下免費產品的集合包,包含Spire.Barco ...
  • DateTime,就是一個世界的大融合。 日期和時間,在我們開發中非常重要。DateTime在C#中,專門用來表達和處理日期和時間。 本文算是多年使用DateTime的一個總結,包括DateTime對象的整體應用,以及如何處理不同的區域、時區、格式等內容。 一、什麼是DateTime 跟我們想的不一 ...
  • ASP.NET中 params 是關鍵字,可以指定在參數數目可變處採用參數的方法參數。在函數的參數數目可變而執行的代碼差異很小的時候很有用! 在方法聲明中的 params 關鍵字之後不允許任何其他參數,並且在方法聲明中只允許一個 params 關鍵字。 形式為:方法修飾符 返回類型 方法名(para ...
  • When working with Web applications, use a context instance per request. Install-Package EntityFramework -Version using System.Data.Entity; public clas ...
  • 這是系列文章中的第一篇:使用GraphvizOnline可視化ASP.NETCore3.0終結點。. 第1部分-使用DOT語言來可視化你的ASP.NETCore3.0終結點(本文) 第2部分-向ASP.NET Core應用程式添加終結點圖 第3部分-使用ImpromptuInterface創建一個自 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...