详讲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.rhkb.cn/news/248089.html

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

相关文章

【大数据】Flink SQL 语法篇(二):WITH、SELECT WHERE、SELECT DISTINCT

Flink SQL 语法篇(二) 1.WITH 子句2.SELECT & WHERE 子句3.SELECT DISTINCT 子句 1.WITH 子句 应用场景(支持 Batch / Streaming):With 语句和离线 Hive SQL With 语句一样的,语法糖 1,使用…

成本更低、更可控,云原生可观测新计费模式正式上线

云布道师 在上云开始使用云产品过程中,企业一定遇见过两件“讨厌”事: 难以理解的复杂计费逻辑,时常冒出“这也能收费”的感叹; 某个配置参数调节之后,云产品使用成本不可预估的暴涨。 可观测作为企业 IT 运维必须品…

Python基础(二十九、pymsql)

文章目录 一、安装pymysql库二、代码实践1.连接MySQL数据库2.创建表格3.插入数据4.查询数据5.更新数据6.删除数据 三、完整代码示例四、结论 使用Python的pymysql库可以实现数据存储,这是一种连接MySQL数据库的方式。在本篇文章中,将详细介绍如何使用pym…

【LeetCode每日一题】56. 合并区间插入区间

一、判断区间是否重叠 力扣 252. 会议室 给定一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] ,请你判断一个人是否能够参加这里面的全部会议。 思路分析 因为一个人在同一时刻只能参加一个会…

Django知识随笔

目录 1.如何再ajax中传输post数据? 2.在form表单中使用jquery序列化,input框过多。 1.如何再ajax中传输post数据? 在ajax传递的那个网址,会调用你路由的视图函数,在视图函数上面加一句 csrf_exempt 。写上之后会有提…

获取依赖aar包的两种方式-在android studio里引入 如:glide

背景:我需要获取aar依赖到内网开发,内网几乎代表没网。 一、 如何需要获取依赖aar包 方式一:在官方的github中下载,耗时不建议 要从开发者网站、GitHub 存储库或其他来源获取 ‘com.github.bumptech.glide:glide:4.12.0’ AAR 包&#xff…

应急消防应用步入“繁花”时代,卓翼智能消防无人机顺势而行大有可为

近日,北京卓翼智能科技有限公司(以下简称“卓翼智能”)宣布完成超亿元B轮融资,融资金额高达2.5亿元。这个“智能无人系统”黑马品牌,凭什么出圈?重点发力在哪些领域呢?今天,带你走进…

CodeLocator 避免控制台弹出一堆错误日志

现象 使用codeLocator 插件 控制台经常打印出一堆的错误日志。和项目本身无关。影响了我们排查错误的效率。 解决办法 在Application的onCreate方法中加入下面的代码。 //避免控制台弹出一堆的错误日志CodeLocator.config(new CodeLocatorConfig.Builder().enableHookInfla…

xcode安装visionOS Simulator模拟器报错解决方法手动安装方法

手动安装方法: 手动下载visionOS Simulator模拟器地址: https://developer.apple.com/download/all/ 选择 Xcode 版本 sudo xcode-select -s /Applications/Xcode.app # 用 Xcode-beta 的话是: # xcode-select -s /Applications/Xcode-beta…

Shell中正则表达式

1.正则表达式介绍 1、正则表达式---通常用于判断语句中,用来检查某一字符串是否满足某一格式 2、正则表达式是由普通字符与元字符组成 3、普通字符包括大小写字母、数字、标点符号及一些其他符号 4、元字符是指在正则表达式中具有特殊意义的专用字符&#xff0c…

Java集合-Map接口(key-value)

Map接口的特点:①KV键值对方式存储②Key键唯一,Value允许重复③无序。 Map有四个实现类:1.HashMap类2.LinkedHashMap类3.TreeMap类4.Hashtable类 1.HashMap类: 存储结构:哈希表 数组Node[ ] 链表(红黑…

STM32的GPIO的详细配置指南

1. GPIO简介 GPIO(General Purpose Input/Output)是用于在微控制器中与外部世界通信的接口。通过GPIO,微控制器可以控制外部设备(如LED、LCD、按键等)的状态,也可以接收外部设备的状态(如传感器…

用AI工具一键生成原创文案的方法

一键生成原创文案对于文案工作者来说它是一种高效率创作文案内容的方法。文案工作者知道创作文案是一件消耗精力和时间的事情,遇到没有创作灵感,想要写一篇高质量的文案内容简直难上加难,因此,互联网上出现了一键生成原创文案的方…

Linux下安装edge

edge具有及其强大的功能,受到很多人的喜爱,它也开发Linux版本,下面是安装方法: 1.去edge官网下载Linux(.deb)文件。 https://www.microsoft.com/zh-cn/edge/download?formMA13FJ 2.下载之后输入以下指令(后面是安装…

【算法专题】贪心算法

贪心算法 贪心算法介绍1. 柠檬水找零2. 将数组和减半的最少操作次数3. 最大数4. 摆动序列(贪心思路)5. 最长递增子序列(贪心算法)6. 递增的三元子序列7. 最长连续递增序列8. 买卖股票的最佳时机9. 买卖股票的最佳时机Ⅱ(贪心算法)10. K 次取反后最大化的数组和11. 按身高排序12…

WPOpenSocial实现WordPress的QQ登录

个人建站不可避免的需要自己搭建用户数据库的问题,可用户却往往因为注册繁琐而放弃浏览您的网站,由此可见,一个社交账号一键登录方式尤为重要。选择适合您网站需求的社交插件,可以提升用户互动,增加社交分享&#xff0…

【C++】类和对象(一)

前言:在前面我们带大家初步步入了C,让大家大概知道了他的样子,那今天就可以说我们要正式步入C的大门了,这一章内容的细节比较多各位学习的时候一定要仔细。 💖 博主CSDN主页:卫卫卫的个人主页 💞 &#x1f…

Flink实战三_TableAPISQL

接上文:Flink实战二_DataStream API 1、Table API和SQL是什么? 接下来理解下Flink的整个客户端API体系,Flink为流式/批量处理应用程序提供了不同级别的抽象: 这四层API是一个依次向上支撑的关系。 Flink API 最底层的抽象就是有…

AR眼镜_ar智能眼镜显示方案|光学方案

AR眼镜是一种智能眼镜,能够将虚拟现实和现实世界相结合,使人们能够在日常生活中体验和参与虚拟现实。然而,AR智能眼镜的制造成本高,开发周期长。要实现AR眼镜的各项功能,需要良好的硬件条件,而AR智能眼镜的…

大专生能不能学习鸿蒙开发?

目前安卓有2,000万的开发者。本科及以上学历占比为35%;iOS有2,400万开发者,本科及以上学历占比为40% 绝大多数的前端开发者都是大专及以下学历,在2023年华为开发者大会上余承东透露华为的开发者目前有200万,但鸿蒙开发者统计的数据…