前言须知:

从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. 企业实施CRM系统后的积极作用

    公司在发展过程中,可能会遇到各种各样的问题,尤其是来自客户的问题,是最令广大企业头痛的.这并不是一个单方面的问题,不仅涉及到员工也涉及到企业.因此,许多企业使用CRM客户管理系统来管理客户,并通过它来 ...

  2. SQL 语句大全(简化版)

    1. SELECT * FROM 表名 WHERE 1 AND [ORDER BY DESC LIMIT] 2. INSERT INTO 表名 (字段列表) VALUES (值列表) 3. UPDAT ...

  3. Linux - last 命令

    前言 为啥写这篇?因为听 grep.sed 教程的时候有这个命令 栗子 加上工作中,运维给我排查问题的时候也用到了,感觉挺重要,先了解为敬! 命令作用 显示上次登录用户的列表 这个是在 Linux 下 ...

  4. 给手绘图着色(添加颜色或色彩):CVPR2020论文点评

    给手绘图着色(添加颜色或色彩):CVPR2020论文点评 Learning to Shade Hand-drawn Sketches 论文链接:https://arxiv.org/pdf/2002.1 ...

  5. Java重载方法如何竞争

    突然想起以前遇到的一道笔试题,题目大概是这样子的 // 父类 public class Father { } // 子类 public class Son extends Father { } // ...

  6. Java 将PPT幻灯片转为HTML

    本文以Java程序代码为例展示如何通过格式转换的方式将PPT幻灯片文档转为HTML文件.这里的PPT幻灯片可以是.ppt/.pptx/.pps/.ppsx/.potx等格式. 代码实现思路:[加载PP ...

  7. LongAdder源码阅读笔记

    功能描述 LongAdder通过创建多个副本对象,解决了多线程使用CAS更新同一个对象造成的CPU阻塞,加快了对线程处理的速度.当多个线程同一时刻更新一个AtomicLong类型的变量时,只有一个线程 ...

  8. Docker与k8s的恩怨情仇(一)—成为PaaS前浪的Cloud Foundry

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 大家在工作中或许或多或少都接触过Docker,那你知道Docker以及容器化背后的原理到底是什么吗? 容器化 ...

  9. 大厂面试必问!HashMap 怎样解决hash冲突?

    HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...

  10. hash表及带注释插头dp

    struct hash_map { node s[SZ+10];int e,adj[SZ+10]; inline void init(){e=0;memset(adj,0,sizeof(adj));} ...