详讲api网关之kong的基本概念及安装和使用(一)

什么是api网关

前面我们聊过sentinel,用来限流熔断和降级,如果你只有一个服务,用sentinel自然没有问题,但是如果是有多个服务,特别是微服务的兴起,那么每个服务都使用sentinel就给系统维护带来麻烦。那么网关是个啥东西呢,简单来说,网关就是一个服务器,也是所有服务的唯一入口。api网关不仅可以实现系统层面的限流熔断等技术,还可以提供服务发现,负载均衡,协议转换,流量管理,黑白名单,反爬策略,身份验证,灰度发布,监控,缓存等等功能。

在没有引入网关之前,为了保障交互的安全,每个服务都需要自己实现一套权限校验(Auth)、日志、限流、监控等方案。这样就不太好,各种成本很高。
引入网关之后呢,像鉴权、监控、安全、限流、日志、缓存等等方案都可以统一由网关实现。各个服务只需要专注于自己的业务实现就OK。

实现网关的技术有哪些

那么现在有哪些成熟的api网关技术呢?我们通过表格了解一下,结合github我们也能看到,kong是当之无愧的网关一哥,收获的start接近37k,生态也很不错。它是基于nginx+lua实现的。和go相关的有goku manba tyk等
在这里插入图片描述

kong

Kong是一个开源的API网关,它是一个针对API的一个管理工具。你可以在那些上游服务之前,额外地实现一些功能。
Kong本身是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。

kong有三个重要组件,我们在后面使用中会用到

  • Kong Server :基于nginx的服务器,用来接收API请求。
  • Apache Cassandra/PostgreSQL :用来存储操作数据。
  • Kong dashboard:官方推荐UI管理工具,当然,也可以使用 restfull 方式 管理admin api。

kong的安装

接下来,我们通过docker来快速安装kong,看看kong长什么样子

  • 下载kong镜像
docker pull kong:1.5.0-alpine
  • 给镜像打tag
$ docker images
REPOSITORY   TAG            IMAGE ID       CREATED       SIZE
kong         1.5.0-alpine   a79fdd990557   4 years ago   129MB
$ docker tag a79fdd990557 kong-oss
  • 创建一个专属的网络空间,kong及其相关的容器均加入到这个网络中,方便容器间的相互发现和互通
docker network create kong-ee-net
  • 创建数据卷,用于将容器的目录挂载到宿主上,防止容器被删后,数据丢失。
docker volume create kong-volume
  • 启动kong依赖的db容器:运行postgresql数据库,注意--network=kong-ee-net用于指定网络;-v kong-volume:/var/lib/postgresql/data是用来指定目录挂载,即数据卷
docker run -d --name kong-ee-database \--network=kong-ee-net \-p 5432:5432 \-v kong-volume:/var/lib/postgresql/data \-e "POSTGRES_USER=kong" \-e "POSTGRES_DB=kong" \-e "POSTGRES_PASSWORD=kong" \postgres:9.6
  • 初始化kong需要的数据库和网络
docker run --rm --network=kong-ee-net \-e "KONG_DATABASE=postgres" \-e "KONG_PG_HOST=kong-ee-database" \-e "KONG_PG_PASSWORD=kong" \-e "KONG_PASSWORD=kong" \kong-oss kong migrations bootstrap
  • 我们可以通过datatrip看一下,链接信息如下,就是我们初始化的时候填写的信息
    在这里插入图片描述
  • 数据库依赖已经启动,接下来我们启动kong ,有几个对外暴露的端口号我们需要了解一下
    • 接收客户端流量的端口,proxy 部分
      :8000 —— http 端口
      :8443 —— https 端口
    • admin API 端口,admin 部分
      :8001 —— http 端口
      :8444 —— https 端口
      在这里插入图片描述
  • 启动kong ,在该命令中,我们给kong指定了数据库相关信息,指定了相关暴露的接口
docker run -d --name kong \--network=kong-ee-net \-e "KONG_DATABASE=postgres" \-e "KONG_PG_HOST=kong-ee-database" \-e "KONG_PG_USER=kong" \-e "KONG_PG_PASSWORD=kong" \-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-oss:latest
  • 接下来我们访问8001端口验证一下
    在这里插入图片描述

  • kong是支持可视化管理的,我们通过安装konga来实现

