前言须知:

从0.13开始 kong就弃用的api改用service来组织api

  • 增加了service Route Upstream Target
  • service 相当于原来的api,但是没有路由信息,可以直接挂载物理host,也可以挂一个Upstream的host
  • Route指kong的路由实体。Route是Kong的入口,定义了请求的匹配规则,路由到指定的服务。就是专门定义外部访问的分发hosts,strip_path,preserve_host,protocols,甚至method都在这里定义,和service关联
  • Upstream,这个是新东西,一个虚拟的后端服务, 需要结合Target一起使用, 好处是可以在这里就完成负载均衡,还有健康检查
  • 给Upstream添加实际的物理节点,实现的负载均衡

Kong 的管理方式

Kong 简单易用的背后,便是其所有的操作都是基于 HTTP Restful API 来进行的,Kong 在port上公开了RESTful Admin API:8001,使用它可以动态地添加和删除API以及使用基于插件架构的Nginx/OpenResty的功能。

kong的操作及功能实现围绕下面的知识点展开。

1. kong的关键术语

Service:

Service 顾名思义,就是我们自己定义的上游服务,通过Kong匹配到相应的请求要转发的地方

Service 可以与下面的Route进行关联,一个Service可以有很多Route,匹配到的Route就会转发到Service中,

当然中间也会通过Plugin的处理,增加或者减少一些相应的Header或者其他信息

Service可以是一个实际的地址,也可以是Kong内部提供的upstream object

Route:

Route 字面意思就是路由,实际就是我们通过定义一些规则来匹配客户端的请求,每个路由都会关联一个Service,

并且Service可以关联多个Route,当匹配到客户端的请求时,每个请求都会被代理到其配置的Service中

Route作为客户端的入口,通过将Route和Service的松耦合,可以通过hosts path等规则的配置,最终让请求到不同的Service中

例如,我们规定api.example.comapi.service.com的登录请求都能够代理到10.11.11.11:8000端口上,那我们可以通过hosts和path来路由

首先,创建一个Service s1,其相应的host和port以及协议为http://10.11.11.11:8000

然后,创建一个Route,关联的Service为s1,其hosts为api.service.com, api.example.com,path为login

最后,将域名api.example.comapi.service.com的请求转到到我们的Kong集群上,也就是我们上面一节中通过Nginx配置的请求地址

那么,当我们请求api.example.com/loginapi.service.com/login时,其通过Route匹配,然后转发到Service,最终将会请求我们自己的服务。

Upstream:

这是指您自己的API /服务位于Kong后面,客户端请求被转发到该服务器。

相当于Kong提供了一个负载的功能,基于Nginx的虚拟主机的方式做的负载功能

当我们部署集群时,一个单独的地址不足以满足我们的时候,我们可以使用Kong的upstream来进行设置

首先在service中指定host的时候,可以指定为我们的upstream定义的hostname

我们在创建upstream时指定名字,然后指定solts(暂时不确定具体作用),upstream可以进行健康检查等系列操作。这里先不开启(还没有研究)

然后我们可以再创建target类型,将target绑定到upstream上,那么基本上我们部署集群时,也可以使用

Target:

target 就是在upstream进行负载均衡的终端,当我们部署集群时,需要将每个节点作为一个target,并设置负载的权重,当然也可以通过upstream的设置对target进行健康检查。

当我们使用upstream时,整个路线是 Route >> Service >> Upstream >> Target

API:

用于表示您的上游服务的传统实体。自0.13.0起弃用服务。这里就不在深入了解

Consumer:

Consumer 可以代表一个服务,可以代表一个用户,也可以代表消费者,可以根据我们自己的需求来定义

可以将一个Consumer对应到实际应用中的一个用户,也可以只是作为一个Service的请求消费者

Consumer具体可以在Plugin使用时再做深入了解

Plugin:

在请求被代理到上游API之前或之后执行Kong内的动作的插件。

例如,请求之前的Authentication或者是请求限流插件的使用

Plugin通过Admin API配置,可以和Service绑定,也可以和Route以及Consumer进行关联。

2. 如何通过配置KONG API实现对目标(API或应用)的访问

其实用nginx的配置去举例KONG API 是有些差异的,这里只是通过nginx比较形象的让你理解kong的service、route以及其他相关联的对象

我们来看一个典型的Nginx的配置对应在Kong上是怎么样的,下面是一个典型的Nginx配置

upstream helloUpstream {
server localhost:3000 weight=100;
} server {
listen 8000;
location /hello {
proxy_pass http://helloUpstream;
}
}

下面我们来看看其对应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"

这一切配置都是通过其Http Restful API 来动态实现的,无需我们在手动的 reload Nginx.conf 。开发的同学看到这是不是感觉到很幸福了。

在上述的配置中涉及到了几个概念:upstrean、target、service、route等概念,它们是Kong的几个核心概念,也是我们在使用Kong Api时经常打交道的。

kong的重要对象关系

从上面的配置及字面解释大概能够推测出他们的职责:upstream,target,service,route,他们便是 Kong 最最核心的四个对象

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

