ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

三、网关kong的基本使用(整合了consul+fabio)

2022-07-17 10:35:02  阅读:353  来源: 互联网

标签:网关 null target consul fabio Kong item var kong


kong简介?

  Kong是一个运行在 Nginx 中的 Lua 应用程序。Kong 网关与OpenResty一起分发,OpenResty是一组扩展lua-nginx-module 的模块。kong可以很轻松扩展功能,模块化,可以运行在任何基础设施上。为什么我们微服务都要用网关呢?很简单,我们拆分服务后,会产生许多服务调用地址,难道我们需要调用哪个写哪个地址?这是其一,如果我们需要为服务做限流,熔断等功能的时候又要去每个服务中做一遍?那么这个时候我们就需要统一一个入口,通过统一的入口处理相应的需求;那目前网关种类非常多,Spring Cloud Gateway,apisix,kong,Ocelot等。

 

 

Kong的几个常用作用

  动态负载平衡:跨多个上游服务对流量进行负载平衡。
  熔断器:智能跟踪不健康的上游服务。
  监视:实时监视提供关键的负载和性能服务器指标。
  限流:可安装kong提供的插件,限制流量输入。
  认证:HMAC,JWT,基本等
  OAuth2.0:轻松将OAuth2.0身份验证添加到您的API。

kong 术语

  Route:是请求的转发规则,按照Hostname和PATH,将请求转发给Service。
  Services:是多个Upstream的集合,是Route的转发目标。
  Consumer:是API的用户,里面记录用户的一些信息。
  Plugin:是插件,plugin可以是全局的,绑定到Service,绑定到Router,绑定到Consumer。
  Certificate:是https证书。
  Sni:是域名与Certificate的绑定,指定了一个域名对应的https证书。
  Upstream:是负载均衡策略。
  Target:是最终处理请求的Backend服务。

  kong的工作流程

Kong默认开放的端口
  接收客户端流量的端口,proxy 部分
  :8000 —— http 端口
  :8443 —— https 端口
  admin API 端口,admin 部分
  :8001 —— http 端口
  :8444 —— https 端口

kong 安装遇到的问题

  1.使用docker安装后,如果对网络不熟悉,开启dns_resolver,会直接报错,导致无法运行,原因是设置后替换了docker的dns导致无法连接上数据库引起的

  2.使用doker安装postgres 12的版本,出现了无法导入数据脚本问题,原因没找到,但可降低版本解决

  3.安装kong后,对于初学者来说最好把管理界面一起安装,我安装的是konga

//安装postgres
docker run -d --name kong-database \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kong" \
postgres:9.6

//导入数据
docker run --rm \
 -e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=119.29.92.184" \
-e "KONG_PG_PASSWORD=kong" \
-e "POSTGRES_USER=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
 kong/kong-gateway:2.8.1.1-alpine kong migrations bootstrap

//安装kong
 curl -Lo kong-enterprise-edition-2.8.1.1.rpm $(rpm --eval "https://download.konghq.com/gateway-2.x-centos-%{centos_ver}/Packages/k/kong-enterprise-edition-2.8.1.1.el%{centos_ver}.noarch.rpm")

 sudo yum install kong-enterprise-edition-2.8.1.1.rpm
kong安装
docker run -d -p 1337:1337 --name konga pantsel/konga
安装konga

动态负载

进入konga管理界面也可使用RESTful API进行配置,把routes,services,upstreams,target配置上即可,接着通过8000端口访问

限流设置

  配置限流,只需要找到对应插件,设置即可

 

