高性能微服务网关.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 的路上更快速的前行。
如果你非常喜欢这个项目,想成为该项目的贡献者,请及时联系博主,我希望有更多的朋友加入进来,毕竟一个人维护太难了。
高性能微服务网关.NETCore客户端Kong.Net开源发布的更多相关文章
- Zuul微服务网关
Zuul简介: Zuul是Netflix开源的微服务网关,它可以和Eureka.Ribbon.Hystrix等组件配合使用.Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能 ...
- 微服务网关Ocelot加入IdentityServer4鉴权-.NetCore(.NET5)中使用
Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网关Ocel ...
- Kong 微服务网关在 Kubernetes 的实践
来源:分布式实验室译者:qianghaohao本文主要介绍将 Kong 微服务网关作为 Kubernetes (https://www.alauda.cn)集群统一入口的最佳实践,之前写过一篇文章使用 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_6-01 微服务网关介绍和使用场景
笔记 第六章 微服务网关zuul开发实战 1.微服务网关介绍和使用场景 简介:讲解网关的作用和使用场景 (画图) 1)什么是网关 API Gateway,是系 ...
- SpringCloud Gateway微服务网关实战与源码分析-上
概述 定义 Spring Cloud Gateway 官网地址 https://spring.io/projects/spring-cloud-gateway/ 最新版本3.1.3 Spring Cl ...
- 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍
微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...
- 使用 Node.js 搭建微服务网关
目录 Node.js 是什么 安装 node.js Node.js 入门 Node.js 应用场景 npm 镜像 使用 Node.js 搭建微服务网关 什么是微服务架构 使用 Node.js 实现反向 ...
- 微服务网关 Spring Cloud Gateway
1. 为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...
- 王院生:Apache APISIX 微服务网关极致性能架构解析
2019 年 10 月 27 日,又拍云联合 Apache APISIX 社区举办 API 网关与高性能服务最佳实践丨Open Talk 杭州站活动,Apache APISIX PPMC 成员王院生做 ...
随机推荐
- 常用user agent
测试user agnet的网站: http://whatsmyuseragent.com/ Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) ...
- BSD介绍
BSD许可证模板 * Copyright (c) 1998, Regents of the University of California * All rights reserved. * ...
- 我的Spring之旅(二):为请求加入參数
1.前言 在上一篇我的Spring之旅(一)中,我们仅仅是利用不带參数的请求返回一个网页或一段json,在实际的B/S.C/S网络交互中,请求中须要自己定义的參数.本篇将简单地为之前的请求加入參数. ...
- SGI STL中内存池的实现
最近这两天研究了一下SGI STL中的内存池, 网上对于这一块的讲解很多, 但是要么讲的不完整, 要么讲的不够简单(至少对于我这样的初学者来讲是这样的...), 所以接下来我将把我对于对于SGI ST ...
- windows常用cmd指令
打开命令行 1.在菜单栏中搜索命令行 2.在文件管理器的Path栏输入cmd,则在当前目录打开命令行 3.Windows+R,输入cmd,回车 ping(网络诊断工具) ping是Windows.Un ...
- EF CodeFirst的步骤
1 创建各个实体类 2 创建一个空数据模型,然后删除掉,为了引入Entity Framework和System.Data.Entity 3 为实体类增加标注 4 为实体增加导航属性 5 在App.co ...
- 【WPF】DPI对控件定位产生的影响
原文:[WPF]DPI对控件定位产生的影响 需求 程序界面上是一个Window,当用户点击桌面上除此Window之外的任何地方,都要把这个window隐藏掉.程序有个托盘图标,点击托盘图标不能隐藏wi ...
- VC中出现“烫”和“屯”的原因(栈区的每一个字节都被0xCC填充了,也就是int 3h的机器码,动态分配的堆,VC的Debug用0xCD填充堆的空间,就出现了“屯”)
相信经常用VC的朋友对屏幕输出的一大堆“烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫”不会陌生,但是也许会很奇怪,为什么会出现“烫”字呢?莫非改程序导致系统运行缓慢,发热过高???非也!下面让我解释 ...
- C#基础加强篇----委托、Lamada表达式和事件(上)
1.委托 C#的委托相当于C/C++中的函数指针.函数指针用指针获取一个函数的入口地址,实现对函数的操作. 委托与C/C++中的函数指针不同在于,委托是面向对象的,是引用类型,对委托的使用要先定义后实 ...
- 微信小程序把玩(九)scroll-view组件
原文:微信小程序把玩(九)scroll-view组件 scroll-view为滚动视图,分为水平滚动和垂直滚动.注意滚动视图垂直滚动时一定要设置高度否则的话scroll-view不会生效.滚动视图常用 ...