Kong学习笔记

本文参考网址:https://www.jianshu.com/p/a68e45bcadb6 https://www.cnkirito.moe/kong-introduction/
Kong 集成 Jwt 插件 https://www.cnkirito.moe/kong-jwt/
图左,在旧的服务治理体系之下,鉴权,限流,日志,监控等通用功能需要在每个服务中单独实现,这使得系统维护者没有一个全局的视图来统一管理这些功能。API 网关致力于解决的问题便是为微服务纳管这些通用的功能,在此基础上提高系统的可扩展性。如右图所示,微服务搭配上 API 网关,可以使得服务本身更专注于自己的领域,很好地对服务调用者和服务提供者做了隔离。
我们称SpringCloud的Zuul和Gateway为组件或者框架,而Kong则是称得上产品的东西。对比下Zuul和Kong。

举例而言,如果选择使用 Zuul,当需要为应用添加限流功能,由于 Zuul 只提供了基本的路由功能,开发者需要自己研发 Zuul Filter,可能你觉得一个功能还并不麻烦,但如果在此基础上对 Zuul 提出更多的要求,很遗憾,Zuul 使用者需要自行承担这些复杂性。而对于 Kong 来说,限流功能就是一个插件,只需要简单的配置,即可开箱即用。因为Kong 的插件机制是其高可扩展性的根源,Kong 可以很方便地为路由和服务提供各种插件,网关所需要的基本特性,Kong 都如数支持。

Kong 可以认为是一个 OpenResty 应用程序。 OpenResty 运行在 Nginx 之上,使用 Lua 扩展了 Nginx。 Lua 是一种非常容易使用的脚本语言,可以让你在 Nginx 中编写一些逻辑操作。 Kong = OpenResty + Nginx + Lua
Kong 最优雅的一个设计便是插件机制。
微服务架构中,网关应当承担所有服务共同需要的那部分功能。【比如日志、权限、限流等】
Kong 其实就是运行在 Nginx 的基础之上,而进行的二次封装。
Kong文件夹的api 和 core 文件夹,封装了 Kong 对 service,route,upstream,target 等核心对象的操作代码。
Kong文件夹的plugins 文件夹包含了 Kong 的诸多插件功能,如权限控制插件,跨域插件,jwt 插件,oauth2 插件…如果需要自定义插件,则需要将代码置于此处。
除了 nginx.conf 中的配置,Kong 还需要连接一个数据库来管理路由配置,服务配置,upstream 配置等信息,由于 Kong 支持动态路由的特性,所以几乎所有动态的配置都不是配置在文件中,而是借助于 Postgres 或者 Cassandra 进行管理。
Kong 简单易用的背后,便是因为其所有的操作都是基于 HTTP Restful API 来进行的。
Kong 对外暴露了 Restful API,最终的配置便是落地在了数据库之中

配置Nginx可以来控制路由,怎么配置Kong才能控制路由?

# 配置 upstream
curl -X POST http://localhost:8001/upstreams --data "name=helloUpstream"
# 配置 target
curl -X POST http://localhost:8001/upstreams/hello/targets --data "target=localhost:3000" --data "weight=100"
# 配置 service
curl -X POST http://localhost:8001/services --data "name=hello" --data "host=helloUpstream"
# 配置 route
curl -X POST http://localhost:8001/routes --data "paths[]=/hello" --data "service.id=8695cc65-16c1-43b1-95a1-5d30d0a50409"
curl -X POST http://localhost:8001/routes --data "hosts[]=a.com,b.com,*.abc.com" --data "service.id=8695cc65-16c1-43b1-95a1-5d30d0a50409"

这一切都是动态的,无需手动 reload nginx.conf。

  1. upstream 是对上游服务器的抽象;
  2. target 代表了一个物理服务,是 ip + port 的抽象;
  3. service是抽象层面的服务,他可以直接映射到一个物理服务(host 指向 ip + port),也可以指向一个 upstream 来做到负载均衡;
  4. route 是路由的抽象,他负责将实际的 request 映射到 service。

他们的关系如下
upstream 和 target :1 对 n 【一个服务器对应多个物理服务target】
service 和 upstream :1 对 1 或 1 对 0 (service 也可以直接指向具体的 target,相当于不做负载均衡)【一个服务指向服务器是做负载均衡,指向物理服务是做映射。】
service 和 route:1 对 n 【一个服务可以有多个路由】