konga

  • 同样,我先创建数据卷
docker volume create konga-postgresql
  • 初始化数据库和网络
docker run -d --name konga-database \--network=kong-ee-net \-p 5433:5432 \-v konga-postgresql:/var/lib/postgresql/data \-e "POSTGRES_USER=konga" \-e "POSTGRES_DB=konga" \-e "POSTGRES_PASSWORD=konga" \postgres:9.6
  • 配置konga的数据库信息和网络
docker run --rm --network=kong-ee-net \
pantsel/konga:latest \
-c prepare \
-a postgres \
-u postgres://konga:konga@konga-database:5432/konga

在这里插入图片描述

  • 启动konga
docker run -d -p 1337:1337 \--name konga \--network=kong-ee-net \-e "DB_ADAPTER=postgres" \-e "DB_URI=postgres://konga:konga@konga-database:5432/konga" \-e "NODE_ENV=production" \-e "DB_PASSWORD=konga" \pantsel/konga
  • 至此,服务启动完毕,分别是kong kong-database konga konga-database
    在这里插入图片描述

  • 接下来我们访问konga http://127.0.0.1:1337/register,我们一路点击并注册
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 前面我们启动kong的时候指定过-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \,这里,我们把admin-api配置进去,我们查看一下kong的ip是什么并配置上去

$ docker network ls
NETWORK ID     NAME          DRIVER    SCOPE
6c651fea33e2   bridge        bridge    local
d1762f271faa   host          host      local
d919b20bcd75   kong-ee-net   bridge    local
eacd36da5200   none          null      local
$ docker network inspect kong-ee-net 

在这里插入图片描述

kong的基本讲解

我们在前面创建链接之后,进入以下页面,那么我们左侧菜单栏都代表什么东西
在这里插入图片描述

SERVICE

service里面下面有一句说明Service entities, as the name implies, are abstractions of each of your own upstream services. Examples of Services would be a data transformation microservice, a billing API, etc. 说这是一个服务实例,是您自己的上游服务。说白了,kong既然是一个服务网关,那么一个请求过来,kong必然要去转发到对应的上游服务,那么这个转发规则是什么?我们就是通过service配置来实现的。这个规则可以对应一个route,也可以对应多个route

Route

route 相当于nginx里面location,他负责将实际的 request 映射到 service。
实际上是通过定义一些规则来匹配客户端的请求,每个路由都会关联一个service,并且service可以关联多个route。当匹配到客户端的请求时,每个请求都会被代理到其配置的Service中。Route作为客户端的入口,通过将Route和Service的松耦合,可以通过hosts path等规则的配置,最终让请求到不同的Service中。比如goods相关的服务我们的route就匹配规则可能就是/good,订单相关的匹配规则可能就是另一个service,route对应/order

配置service和route

接下来我们通过实例来更好的理解一下service和route
我们现在有一个这样的服务,获取博客详情http://192.168.11.20:8082/v1/blog/detail?id=12,那么我们怎么通过网关去访问呢
在这里插入图片描述

  • 创建service
    在这里插入图片描述
  • 我们也可以通过api发送http请求来添加service
curl -i -X POST http://localhost:8001/services/ \-d 'name=api-service' \-d 'url=http://192.168.11.20:8082'
  • 添加route ,这里面的path是什么转发规则呢,就是比如 path是/,那么我就把/后面的path转发过去,同样的如果你的path是 /v1,那么转发的时候就会把v1后面的转发过去,我们举个例子
    在这里插入图片描述

  • 通过kong访问接口http://127.0.0.1:8000/v1/blog/detail?id=12
    在这里插入图片描述

  • 这个时候我上游服务把路径改了,改成了http://192.168.11.20:8082/blog/detail?id=12,没有v1了,还能访问的通吗?上游服务返回404了。那么怎么办
    在这里插入图片描述

  • 我们修改route的配置,增加对新路由的兼容,我们再次访问
    在这里插入图片描述
    在这里插入图片描述

  • 上游服务的日志,其实这也说明网关的另一个作用,内部uri的变更不影响kong对外提供服务。
    在这里插入图片描述

  • 同样,我们也可以使用admin api添加route

