高性能微服务网关.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
在配置文件中加入以下配置,以初始化客户端
"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 的路上更快速的前行。
如果你非常喜欢这个项目,想成为该项目的贡献者,请及时联系博主,我希望有更多的朋友加入进来,毕竟一个人维护太难了。
下一篇: 百度网盘全新升级:视觉风格大变