插件的影响范围非常灵活
对于部分插件,可能是全局的,影响范围是整个 Kong 服务。大多数插件都是装在 service 或者 route 之上。
我们可能只需要对核心接口进行限流控制,只需要对部分接口进行权限控制,这时候,对特定的 service 和 route 进行定向的配置即可。

为 hello 服务添加50次/秒的限流

curl -X POST http://localhost:8001/services/hello/plugins \
--data "name=rate-limiting" \
--data "config.second=50"

为 hello 服务添加 jwt 插件

curl -X POST http://localhost:8001/services/login/plugins \
--data "name=jwt"

同理,插件也可以安装在 route 之上

curl -X POST http://localhost:8001/routes/{routeId}/plugins \
--data "name=rate-limiting" \
--data "config.second=50"

curl -X POST http://localhost:8001/routes/{routeId}/plugins \
--data "name=jwt"

在官方文档中,我们可以获取全部的插件 https://konghq.com/plugins/,部分插件需要收费的企业版才可使用。

1.Kong是什么?
Kong 是在客户端和(微)服务间转发API通信的API网关,通过插件扩展功能。
Kong 有两个主要组件:
1、Kong Server :基于nginx的服务器,用来接收 API 请求。
2、Apache Cassandra:用来存储操作数据。
你可以通过增加更多 Kong Server 机器对 Kong 服务进行水平扩展,通过前置的负载均衡器向这些机器分发请求。
2.Kong特性功能
Kong 一大特性是可以通过插件扩展已有功能,这些插件在 API 请求响应循环的生命周期中被执行。插件使用 Lua 编写。
Kong可运行在某些 Linux 发行版、Mac OS X 和 Docker 中,无论是本地机还是云端服务器皆可运行。KONG可以在多种操作环境下安装。
Kong还有如下几个基础功能:
HTTP 基本认证、密钥认证、CORS( Cross-origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API 请求限流、请求转发以及 nginx 监控。
3.扩展知识
centos和Fedora,RedHat可以理解为“品牌,这些“品牌”的操作系统核心都是linux系统,只是可能会做一些扩展和增加一些自己的特性。
linux系统很多,主要分debian系和redhat系,还有其它自由的发布版本。
debian系主要有Debian,Ubuntu,Mint等及其衍生版本;
redhat系主要有RedHat,Fedora,CentOs等。
4.centos环境下部署
1、安装Kong

yum install -y https://kong.bintray.com/kong-community-edition-rpm/centos/7/kong-community-edition-0.13.1.el7.noarch.rpm

2、安装 PostgreSQL 9.5+

yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-3.noarch.rpm
yum install postgresql95 postgresql95-server
/usr/pgsql-9.5/bin/postgresql95-setup initdb
vim /var/lib/pgsql/9.5/data/postgresql.conf
 # cat /var/lib/pgsql/9.5/data/pg_hba.conf | grep 127.0.0.1 | grep trust | sed -i s/ident/trust/
sed -i  /^listen_addresses/c\listen_addresses=\'*\' /var/lib/pgsql/9.4/data postgresql.conf
systemctl enable postgresql-9.5 ; systemctl start postgresql-9.5

3、授权Kong数据库

su - postgres << EOF
psql << XOF
CREATE USER kong; CREATE DATABASE kong OWNER kong;
XOF
EOF

4、导入Kong数据

kong migrations up

5、启动Kong

cp /etc/kong/kong.conf.default /etc/kong/kong.conf
kong start
 # kong stop   # kong reload 

6、验证Kong是否成功启动

curl -I -m 10 -o /dev/null -s -w '%{http_code}\n'  http://localhost:8001/
if [[ $? -ne 0  ]] ;then echo "酱紫就成功了耶~"; fi

7.端口
Kong默认监听下面端口:
8000,监听来自客户端的HTTP流量,转发到你的upstream服务上。
8443,监听HTTPS的流量,功能跟8000一样。可以通过配置文件禁止。
8001,Kong的HTTP监听的api管理接口。
8444,Kong的HTTPS监听的API管理接口。

8、安装konga图形化管理

5.docker下部署
Docker部署Kong脚本:
1、安装Docker

yum install docker;systemctl enable docker;systemctl start docker 

2、创建kong-net网络

docker network create kong-net 

3、安装postgres数据库

docker run -d --name kong-database --network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" postgres:9.6 

4、初始化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 

5、启动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:0.13.1-centos  

6、 启动kong-dashboard/konga

docker run --rm -p 8080:8080 --network=kong-net \
pgbi/kong-dashboard  start --kong-url http://kong:8001 

7、UI管理,konga也是个不错的选择。参考:https://github.com/pantsel/konga

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值