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

高性能微服务网关.NETCore客户端Kong.Net开源发布前言项目地址:https://github.com/lianggx/Kong.Net你的支持使我们更加强大,请单击star让更多的.NETCore认识它。拥抱开源的脚步,我们从来都是一直

大家好,又见面了,我是你们的朋友全栈君。

前言

项目地址: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

项目结构

<span role="heading" aria-level="2">高性能微服务网关.NETCore客户端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 包,扩展包封装了一些初始化配置信息,比如健康检查路径和响应,非常方便。

<span role="heading" aria-level="2">高性能微服务网关.NETCore客户端Kong.Net开源发布

完全基于 .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

<span role="heading" aria-level="2">高性能微服务网关.NETCore客户端Kong.Net开源发布

上面绿色输出部分,表示服务注册成功,蓝色部分,表示 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 的路上更快速的前行。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155184.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IIS7.5配置防盗链

    IIS7.5配置防盗链首先,要下载、安装一个IIS重写模块。是到微软站点下载的,可以放心了。(靠,之前以为IIS7是内置了的,想不到还是要另外安装东西)64位:http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=1b8c7bd8-8824-4408-b8fc-49dc7f951a0032位:http://www.microsoft.com/…

    2022年7月23日
    8
  • leetcode-42接雨水「建议收藏」

    leetcode-42接雨水「建议收藏」题目链接给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例 2:输入:height = [4,2,0,3,2,5]输出:9 提示:n == height.length0 <= n &lt

    2022年8月9日
    2
  • rsync服务的三种模式测试[通俗易懂]

    rsync服务的三种模式测试[通俗易懂]目录1什么是rsync1.1rsync简介rsync特性1.3rsync的企业工作场景说明2rsync三种模式:2.1rsync常用参数选项2.2rsync本地模式2.3rsyncshell模式2.4rsyncdaemon模式3rsync服务故障模拟4rsync多模块实战5rsync排除及无差异同步实战6rsync优缺点6….

    2022年10月13日
    0
  • linux中iostat命令_linux运维和网络运维

    linux中iostat命令_linux运维和网络运维Linux系统中的iostat是I/Ostatistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。……………

    2022年10月6日
    0
  • srm 534

    srm 534

    2022年1月27日
    40
  • 菜鸟的mybatis实战教程

    菜鸟的mybatis实战教程菜鸟的mybatis实战教程说明一、mybatis简介二、mybatis简单入门(1)数据库创建(2)创建springboot项目(3)增删改查操作(4)总结说明之前学习了mybatis之后没有做记录,在前几天做一个题库系统时,刚好要用到mybatis,因为之前做东西时用的jpa,mybatis没怎么去用,导致有些知识点想不起来,在使用mybatis出现了一些低级的错误,现将mybatis的学习笔记记录在这里,以便日后查看,本文会持续更新,不断地扩充本文仅为记录学习轨迹,如有侵权,联系删除一、myb

    2022年5月16日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号