項目地址:https://github.com/lianggx/Kong.Netgit
你的支持使咱們更增強大,請單擊 star 讓更多的 .NETCore 認識它。github
擁抱開源的腳步,咱們歷來都是一直在路上;.NETCore做爲後起之秀,帶給咱們太多的驚喜和感動;可是也正是因爲年輕,.NETCore 的生態仍是不夠完善,這就很是須要咱們社區的力量,須要你們一塊兒參與,把開源社區好的工具、組件、應用接入到 .NETCore 應用中。spring
他山之石,能夠攻玉!sql
在不少時候,咱們想要在項目中引入高性能開源網關 Kong 的時候,苦於沒有 .NETCore 客戶端而放棄,Nuget 倉庫曾經有一個 .NETFramework 版本的客戶端,可是已經年久失修了,可見開源項目的維護極其不易。docker
Github 地址:https://github.com/Kong/kongcookie
Kong 的 Logo 是金剛,是一個支持雲原生應用的高性能網關,於 2015 年開源,其核心價值在於高性能和可擴展性,Kong 的貢獻值高達 151 人,目前爲止共有 5073 次代碼提交記錄,976 個關注,22353 個 star 和 2736 個fork;Kong 的有點很是多,特別是其基於 lua 編寫,性能卓越,且具備平臺無關性,還有豐富的第三方插件,以及用戶體驗良好的的儀表盤操做界面(Konga另外一個開源做品),能夠說,Kong 具有了一個優秀網關的所必須的全部能力,支持 docker 部署,使用 postgresql 進行數據持久化,高可擴展性,可輕鬆升級爲服務網格方案,REST API 訪問,很是靈活的接入控制方式。app
我是因爲在最近的技術選型中瞭解到 Kong 的,在此以前,我曾經考慮過 Nginx+Consul 方案(詳情見個人博客),對 Consul 也進行了深刻的瞭解和測試,可是因爲 Consul 始終只是一個服務發現的組件,不具有網關能力,且維護複雜(腳本維護),雖然在 .NETCore 下接入很是的方便,可是仍是隻能放棄了。框架
也考察了 Spring-cloud Gateway,Spring 大法好,特別是阿里的 Nacos 的支持和跟進,使得 Spring 佔據了80%的江山(不知道我是否高估了),並且搭建 Spring Gateway 的步驟很是簡單,一個小白,只要花2天時間,就能快速的搭建出一個 Spring-cloud Gateway,Java 的生態真的是讓人垂涎欲滴,沒辦法,慣性太大了。同時,因爲 Spring-cloud Gateway 的 .NetCore 客戶端不提供(廢話來的,人家是玩 Java 的),因此從成本上考慮,也得放棄。async
終於仍是選擇了 Kong,Kong 的平臺無關性和設計良好的 REST API ,讓咱們有機會快速的接入到這款高性能的網關中,我我的開發 Kong.Net 這款客戶端,用時 3 天,REST API 共有 81 個 API,支持Kong:latest最新版本爲1.2.x。tcp
項目結構比較簡單,就是一個標準的開源框架的樣子,包含了 examples、src、test 三大塊的內容,其中 src 包含兩個項目 Kong/Kong.Extensions,單元測試一共有 80 個,已所有測試經過。
在 .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 中就怎麼配置,字段名稱和類型徹底平移。
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); ... }
到這裏就配置完成,能夠啓動了。
若是須要在系統啓動的時候動態的傳入服務地址,參考下面的代碼
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); }
// 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 的路上更快速的前行。
若是你很是喜歡這個項目,想成爲該項目的貢獻者,請及時聯繫博主,我但願有更多的朋友加入進來,畢竟一我的維護太難了。