高性能微服務網關.NETCore客戶端Kong.Net開源發佈

来源:https://www.cnblogs.com/viter/archive/2019/07/08/11142940.html
-Advertisement-
Play Games

擁抱開源的腳步,我們從來都是一直在路上;.NETCore作為後起之秀,帶給我們太多的驚喜和感動;但是也正是由於年輕,.NETCore 的生態還是不夠完善,這就非常需要我們社區的力量,需要大家一起參與,把開源社區好的工具、組件、應用接入到 .NETCore 應用中。 ...


前言

項目地址:https://github.com/lianggx/Kong.Net

你的支持使我們更加強大,請單擊 star 讓更多的 .NETCore 認識它。

擁抱開源的腳步,我們從來都是一直在路上;.NETCore作為後起之秀,帶給我們太多的驚喜和感動;但是也正是由於年輕,.NETCore 的生態還是不夠完善,這就非常需要我們社區的力量,需要大家一起參與,把開源社區好的工具、組件、應用接入到 .NETCore 應用中。

他山之石,可以攻玉!

在很多時候,我們想要在項目中引入高性能開源網關 Kong 的時候,苦於沒有 .NETCore 客戶端而放棄,Nuget 倉庫曾經有一個 .NETFramework 版本的客戶端,但是已經年久失修了,可見開源項目的維護極其不易。

Kong 是什麼?

Github 地址:https://github.com/Kong/kong

Kong 的 Logo 是金剛,是一個支持雲原生應用的高性能網關,於 2015 年開源,其核心價值在於高性能和可擴展性,Kong 的貢獻值高達 151 人,目前為止共有 5073 次代碼提交記錄,976 個關註,22353 個 star 和 2736 個fork;Kong 的有點非常多,特別是其基於 lua 編寫,性能卓越,且具有平臺無關性,還有豐富的第三方插件,以及用戶體驗良好的的儀錶盤操作界面(Konga另一個開源作品),可以說,Kong 具備了一個優秀網關的所必須的所有能力,支持 docker 部署,使用 postgresql 進行數據持久化,高可擴展性,可輕鬆升級為服務網格方案,REST API 訪問,非常靈活的接入控制方式。

技術選型

Consul

我是由於在最近的技術選型中瞭解到 Kong 的,在此之前,我曾經考慮過 Nginx+Consul 方案(詳情見我的博客),對 Consul 也進行了深入的瞭解和測試,但是由於 Consul 始終只是一個服務發現的組件,不具備網關能力,且維護複雜(腳本維護),雖然在 .NETCore 下接入非常的方便,但是還是只能放棄了。

Spring-cloud

也考察了 Spring-cloud Gateway,Spring 大法好,特別是阿裡的 Nacos 的支持和跟進,使得 Spring 占據了80%的江山(不知道我是否高估了),而且搭建 Spring Gateway 的步驟非常簡單,一個小白,只要花2天時間,就能快速的搭建出一個 Spring-cloud Gateway,Java 的生態真的是讓人垂涎欲滴,沒辦法,慣性太大了。同時,由於 Spring-cloud Gateway 的 .NetCore 客戶端不提供(廢話來的,人家是玩 Java 的),所以從成本上考慮,也得放棄。

kong

終於還是選擇了 Kong,Kong 的平臺無關性和設計良好的 REST API ,讓我們有機會快速的接入到這款高性能的網關中,我個人開發 Kong.Net 這款客戶端,用時 3 天,REST API 共有 81 個 API,支持Kong:latest最新版本為1.2.x。

Kong.Net

項目結構

項目結構比較簡單,就是一個標準的開源框架的樣子,包含了 examples、src、test 三大塊的內容,其中 src 包含兩個項目 Kong/Kong.Extensions,單元測試一共有 80 個,已全部測試通過。

使用 Kong.Net