他们的关系如下:

  • upstream 和 target :1 对 n
  • service 和 upstream :1 对 1 或 1 对 0 (service 也可以直接指向具体的 target,相当于不做负载均衡)
  • service 和 route:1 对 n

kong对象特征


更多知识参考:

代理参考

负载平衡参考

Admin API: 详解各个对象的相关内容

[sleepy↓]

Kong的API管理方式的更多相关文章

  1. API 管理在云原生场景下的机遇与挑战

    作者 | 张添翼 来源 | 尔达Erda公众号 ​ 云原生下的机遇和挑战 标准和生态的意义 自从 Kubernetes v1.0 于 2015 年 7 月 21 日发布,CNCF 组织随后建立以来,其 ...

  2. 如何通过Azure Service Management REST API管理Azure服务

    通过本文你将了解: 什么是Azure Service Management REST API 如何获取微软Azure 订阅号 如何获取Azure管理证书 如何调用Azure Service Manag ...

  3. 论元数据和API管理工具

    公司里面的很多部门都在广泛的采用元数据管理,也采用了公司内部开发的元数据管理工具,有些部门的实施效果一直非常好,而有些部门的效果则差强人意.这个问题,其实和软件系统开发完成进入维护阶段后成本居高不下的 ...

  4. API管理平台XXL-API

    <API管理平台XXL-API> 一.简介 1.1 概述 XXL-API是一个简洁易用API管理平台,提供API的"管理"."文档"."M ...

  5. spring jwt springboot RESTful API认证方式

    RESTful API认证方式 一般来讲,对于RESTful API都会有认证(Authentication)和授权(Authorization)过程,保证API的安全性. Authenticatio ...

  6. 3种web会话管理方式

    一.基于server端的session管理 在早期web应用中,通常使用服务端session来管理用户的会话.快速了解服务端session: 1) 服务端session是用户第一次访问应用时,服务器就 ...

  7. (转)KlayGE游戏引擎 :高效的GBUFFER管理方式

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=3304 个顶点.这样的数据对GPU来说是很头疼的.所以引擎往往需要在Buffer上做一些工作来 ...

  8. (转)web会话管理方式

    阅读目录 1. 基于server端session的管理 2. cookie-based的管理方式 3. token-based的管理方式 4. 安全问题 5. 总结 http是无状态的,一次请求结束, ...

  9. 基于SpringCloud的Microservices架构实战案例-在线API管理

    simplemall项目前几篇回顾: 1基于SpringCloud的Microservices架构实战案例-序篇 2基于SpringCloud的Microservices架构实战案例-架构拆解 3基于 ...

随机推荐

  1. springboot整合JDBC出现Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'.

    今天使用springboot整合JDBC的使用,开始使用的是 com.mysql.jdbc.Driver驱动 结果运行出现此异常 那我们根据提示要求来修改即可 把驱动改成最新的com.mysql.cj ...

  2. QT绘制简易表盘

    1.简介 最近学习了一下QT,熟悉了一段时间后发现它的功能还是挺强大的,同时也比较方便用户上手去使用.现在就基于最近学习的内容,实现一个简易的带指针旋转功能的表盘.文中表盘的实现是基于QT的QPain ...

  3. 构建可扩展的GPU加速应用程序(NVIDIA HPC)

    构建可扩展的GPU加速应用程序(NVIDIA HPC) 研究人员.科学家和开发人员正在通过加速NVIDIA GPU上的高性能计算(HPC)应用来推进科学发展,NVIDIA GPU具有处理当今最具挑战性 ...

  4. [NOIP1998 提高组] 拼数

    题目描述 设有 n 个正整数​ a1-an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数. 输入格式 第一行有一个整数,表示数字个数 n. 第二行有 n 个整数,表示给出的 n 个整数 a_ ...

  5. 深入理解java虚拟机笔记补充-JVM常见参数设置

    JVM 常见参数设置 内存设置 参数 -Xms:初始堆大小,JVM 启动的时候,给定堆空间大小. -Xmx:最大堆大小,如果初始堆空间不足的时候,最大可以扩展到多少. -Xmn:设置年轻代大小.整个堆 ...

  6. 性能工具之Jmeter小白入门系列之一

    一.简单了解 Apache JMeter The Apache JMeter application is open source software, a 100% pure Java applica ...

  7. windows 7系统安装与配置Tomcat服务器环境

    windows 7系统安装与配置Tomcat服务器环境 学习了一个月的java基础,终于要迈向java web领域.学习java web开发就离不开服务器的支持,由于本人是菜鸟,只好求助度娘谷哥.在此 ...

  8. 在centos上安装docker

    安装docker 卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docke ...

  9. 如何使用 jest 和 lint-staged 只检测发生改动的文件

    我们现在在推进 EPC 的过程中,单元测试是必备的技能,在本地的 Git commit 之前进行单测非常有必要,总不能把所有的单测的压力都放在流水线上. 毕竟在流水线运行单测的成本还是挺高的,从 pu ...

  10. Golang学习(用代码来学习) - 第五篇

    /** 并发控制:context的学习 */ func context_test() { PrintStartSeperator("context_test") ctx, canc ...