curl -i -X POST  http://localhost:8001/services/api-service/routes \-d 'name=test1' \-d 'paths[]=/test1' \-d 'strip_path=false'
  • 如果路由重复会添加错误
{"message":"UNIQUE violation detected on '{name=\"test1\"}'","name":"unique constraint violation","fields":{"name":"test1"},"code":5}

TARGET

target 可以说就是我们的服务实例,我们在上面例子中,直接通过ip+端口的方式绑定了实例,但是我们知道,一个服务可能有很多个实例,也就是多个节点。多个节点的话,kong是如何实现负载均衡的呢,这里就要用到stream

UPSTREAM

upstream就是一个虚拟的服务,可以用于配置多个target用来实现负载均衡。

接下来我们通过一张图来了解一下这四个核心元素的关系
在这里插入图片描述

总结

好了,上面我们聊了kong的作用,安装以及简单的使用,也了解了kong的一些组件和kong的核心对象。下一篇文章中将会举例负载均衡和插件的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计数指针:shared_ptr (共享指针)与函数 笔记

推荐B站视频: 4.shared_ptr计数指针_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p4&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 5.shared_ptr与函数_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p5&vd_sourcea…

YOLOV5目标检测---labelimg图片标注工具(1)

前言:在使用YOLO训练自己模型的时候首先要学会对数据进行处理,这里介绍一个常用的本地打标签工具labelimg,如果不想按照的话也可以使用在线标签工具,因为害怕数据泄露,所以本人一直使用的是本地工具进行打标签。在线标…

node.js漏洞总结

js开发的web应用和php/Java最大的区别就是js可以通过查看源代码的方式查看到编写的代码,但是php/Java的不能看到,也就是说js开发的web网页相当于可以进行白盒测试。 流行的js框架有: 1. AngularJS 2. React JS 3. Vue 4. jQuery 5. Backbone…

ppt作品展示能用二维码吗?文件二维码内容可替换怎么做?

当我们需要将自己的作品或者内容做成ppt文件之后,用二维码的方式来做展示,而且生成二维码还可以在图案不变的情况下,能够修改或者替换文件内容,实现二维码的长期使用。在遇到这种要求时,如何生成这种类型的二维码图片呢…

扫雷游戏——数组和函数实现

扫雷游戏的功能说明 使⽤控制台实现经典的扫雷游戏 游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格⼦ 默认随机布置10个雷可以排查雷如果位置不是雷,就显⽰周围有⼏个雷如果位置是雷,就炸死游戏结束把除10个雷之外的所有⾮雷都找出来&…

HFSS实战(三)——过孔via TDR仿真

文章目录 一、模型的处理二、TDR仿真2.1 修改求解模式2.2增加求解设置 三、查看仿真结果3.1 查看TDR结果3.2 查看S参数结果 四、结果分析4.1上升时间tr对仿真的影响 附:工程链接 在上一讲中,主要是通过观察S参数确定via的优化是否达到目标。但S参数只能看…

k8s 安全机制

k8s的安全机制: 核心:分布式集群管理工具,就是容器编排,安全机制的核心:API server 作为整个集群内部通信的中介,也是外控控制的入口。实验的安全机制都是围绕api server来进行设计: 请求api资…

利用nginx宝塔免费防火墙实现禁止国外IP访问网站

本章教程,主要介绍,如何利用nginx宝塔面板中的插件免费防火墙,实现一键禁止国外IP访问网站。 目录 一、安装宝塔插件 二、 开启防火墙 一、安装宝塔插件 在宝塔面板中的软件商店,搜索防火墙关键词,找到Nginx免费防火…

在线教育系统开发:构建现代化学习平台

随着科技的迅速发展,在线教育系统在教育领域扮演着越来越重要的角色。本文将深入探讨在线教育系统的开发过程,涉及关键技术和代码实现。 技术选型 在开始开发之前,我们首先需要选择适合在线教育系统的技术栈。以下是一些常见的技术选项&am…

代码随想录算法训练营29期|day31 任务以及具体安排

