高性能微服务网关.NETCore客户端Kong.Net开源发布
前言
項(xiàng)目地址:https://github.com/lianggx/Kong.Net
你的支持使我們更加強(qiáng)大,請單擊 star 讓更多的 .NETCore 認(rèn)識它。
擁抱開源的腳步,我們從來都是一直在路上;.NETCore作為后起之秀,帶給我們太多的驚喜和感動;但是也正是由于年輕,.NETCore 的生態(tài)還是不夠完善,這就非常需要我們社區(qū)的力量,需要大家一起參與,把開源社區(qū)好的工具、組件、應(yīng)用接入到 .NETCore 應(yīng)用中。
他山之石,可以攻玉!
在很多時候,我們想要在項(xiàng)目中引入高性能開源網(wǎng)關(guān) Kong 的時候,苦于沒有 .NETCore 客戶端而放棄,Nuget 倉庫曾經(jīng)有一個 .NETFramework 版本的客戶端,但是已經(jīng)年久失修了,可見開源項(xiàng)目的維護(hù)極其不易。
Kong 是什么?
Github 地址:https://github.com/Kong/kong
Kong 的 Logo 是金剛,是一個支持云原生應(yīng)用的高性能網(wǎng)關(guān),于 2015 年開源,其核心價值在于高性能和可擴(kuò)展性,Kong 的貢獻(xiàn)值高達(dá) 151 人,目前為止共有 5073 次代碼提交記錄,976 個關(guān)注,22353 個 star 和 2736 個fork;Kong 的有點(diǎn)非常多,特別是其基于 lua 編寫,性能卓越,且具有平臺無關(guān)性,還有豐富的第三方插件,以及用戶體驗(yàn)良好的的儀表盤操作界面(Konga另一個開源作品),可以說,Kong 具備了一個優(yōu)秀網(wǎng)關(guān)的所必須的所有能力,支持 docker 部署,使用 postgresql 進(jìn)行數(shù)據(jù)持久化,高可擴(kuò)展性,可輕松升級為服務(wù)網(wǎng)格方案,REST API 訪問,非常靈活的接入控制方式。
技術(shù)選型
Consul
我是由于在最近的技術(shù)選型中了解到 Kong 的,在此之前,我曾經(jīng)考慮過 Nginx+Consul 方案(詳情見我的博客),對 Consul 也進(jìn)行了深入的了解和測試,但是由于 Consul 始終只是一個服務(wù)發(fā)現(xiàn)的組件,不具備網(wǎng)關(guān)能力,且維護(hù)復(fù)雜(腳本維護(hù)),雖然在 .NETCore 下接入非常的方便,但是還是只能放棄了。
Spring-cloud
也考察了 Spring-cloud Gateway,Spring 大法好,特別是阿里的 Nacos 的支持和跟進(jìn),使得 Spring 占據(jù)了80%的江山(不知道我是否高估了),而且搭建 Spring Gateway 的步驟非常簡單,一個小白,只要花2天時間,就能快速的搭建出一個 Spring-cloud Gateway,Java 的生態(tài)真的是讓人垂涎欲滴,沒辦法,慣性太大了。同時,由于 Spring-cloud Gateway 的 .NetCore 客戶端不提供(廢話來的,人家是玩 Java 的),所以從成本上考慮,也得放棄。
kong
終于還是選擇了 Kong,Kong 的平臺無關(guān)性和設(shè)計(jì)良好的 REST API ,讓我們有機(jī)會快速的接入到這款高性能的網(wǎng)關(guān)中,我個人開發(fā) Kong.Net 這款客戶端,用時 3 天,REST API 共有 81 個 API,支持Kong:latest最新版本為1.2.x。
Kong.Net
項(xiàng)目結(jié)構(gòu)
項(xiàng)目結(jié)構(gòu)比較簡單,就是一個標(biāo)準(zhǔn)的開源框架的樣子,包含了 examples、src、test 三大塊的內(nèi)容,其中 src 包含兩個項(xiàng)目 Kong/Kong.Extensions,單元測試一共有 80 個,已全部測試通過。
使用 Kong.Net
在 .NETCore 項(xiàng)目中使用 Kont.Net 非常簡單,只需要在項(xiàng)目中進(jìn)行 Nuget 包的引用即可,截止本文發(fā)文時,版本號為 Kong.Net-0.0.4。為了更方便的使用 Kong.Net ,建議同時引用 Kong.Extension-0.0.4 包,擴(kuò)展包封裝了一些初始化配置信息,比如健康檢查路徑和響應(yīng),非常方便。
完全基于 .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 } }*注意:配置節(jié)點(diǎn) kong.target.target 這個值就是要注冊到 Kong 網(wǎng)關(guān)的地址,如果配置了,這個過程是自動的,否則需要手動指定客戶端地址 上面的配置,和 Kong 內(nèi)部的 UpStream 完全一致,在Kong 中怎么配置 UpStream ,在 Kong.Net 中就怎么配置,字段名稱和類型完全平移。
修改 startup.cs 服務(wù)注入和配置
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); ... }到這里就配置完成,可以啟動了。
自定義啟動
如果需要在系統(tǒng)啟動的時候動態(tài)的傳入服務(wù)地址,參考下面的代碼
修改Program.cs為外部參數(shù)啟動
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); }獲得命令行傳入的參數(shù)配置 --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); }到這里,就大功告成了
啟動項(xiàng)目,完成服務(wù)自動注冊、健康檢查
輸入命令
dotnet run --server.urls http://172.16.10.227:5200上面綠色輸出部分,表示服務(wù)注冊成功,藍(lán)色部分,表示 Kong 正在執(zhí)行對 Kong.Net 客戶端的檢查,從運(yùn)行情況來看,已經(jīng)完美運(yùn)行成功了。
健康檢查
使用 Kong.Extensions 客戶端擴(kuò)展包,內(nèi)部自動將健康檢查地址設(shè)置為:/kong/healthchecks,然后在內(nèi)部自動應(yīng)答,其代碼實(shí)現(xiàn)為:
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; }結(jié)束語
擁抱開源的腳步,我們從來都是一直在路上;.NETCore作為后起之秀,帶給我們太多的驚喜和感動;但是也正是由于年輕,.NETCore 的生態(tài)還是不夠完善,這就非常需要我們社區(qū)的力量,需要大家一起參與,把開源社區(qū)好的工具、組件、應(yīng)用接入到 .NETCore 應(yīng)用中。
項(xiàng)目地址:https://github.com/lianggx/Kong.Net 你的支持使我們更加強(qiáng)大,點(diǎn)擊 star 讓更多的 .NETCore 認(rèn)識它,從而能在 .NETCore 的路上更快速的前行。
如果你非常喜歡這個項(xiàng)目,想成為該項(xiàng)目的貢獻(xiàn)者,請及時聯(lián)系博主,我希望有更多的朋友加入進(jìn)來,畢竟一個人維護(hù)太難了。
總結(jié)
以上是生活随笔為你收集整理的高性能微服务网关.NETCore客户端Kong.Net开源发布的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 小白开学Asp.Net Core 《五》
- 下一篇: 使用Jenkins部署.Net Core