整合kong+consul+fabio

  前面已经安装了consul+fabio的使用,现在我们来做kong的结合使用

 1 /// <summary>
 2         /// 路由注册到kong;
 3         /// </summary>
 4         /// <param name="services"></param>
 5         /// <returns></returns>
 6         public static IServiceCollection RouteRegistToKong(this IServiceCollection services)
 7         {
 8             if (!Convert.ToBoolean( AppHelper.ReadAppSettings("Kong", "Disable")))
 9             {
10                 var konghost = AppHelper.ReadAppSettings("Kong", "Host") ?? throw new ArgumentNullException("Kong:Host cannot be null or empty!");
11 
12                 var options = new KongClientOptions(HttpClientFactory.Create(), konghost);
13                 var client = new KongClient(options);
14                 services.AddSingleton<KongClient>(client);
15                 
16                 var upStream = AppHelper.ReadAppSettingT<UpStream>("Kong", "Upstream"); 
17                 var target = AppHelper.ReadAppSettingT<TargetInfo>("Kong", "Target"); //负载均衡,健康检测使用
18 
19                 if (upStream.Name != null && target.Tags != null)
20                 {
21                     upStream.Created_at = DateTime.Now;
22                     upStream = client.UpStream.UpdateOrCreate(upStream).Result;
23 
24                     target.Target = $"{PassportConfig.GetHealthHost()}:{PassportConfig.GetCurrentPort()}";
25                     target.Id = PassportTools.GuidFromString($"{Dns.GetHostName()}{target.Target}");
26                     target.Created_at = DateTime.Now;
27                     target.UpStream = new TargetInfo.UpStreamId { Id = upStream.Id.Value };
28                     client.Target.Add(target).Wait();
29 
30                     PassportConsole.Success($"[Kong]UpStream registered:{upStream.Name} Target:{target.Target}");
31 
32                     // app.UseKongHealthChecks(upStream, onExecuter);
33                 }
34                 var kongServices = AppHelper.ReadAppSettings<ServiceInfo>("Kong", "Services");
35                 var kongRoutes = AppHelper.ReadAppSettings<RouteInfo>("Kong", "Routes"); 
36 
37                 if (kongServices?.Count > 0 == true)
38                 {
39                     foreach (var item in kongServices)
40                     {
41                         item.Updated_at = DateTime.Now;
42                         item.Path = string.IsNullOrWhiteSpace(item.Path) ? null : item.Path;
43                         client.Service.UpdateOrCreate(item).Wait();
44                         PassportConsole.Success($"[Kong]Service registered:{item.Name}");
45                     }
46                 }
47 
48                 if (kongRoutes?.Count > 0 == true)
49                 {
50                     foreach (var item in kongRoutes)
51                     {
52                         item.Updated_at = DateTime.Now;
53                         client.Route.UpdateOrCreate(item).Wait();
54                         PassportConsole.Success($"[Kong]Route registered:{item.Name}");
55                     }
56                 }
57             }
58 
59             return services;
60         }
通过Restful API来写入kong
 "Kong": {
    //"Disable": false, //true=禁用
    "Host": "http://119.29.92.184:8001",
    "Services": [
      {
        "Id": "72e21af8-283f-44c4-a766-53de8bb35c21", //guid
        "Name": "Consultest",
        "Retries": 5,
        "Protocol": "http",
        "Host": "119.29.92.184",
        "Port": 9999,
        "Path": null,
        "Connect_timeout": 60000, //毫秒
        "Write_timeout": 60000,
        "Read_timeout": 60000,
        "Tags": null
      }
    ],
    "Routes": [
      {
        "Id": "5370e1b7-6c43-442d-9a44-23c249f958f7",
        "Name": "Consultest",
        "Protocols": [ "http" ],
        "Methods": null,
        "Hosts": null,
        "Paths": [ "/" ],
        "Https_redirect_status_code": 307,
        "Regex_priority": 0,
        "Strip_path": true,
        "Preserve_host": false,
        "Tags": null,
        "Service": {
          "Id": "72e21af8-283f-44c4-a766-53de8bb35c21" //这个id跟关联的Services的id一致
        }
      }
    ]
    
    //"Upstream": {
    //  "Id": "8efd15af-df78-422f-97a0-9072fa7e7431",
    //  "Tags": [ "exampleapi", "v1.0" ],
    //  "Name": "configupapi",
    //  "Hash_on": "none",
    //  "Healthchecks": {
    //    "Active": {
    //      "Unhealthy": {
    //        "Http_statuses": [ 429, 500, 501, 502, 503, 504, 505 ],
    //        "Tcp_failures": 1,
    //        "Timeouts": 2,
    //        "Http_failures": 1,
    //        "Interval": 5
    //      },
    //      "Type": "http",
    //      "Http_path": "/healthcheck",
    //      "Timeout": 1,
    //      "Healthy": {
    //        "Successes": 1,
    //        "Interval": 20,
    //        "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, 201, 302 ]
    //      },
    //      "Type": "http"
    //    }
    //  },
    //  "Hash_on_cookie_path": "/",
    //  "Hash_fallback": "none",
    //  "Slots": 10000
    //},
    //"Target": {
    //  "Tags": [ "exampleapi", "v1.0" ],
    //  "Weight": 100
    //}
  }
appsettings.json设置

  上面的步骤已经设置完成了,那我们来看看效果

 

  

 

总结

  kong使用起来还是非常简单易上手的,对于个性化的功能,我们还可以使用lua来编写相关功能相当方便,上面我们可以不使用fabio,可以使用kong的动态负载均衡,但kong的动态负载均衡不会自动调用注册中心,但可以重新编写插件来解决;

 

标签:网关,null,target,consul,fabio,Kong,item,var,kong
来源: https://www.cnblogs.com/weirun/p/16485659.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有