暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Kong安装部署&ASP.NET Core服务注册

码农游乐场 2021-09-08
1662

前面也介绍了,微服务架构中,为了解决自动注册服务与发现,可以采用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等安装方式各有不同,官方都有文档。直接进入主题吧

安装

  1. 创建kong-net网络

docker network create kong-net

  1. 安装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

  1. 初始化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


  1. 启动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

  1. 测试 在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

  1. 启动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 监控。


微信识别二维码关注

文章转载自码农游乐场,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论