前面也介绍了,微服务架构中,为了解决自动注册服务与发现,可以采用Consul。
Consul+Ocelot可以注册服务网关+服务注册,请参考我前面的文章。
本篇简单介绍下另外一种方式kong的服务注册。
Kong 是在客户端和(微)服务间转发API通信的API网关,通过插件扩展功能。Kong 有两个主要组件:
1、Kong Server :基于nginx的服务器,用来接收 API 请求。
2、Apache Cassandra:用来存储操作数据。
打开官网,我们可以看到kong支持很多种部署方式,因为我机器是win10的,并没有直接支持的,但是win10也是支持Docker的,所以选择第一种Docker部署.

官方网址:https://konghq.com/
电脑上以及安装了docker,这里就不介绍怎么安装docker了,linux,windows等安装方式各有不同,官方都有文档。直接进入主题吧
安装
创建kong-net网络
docker network create kong-net
安装postgres数据库
docker run -d --name kong-database --network=kong-net -p 5432:5432 -e "POSTGRES_USER=kong" -e "POSTGRES_DB=kong" -e "POSTGRES_PASSWORD=kong" postgres:9.6
初始化kong数据库
docker run --rm --network=kong-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" kong:0.13.1-centos kong migrations up
启动kong
docker run -d --name kong --network=kong-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" -e "KONG_PROXY_ERROR_LOG=/dev/stderr" -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" -p 8000:8000 -p 8443:8443 -p 8001:8001 -p 8444:8444 kong:2.0
测试 在powershell中输入命令curl -uri http://localhost:8001,结果如下:
>curl -uri http://localhost:8001
StatusCode : 200
StatusDescription : OK
Content : {"plugins":{"enabled_in_cluster":[],"available_on_server":{"correlation-id":true,"pre-function":true,"cors":true,"ldap-auth":true,"loggly":true,"hmac-
auth":true,"zipkin":true,"request-size-limiting":t...
RawContent : HTTP/1.1 200 OK
Connection: keep-alive
Access-Control-Allow-Origin: *
X-Kong-Admin-Latency: 115
Content-Length: 8700
Content-Type: application/json; charset=utf-8
Date: Tue, 19 May 2020 03:35:18...
Forms : {}
Headers : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [X-Kong-Admin-Latency, 115], [Content-Length, 8700]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 8700
说明kong启动是成功的。
UI界面管理
有两者选择
kong-dashboard
konga
网上说konga比较好,只是工具而已,所以并没有过多的去对比两者的区别,知道怎么用就可以了,就不纠结,直接用konga。konga:https://github.com/pantsel/konga
启动Konga
docker run -p 1337:1337 --network kong-net --name konga -e "NODE_ENV=production" pantsel/konga
成功之后打开浏览器,输入http://localhost:1337
选择左边Connections,创建一个连接,输入kong的实际地址,如下图所示:

点击Active按钮,如果连接成功的话,可以看到左边API GATEWAY多了很多菜单。

新建Asp.NET Core API项目
安装依赖包

Program
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseUrls("http://*:5000")
.UseStartup<Startup>();
});
配置文件中加上kong配置
"kong": {
"host": "http://localhost:8001",
"upstream": {
"tags": [ "webservice01", "low-priority" ],
"name": "Kong.webservice01",
"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": "/api/health",
"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": [ "webservice01", "low-priority" ],
"target": "192.168.10.134:5000",
"weight": 100
}
}
修改Startup中ConfigureServices,Configure方法, 目前ip和port是写死的,只是为了测试。
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;
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,KongClient kongClient)
{
var upStream = Configuration.GetSection("kong:upstream").Get<UpStream>();
var target = Configuration.GetSection("kong:target").Get<TargetInfo>();
var uri = new Uri("http://192.168.10.134:5000");
target.Target = uri.Authority;
app.UseKong(kongClient, upStream, target);
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Health健康检查接口
[Route("api/[controller]")]
[ApiController]
public class HealthController : ControllerBase
{
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "result", "ok" };
}
}
启动项目

可以看到注册成功了,并且kong服务端一直向客户端发送心跳请求。
打开konga管理界面

点击Name可以看到明细信息

Kong 中最诱人的一个特性是可以通过插件扩展已有功能,这些插件在 API 请求响应循环的生命周期中被执行。插件使用 Lua 编写,而且Kong还有如下几个基础功能:HTTP 基本认证、密钥认证、CORS( Cross-origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API 请求限流、请求转发以及 nginx 监控。
微信识别二维码关注





