前言

项目地址: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开源发布的更多相关文章

  1. Zuul微服务网关

    Zuul简介:         Zuul是Netflix开源的微服务网关,它可以和Eureka.Ribbon.Hystrix等组件配合使用.Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能 ...

  2. 微服务网关Ocelot加入IdentityServer4鉴权-.NetCore(.NET5)中使用

    Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网关Ocel ...

  3. Kong 微服务网关在 Kubernetes 的实践

    来源:分布式实验室译者:qianghaohao本文主要介绍将 Kong 微服务网关作为 Kubernetes (https://www.alauda.cn)集群统一入口的最佳实践,之前写过一篇文章使用 ...

  4. 小D课堂 - 新版本微服务springcloud+Docker教程_6-01 微服务网关介绍和使用场景

    笔记 第六章 微服务网关zuul开发实战 1.微服务网关介绍和使用场景     简介:讲解网关的作用和使用场景 (画图)          1)什么是网关         API Gateway,是系 ...

  5. SpringCloud Gateway微服务网关实战与源码分析-上

    概述 定义 Spring Cloud Gateway 官网地址 https://spring.io/projects/spring-cloud-gateway/ 最新版本3.1.3 Spring Cl ...

  6. 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍

    微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...

  7. 使用 Node.js 搭建微服务网关

    目录 Node.js 是什么 安装 node.js Node.js 入门 Node.js 应用场景 npm 镜像 使用 Node.js 搭建微服务网关 什么是微服务架构 使用 Node.js 实现反向 ...

  8. 微服务网关 Spring Cloud Gateway

    1.  为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...

  9. 王院生:Apache APISIX 微服务网关极致性能架构解析

    2019 年 10 月 27 日,又拍云联合 Apache APISIX 社区举办 API 网关与高性能服务最佳实践丨Open Talk 杭州站活动,Apache APISIX PPMC 成员王院生做 ...

随机推荐

  1. OpenGL(十二) 纹理映射(贴图)

    OpenGL绘制纹理的步骤: 1. 开启纹理功能 使用glEnable(GL_TEXTURE_2D)开启2D纹理功能,使用glDisable(GL_TEXTURE_2D)关闭纹理,默认情况下纹理是关闭 ...

  2. uva 11346 - Probability(可能性)

    题目链接:uva 11346 - Probability 题目大意:给定x,y的范围.以及s,问说在该范围内选取一点,和x,y轴形成图形的面积大于s的概率. 解题思路:首先达到方程xy ≥ s.即y ...

  3. [Unity3D]Unity3D圣骑士模仿游戏开发传仙灵达到当局岛

    大家好,我是秦培.欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 在前面的文章中.我们分别实现了一个自己定义的角色控制器<[Unity3D]Unity3D游戏开 ...

  4. WPF- 模拟触发Touch Events

    原文:WPF- 模拟触发Touch Events 基于API: [DllImport("User32.dll")] public static extern bool Initia ...

  5. C# 事件详解

    1.事件的本质是什么 答:事件是委托的包装器,就像属性是字段的包装器一样 2.为什么有了委托还有有事件 委托可以被访问就可以被执行,事件则只能在类的内部执行 3.事件要怎么声明 a.明一个委托 //委 ...

  6. ubuntu Linux 操作系统安装与配置

    Ubuntu是一个以桌面应用为主的Linux操作系统.Ubuntu每六个月发布一个新版本(一般是4和10月份,命名为YY.MM),每一个普通版本都将被支持 18个月,长期支持版(Long Term S ...

  7. C、C++笔记

    2017年6月 阅读书籍<C和指针> #if 0 #endif 比注释掉代码好.(<C和指针>2017.06.07) 全局变量和全局静态变量的区别 1)全局变量是不显式用sta ...

  8. 一键彻底关闭Win10自带Windows Defender杀毒软件

    1.以管理员身份打开系统的命令提示符[cmd.exe]. 2.输入以下命令: reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\ ...

  9. ORACLE 11.2.0.4 Single To Single Data Guard 安装 physical standby

    [root@ORACLE ~]# su - oracle [oracle@ORACLE ~]$ sqlplus / as sysdba . 查看主库归档模式: SQL> select log_m ...

  10. UWP开发-获取设备唯一ID

    EasClientDeviceInformation deviceInfo = new EasClientDeviceInformation(); this.showDeviceInfo.Items. ...