项目地址: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 的路上更快速的前行。
若是你很是喜欢这个项目,想成为该项目的贡献者,请及时联系博主,我但愿有更多的朋友加入进来,毕竟一我的维护太难了。