在 .NETCore 項目中使用 Kont.Net 非常簡單,只需要在項目中進行 Nuget 包的引用即可,截止本文發文時,版本號為 Kong.Net-0.0.4。為了更方便的使用 Kong.Net ,建議同時引用 Kong.Extension-0.0.4 包,擴展包封裝了一些初始化配置信息,比如健康檢查路徑和響應,非常方便。

完全基於 .NetCore ,目前依賴 Json.Net

在配置文件中加入以下配置,以初始化客戶端

"kong": {
    "host": "http://10.23.11.1:8001",
    "upstream": {
      "tags": [ "example", "low-priority" ],
      "name": "Kong.Example",
      "hash_on": "none",
      "healthchecks": {
        "active": {
          "unhealthy": {
            "http_statuses": [ 429, 500, 501, 502, 503, 504, 505 ],
            "tcp_failures": 1,
            "timeouts": 1,
            "http_failures": 1,
            "interval": 5
          },
          "type": "http",
          "http_path": "/kong/healthchecks",
          "timeout": 1,
          "healthy": {
            "successes": 1,
            "interval": 5,
            "http_statuses": [ 200, 302 ]
          },
          "https_verify_certificate": true,
          "concurrency": 1
        },
        "passive": {
          "unhealthy": {
            "http_statuses": [ 429, 500, 501, 502, 503, 504, 505 ]
          },
          "healthy": {
            "http_statuses": [ 200, 302 ]
          },
          "type": "http"
        }
      },
      "hash_on_cookie_path": "/",
      "hash_fallback": "none",
      "slots": 10000
    },
    "target": {
      "tags": [ "example", "low-priority" ],
      "target": "192.168.1.10:5200",
      "weight": 100
    }
  }

*註意:配置節點 kong.target.target 這個值就是要註冊到 Kong 網關的地址,如果配置了,這個過程是自動的,否則需要手動指定客戶端地址
上面的配置,和 Kong 內部的 UpStream 完全一致,在Kong 中怎麼配置 UpStream ,在 Kong.Net 中就怎麼配置,欄位名稱和類型完全平移。

修改 startup.cs 服務註入和配置

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<KongClient>(fat =>
    {
        var options = new KongClientOptions(HttpClientFactory.Create(), this.Configuration["kong:host"]);
        var client = new KongClient(options);
        return client;
    });
    ...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, KongClient kongClient)
{
    app.UseKong(Configuration, kongClient);
    ...
}

到這裡就配置完成,可以啟動了。

自定義啟動

如果需要在系統啟動的時候動態的傳入服務地址,參考下麵的代碼

修改Program.cs為外部參數啟動

 public static IWebHostBuilder CreateWebHostBuilder(string[] args)
 {
     var config = new ConfigurationBuilder().AddCommandLine(args).Build();
     var url = config["server.urls"];

     return WebHost.CreateDefaultBuilder(args)
           .UseStartup<Startup>()
           .UseUrls(url);
 }

獲得命令行傳入的參數配置 --server.urls

 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
 public void Configure(IApplicationBuilder app, IHostingEnvironment env, KongClient kongClient)
 {
     UseKong(app, kongClient);
    ...
 }

 public void UseKong(IApplicationBuilder app, KongClient kongClient)
 {
     var upStream = Configuration.GetSection("kong:upstream").Get<UpStream>();
     var target = Configuration.GetSection("kong:target").Get<TargetInfo>();
     var uri = new Uri(Configuration["server.urls"]);
     target.Target = uri.Authority;
     app.UseKong(kongClient, upStream, target);
 }

到這裡,就大功告成了

啟動項目,完成服務自動註冊、健康檢查

輸入命令

dotnet run --server.urls http://172.16.10.227:5200

上面綠色輸出部分,表示服務註冊成功,藍色部分,表示 Kong 正在執行對 Kong.Net 客戶端的檢查,從運行情況來看,已經完美運行成功了。

健康檢查

