三、网关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.rpmkong安装
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