前言

项目地址: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. C# 比较不错的通用验证码

    1 using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging ...

  2. 圆周卷积(circular convolution)

    1. 定义与概念 圆周卷积也叫循环卷积, 2. 实现(matlab) 以圆周的形式卷积两个信号: >> z = ifft(fft(x).*fft(y));

  3. WCF学习目录

    WCF 基本 WCF概念 WCF配置文件详解 多个不同类对象传输思路 WCF 大文件传输配置 Uri ? & = 毫秒数据字符串转换为DateTime POST请求——HttpWebReque ...

  4. npm学习(-)

    了解npm请前往https://www.npmjs.cn/getting-started/what-is-npm/ npm 由三个独立的部分组成: 网站 注册表(registry) 命令行工具 (CL ...

  5. JS 扩展方法prototype

    通过类对象的prototype设置扩展方法,下面为String对象增加quote(两边加字符)方法 <script type="text/javascript"> St ...

  6. VisualSVN5.1.7补丁原创发布

    VisualSVN5.1.7补丁原创发布 一切尽在发布中.

  7. centos7安装 lamp

    1.安装apache yum install httpd #根据提示,输入Y安装即可成功安装 systemctl start httpd.service #启动apache systemctl sto ...

  8. xcode缓存清理

    移除对旧设备的支持 影响:可重新生成:再连接旧设备调试时,会重新自动生成. 路径: ~/Library/Developer/Xcode/iOS DeviceSupport 如果你不是在wb145230 ...

  9. Sequence Models and Long-Short Term Memory Networks

    LSTM’s in Pytorch Example: An LSTM for Part-of-Speech Tagging Exercise: Augmenting the LSTM part-of- ...

  10. ADO.NET基础开发

    ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveX Data Objects的缩写.ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供了一个面向对象的数据访问架构, ...