其他分享
首页 > 其他分享> > 三、网关kong的基本使用(整合了consul+fabio)

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

作者:互联网

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