31

高性能微服务网关.NETCore客户端Kong.Net开源发布 - Ron.Liang

 4 years ago
source link: https://www.cnblogs.com/viter/p/11142940.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

项目地址: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 的平台无关性和设计良好的 REST API ,让我们有机会快速的接入到这款高性能的网关中,我个人开发 Kong.Net 这款客户端,用时 3 天,REST API 共有 81 个 API,支持Kong:latest最新版本为1.2.x。

Kong.Net

26882-20190706154025834-1826196443.png

项目结构比较简单,就是一个标准的开源框架的样子,包含了 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 包,扩展包封装了一些初始化配置信息,比如健康检查路径和响应,非常方便。

26882-20190706154032313-874376732.png

完全基于 .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 的路上更快速的前行。

如果你非常喜欢这个项目,想成为该项目的贡献者,请及时联系博主,我希望有更多的朋友加入进来,毕竟一个人维护太难了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK