歡迎光臨
每天分享高質量文章

高效能微服務閘道器.NETCore客戶端Kong.Net開源釋出

前言

專案地址: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

在配置檔案中加入以下配置,以初始化客戶端

  1. "kong": {
  2. "host": "http://10.23.11.1:8001",
  3. "upstream": {
  4. "tags": [ "example", "low-priority" ],
  5. "name": "Kong.Example",
  6. "hash_on": "none",
  7. "healthchecks": {
  8. "active": {
  9. "unhealthy": {
  10. "http_statuses": [ 429, 500, 501, 502, 503, 504, 505 ],
  11. "tcp_failures": 1,
  12. "timeouts": 1,
  13. "http_failures": 1,
  14. "interval": 5
  15. },
  16. "type": "http",
  17. "http_path": "/kong/healthchecks",
  18. "timeout": 1,
  19. "healthy": {
  20. "successes": 1,
  21. "interval": 5,
  22. "http_statuses": [ 200, 302 ]
  23. },
  24. "https_verify_certificate": true,
  25. "concurrency": 1
  26. },
  27. "passive": {
  28. "unhealthy": {
  29. "http_statuses": [ 429, 500, 501, 502, 503, 504, 505 ]
  30. },
  31. "healthy": {
  32. "http_statuses": [ 200, 302 ]
  33. },
  34. "type": "http"
  35. }
  36. },
  37. "hash_on_cookie_path": "/",
  38. "hash_fallback": "none",
  39. "slots": 10000
  40. },
  41. "target": {
  42. "tags": [ "example", "low-priority" ],
  43. "target": "192.168.1.10:5200",
  44. "weight": 100
  45. }
  46. }

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

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

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddSingleton<KongClient>(fat =>
  4. {
  5. var options = new KongClientOptions(HttpClientFactory.Create(), this.Configuration["kong:host"]);
  6. var client = new KongClient(options);
  7. return client;
  8. });
  9. ...
  10. }
  11. public void Configure(IApplicationBuilder app, IHostingEnvironment env, KongClient kongClient)
  12. {
  13. app.UseKong(Configuration, kongClient);
  14. ...
  15. }

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

自定義啟動

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

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

  1. public static IWebHostBuilder CreateWebHostBuilder(string[] args)
  2. {
  3. var config = new ConfigurationBuilder().AddCommandLine(args).Build();
  4. var url = config["server.urls"];
  5.  
  6. return WebHost.CreateDefaultBuilder(args)
  7. .UseStartup<Startup>()
  8. .UseUrls(url);
  9. }

獲得命令列傳入的引數配置 –server.urls

  1. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  2. public void Configure(IApplicationBuilder app, IHostingEnvironment env, KongClient kongClient)
  3. {
  4. UseKong(app, kongClient);
  5. ...
  6. }
  7.  
  8. public void UseKong(IApplicationBuilder app, KongClient kongClient)
  9. {
  10. var upStream = Configuration.GetSection("kong:upstream").Get<UpStream>();
  11. var target = Configuration.GetSection("kong:target").Get<TargetInfo>();
  12. var uri = new Uri(Configuration["server.urls"]);
  13. target.Target = uri.Authority;
  14. app.UseKong(kongClient, upStream, target);
  15. }

到這裡,就大功告成了

啟動專案,完成服務自動註冊、健康檢查

輸入命令

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

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

健康檢查

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

  1. private static IApplicationBuilder UseKongHealthChecks(this IApplicationBuilder app, UpStream upStream)
  2. {
  3. app.Map(upStream.HealthChecks.Active.Http_path, s =>
  4. {
  5. s.Run(async context =>
  6. {
  7. Console.ForegroundColor = ConsoleColor.Blue;
  8. Console.WriteLine("Healthchecks at: {0}", DateTime.Now);
  9. Console.ForegroundColor = ConsoleColor.Gray;
  10. await context.Response.WriteAsync("ok");
  11. });
  12. });
  13. return app;
  14. }

結束語

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

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

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

已同步到看一看
贊(0)

分享創造快樂