使用 Kong.Extensions 客戶端擴展包,內部自動將健康檢查地址設置為:/kong/healthchecks,然後在內部自動應答,其代碼實現為:

private static IApplicationBuilder UseKongHealthChecks(this IApplicationBuilder app, UpStream upStream)
{
    app.Map(upStream.HealthChecks.Active.Http_path, s =>
    {
        s.Run(async context =>
        {
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("Healthchecks at: {0}", DateTime.Now);
            Console.ForegroundColor = ConsoleColor.Gray;
            await context.Response.WriteAsync("ok");
        });
    });
    return app;
}

結束語

擁抱開源的腳步,我們從來都是一直在路上;.NETCore作為後起之秀,帶給我們太多的驚喜和感動;但是也正是由於年輕,.NETCore 的生態還是不夠完善,這就非常需要我們社區的力量,需要大家一起參與,把開源社區好的工具、組件、應用接入到 .NETCore 應用中。

項目地址:https://github.com/lianggx/Kong.Net
你的支持使我們更加強大,點擊 star 讓更多的 .NETCore 認識它,從而能在 .NETCore 的路上更快速的前行。

如果你非常喜歡這個項目,想成為該項目的貢獻者,請及時聯繫博主,我希望有更多的朋友加入進來,畢竟一個人維護太難了。


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

-Advertisement-
Play Games
更多相關文章
  • for迴圈和while迴圈的區別 使用區別:如果你想在迴圈結束後,繼續使用控制條件的那個變數,用while迴圈,否則用for迴圈。不知道用for迴圈。 因為變數及早的從記憶體中消失,可以提高記憶體的使用效率。 其實還有一種場景的理解: 如果是一個範圍的,用for迴圈非常明確。 如果是不明確要做多少次,用 ...
  • 引子 上一節中我們知道GIL鎖將導致CPython中多線程無法並行執行,只能併發的執行。 而併發實現的原理是切換+保存,那就意味著使用多線程實現併發,就需要為每一個任務創建一個線程,必然增加了線程創建銷毀與切換的帶來的開銷 明顯的問題就是,高併發情況下,由於任務數量太多導致無法開啟新的線程,使得即沒 ...
  • 本文是一篇《Java 8實戰》的閱讀筆記,閱讀大約需要5分鐘。 有點標題黨,但是這確實是我最近使用Lambda表達式的感受。設計模式是過去的一些好的經驗和套路的總結,但是好的語言特性可以讓開發者不去考慮這些設計模式。面向對象常見的設計模式有策略模式、模板方法、觀察者模式、責任鏈模式以及工廠模式,使用 ...
  • 最近遇到一個問題,就是要對一個vector的變數設置空的參數預設值,剛開始寫NULL,發現不行,後來再網上查了一下,可以通過在外部設置一個變數,來為它賦值為空 運行結果: ...
  • 一、Scala環境基礎 Scala對Java相關的類,介面進行了包裝,所以依賴Jvm環境。 二、配置Scala解壓版 1)註意路徑無空格和中文 2)配置環境變數 添加到path目錄 3)檢測是否安裝 配置成功,沒錯就是這麼簡單。 3、配置Idea開發 1)插件安裝,就是點點點 2)新建兩個maven ...
  • 問題描述: 假設需要生成前N個自然數的一個隨機置換。例如,{4,3,1,5,2}和{3,1,4,2,5}就是合法的置換,但{5,4,1,2,1}卻不是,因為數1出現兩次而數3卻沒有。這個程式常常用於模擬一些演算法。我們假設存在一個隨機數生成器RandInt(i,j),它以相同的概率生成i和j之間的一個 ...
  • 捕捉信號 Go // 運行此程式,控制台將列印"Waiting for signal" // 按Ctrl + C 發送信號以關閉程式,將發生中斷 // 隨後控制台依次列印"Signal .."、"Exiting..." package main import ( "os" "os/signal" " ...
  • 客戶端與服務端多功能傳輸小程式 server.py ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...