AspNetCore微服务下的网关-Kong(一)

Kong是Mashape开源的高性能高可用API网关和API服务管理层。它基于OpenResty,进行API管理,并提供了插件实现API的AOP。Kong在Mashape 管理了超过15,000 个API,为200,000开发者提供了每个月数十亿的请求支持。本文将从架构、API管理、插件三个层面介绍Kong。node

架构

按照康威定律,咱们系统架构会拆的很散,系统由一堆服务组成,以下图所示:
image.png
库存服务、优惠券服务、价格服务时以前都会作一些特殊处理,如限流、黑白名单,日志、请求统计。而这些处理几乎是全部服务都须要的,这不就是咱们常说的AOP嘛,当咱们服务多起来的时候,应该将这些通用处理集中到一个地方进行管理,以下图所示:
image.png
和下图有点类似:
image.pngnginx

1.为何要用Kong做为NetCore下的API网关?

1.开源,云原生(Cloud-Native),ServiceMesh,快速,弹性,RESTful还有分布式微服务的抽象层
2.基于NGINX构建的网关,拥有更高的性能,而且在2015开源
3.活跃的社区,在github上有111个Contributors,修复bug迅速,基本每3个月一个版本
4.支持插件化,目前支持的插件有32个,包含受权,安全,限流,Serverless,分析和监控,转换,日志。
5.支持企业版本和社区版本git

架构预览

基于OpenResty(Nginx & Lua Scripting)

image.png

上图很清晰的看见Kong的架构图,以Nginx做为基础, OpenResty构建RESTful,支持集群和数据库存储数据,插件化,还有支持用RESTful来管理端。github

集群架构预览

image.png
这里讲下Kong的集群原理吧,Kong在0.11.0版本以前用的是serf来作集群的,那么为何不用serf作集群呢?开发者给出的理由以下:
1.依赖serf,serf并不属于Nginx/OpenResty
2.这种依赖相互间通讯来同步的机制对于deployment和容器化都有些不便
3.在运行的Kong节点触发serf须要一些阻塞的I/O
0.11.0版本的实现思路是以数据库为中心,增长一个cluster events的表,任何Kong node均可以向数据库发送变动消息,其余节点轮训数据库改动,而后更新缓存内容,若是有节点重启连上数据库节点就能够工做了。web

Kong的安装

Kong的安装方式支持不少主流的平台,目前不支持Windows,支持的安装方式以下:
image.pngdocker

Kong的安装,为了方便我这里就使用docker安装了
1.建立专属kong的网络(docker的最佳实践)--link 过期了啊
docker network create kong-net
2.选择你使用的数据库,默认使用的是PostgreSQL
若是你使用的是Cassandra数据库:
提示下:Cassandra >=3.0
docker run -d --name kong-database \ --network=kong-net \ -p 9042:9042 \ cassandra:3
若是你使用的是PostgreSQL
docker run -d --name kong-database \ --network=kong-net \ -p 5432:5432 \ -e "POSTGRES_USER=kong" \ -e "POSTGRES_DB=kong" \ postgres:9.6
3.数据库迁移,初始化库表结构:数据库

docker run --rm \
    --network=kong-net \
    -e "KONG_DATABASE=postgres" \
    -e "KONG_PG_HOST=kong-database" \
    -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
    kong:latest kong migrations up

4.启动kongnpm

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:latest

5.看网关有没有启动
在本机 curl -i http://localhost:8001/,或者用浏览器访问8001端口。若是出来一大堆json,表示成功json

以AspNetCore为例子访问

mkdir AspNetCore

cd AspNetCore

dotnet new webapi

dotnet run

咱们以netcore作的api为例子访问localhost:5000/api/values,前面网关搭建起来了,而且支持RESTful,如今有开源的dashboard,咱们就用KongDashboard来演示,如何构造搭建和访问。api

# 全局安装kong-dashboard
npm install -g kong-dashboard

# 启动 kong-dashboard
kong-dashboard start --kong-url http://localhost:8001

# 启动kong-dashboard,而且自定义端口
kong-dashboard start \
  --kong-url http://kong:8001 \
  --port [port]

# 启动kong-dashboard而且启动基础认证
kong-dashboard start \
  --kong-url http://kong:8001 \
  --basic-auth user1=password1 user2=password2

# 看kong-dashboard 启动参数
kong-dashboard start --help

启动成功后用浏览器打开localhost:8080以下图所示:
image.png

那么咱们增长一个NetCoreAPI,在DashBoard,如图所示:
image.png

由于是GET请求,那我咱们用浏览器访问,浏览器 -> 网关 -> NetCore程序。
打开浏览器直接访问http://localhost:8000/api/values,返回["value1","value2"]则表明正常。
以下图所示:
image.png

最后,AspNetCore微服务下的网关-Kong系列,后面会继续更新,会讲解到Kong的插件的使用,插件的开发,使用的一些坑,网关性能分析和日志可视化,源码解析等,欢迎你们关注个人github: https://github.com/WithLin

相关文章
相关标签/搜索