理论基础 关于贪心算法,你该了解这些! 题目分类大纲如下: #算法公开课 《代码随想录》算法视频公开课 (opens new window):贪心算法理论基础! (opens new window),相信结合视频再看本篇题解,更有助于大家…

大创项目推荐 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测

文章目录 0 简介1 基于 Keras 用 LSTM 网络做时间序列预测2 长短记忆网络3 LSTM 网络结构和原理3.1 LSTM核心思想3.2 遗忘门3.3 输入门3.4 输出门 4 基于LSTM的天气预测4.1 数据集4.2 预测示例 5 基于LSTM的股票价格预测5.1 数据集5.2 实现代码 6 lstm 预测航空旅客数目数据集预…

IO多路复用-epoll

IO多路复用-epoll 1. 概述 epoll 全称 eventpoll,是 linux 内核实现IO多路转接/复用(IO multiplexing)的一个实现。 epoll是select和poll的升级版,相较于这两个前辈,epoll改进了工作方式,因此它更加高效…

WorkPlus AI智能客服解决方案,提升企业服务质量

在当今竞争激烈的商业环境中,提供卓越的客户服务成为企业赢得市场竞争的关键。而AI智能客服技术的不断发展,则成为了提高服务效率和满意度的利器。作为一款领先的AI助理解决方案,WorkPlus AI助理以其出色的性能和智能化的功能,助力…

c++入门学习(十八)赋值运算符

简单赋值运算符(): 最基本的赋值运算符是“”。它表示将右侧的值赋给左侧的变量。例如,x 5意味着将值5赋给变量x。 增量赋值运算符: 这是一组在赋值的同时对变量进行递增操作的运算符。常见的有、-、*、/等。例如&…

THM学习笔记——网络工具

ping 当我们想要测试是否可以连接到远程资源时&#xff0c;会使用 ping 命令。 ping 的基本语法&#xff1a; ping <target>。 测试是否可以与百度建立网络连接&#xff1a; traceroute 互联网由许多个不同的服务器和端点组成&#xff0c;它们都相互联网。这意味着&a…

Soul CEO张璐团队布局AIGC领域,打造数智化社交新体验

作为互联网社交领域的领军企业,Soul App近日再次受到广泛关注,因其在生成式人工智能(AIGC)领域的前沿布局和创新。随着数据积累、算力提升和算法不断迭代,AIGC技术正逐渐成为推动产业创新的重要工具之一。2023年被誉为AIGC元年,而Soul App在CEO张璐的带领下,在这个领域的不懈努…

计算CNN卷积层和全连接层的参数量

计算CNN卷积层和全连接层的参数量 先前阅读 CNN ExplainerA Comprehensive Guide to Convolutional Neural Networks — the ELI5 way 本文主旨意在搞明白2个问题&#xff1a; 第一个问题 一个卷积操作&#xff0c;他的参数&#xff0c;也就是我们要训练的参数&#xff0c;也…

Navigation 2 学习01 介绍及安装及运行示例

Navigation 2 是什么 Nav2 是 ROS 导航 的综合控制服务&#xff0c;类似人类的小脑控制人类的行走及身体平衡&#xff0c;Nav2 针对移动和地面机器人提供支持的自动驾驶车辆的相同类型的技术&#xff0c;经过优化和改造。该项目旨在找到一种安全的方法&#xff0c;使移动机器人…

nginx离线部署-aarch64架构

nginx离线部署-aarch64架构 服务器环境: 架构&#xff1a;aarch64&#xff0c; 系统&#xff1a;Red Hat &#xff08;CentOS 7&#xff09; nginx 1.24 需要准备这些&#xff1a; 可以先尝试安装 Nginx 安装NGINX 内网是没有网络的需要使用 RPM 包安装 gcc&#xff0c; g…

绘制太极图 - 使用 PyQt

大家好&#xff01;今天我们将一起来探讨一下如何使用PyQt&#xff0c;这是一个强大的Python库&#xff0c;来绘制一个传统的太极图。这个图案代表着古老的阴阳哲学&#xff0c;而我们的代码将以大白话的方式向你揭示它的奥秘。 PyQt&#xff1a;是什么鬼&#xff1f; 首先&a…