首页 > 编程知识 正文

路由器的工作原理,kong网关性能

时间:2023-05-06 04:43:54 阅读:143982 作者:2136

转载hxsdrg大佬文章: https://www.lyafei.com/Kong网关简介安装

简要介绍了以前安装Kong的情况,这是深入Kong详细说明其工作原理、核心概念。

附件:

Kong官网: https://konghq.com/

Kong GitHub地址: https://github.com/kong/kong

Kong的结构

Kong的默认开放端口

接收客户端通信的端口、代理部分

:8000 —— http端口:8443 —— https端口admin API端口,admin部分

:8001 —— http端口:8444 —— https端口Nginx配置VS Kong配置看看常见的Nginx配置如何支持Kong。 以下是典型的Nginx配置

ustreampassportupstream {服务器localhost :8080 weight=100; }server { listen 80; location/hello { proxy _ pass http://passport upstream; 看看Kong对应的结构吧

# upstream curl-xpost http://localhost :8001/up streams-- data ' name=passport upstream ' #配置target curl-xpost 3358 loca amam targets---data ' target=localhost 33608080 '---data ' weight=100 ' # 配置service curl-xpost 3358 ll services---data ' name=get userinfo '---data ' host=passport upstream ' #配置route curl-- roost user '-- data ' service.id=8695 cc65-16 C1-43 B1-95a1- 5d30a 50409 ' curl-xpost http://localhost 33608001/routes . ABC.com '-- data ' service.id=8695 cc65-16 C1-43 B1-95a1- 5d 30 d 0a 50409 '这一切配置都是通过其http rest风格的API动态实现的,我

上述配置包括几个概念。 Upstream、Target、Service、Route等概念。 这些是Kong的几个核心概念,在使用Kong API时经常进行交流。 让我简要说明一下其中的几个核心概念。

Kong关键术语/名词解析Upstream Upstream对象表示虚拟主机名,可用于通过多个服务(目标)对传入请求进行负载平衡。 例如,Service.v1.xyz命名为service对象的上游主机是Service.v1.xyz为向上游代理此服务请求而定义的目标。

端口表示后端服务实例的目标目标IP地址/主机名。 上游有多个目标,可以动态添加目标。

上游保存Target的变更历史记录,因此无法删除或变更Target。 要禁用目标,请发出新的Targer weight=0或使用DELETE执行相同的操作。

Service nqdbks,服务实体是每个上游服务的抽象。 作为服务的例子,有数据转换微服务、收费API等。

的主要属性是其URL。 这里,Kong需要代理流量。 它可以设置为单个字符串,也可以指定协议、主机、端口和路径。

服务与根相关联。 服务可以与很多路由相关联。 根是Kong的入口点,用于定义与客户端请求匹配的规则。 如果路由匹配,Kong将向相关服务请求代理。

路由实体定义规则以匹配客户端的请求。 每个Route都与一个服务相关联,并且服务可能具有多个与之相关联的路由。 与指定路由匹配的每个请求都将代理到关联的服务。 可以设置的字段为:

hostspathsmethods Service和Route的组合以及它们之间的关注点隔离提供了一种强大的路由机制,可以在Kong中定义精细的入口点,并将基础架构路由到不同的上游服务

Consumer Consumer对象表示服务的用户或用户。 Kong可以保存为主数据库,也可以保存

将使用者列表与数据库映射,以保持Kong 与现有的主数据存储之间的一致性。

Plugin

插件实体表示将在 HTTP请求/响应生命周期 期间执行的插件配置。它是为在 Kong 后面运行的服务添加功能的,例如身份验证或速率限制。

将插件配置添加到服务时,客户端向该服务发出的每个请求都将运行所述插件。如果某个特定消费者需要将插件调整为不同的值,你可以通过创建一个单独的插件实例,通过 service 和 consumer 字段指定服务和消费者。

对应关系

Upstream : target -> 1:n
Service : Upstream -> 1:1 or 1:0 (Service 可以直接指向具体的 Target,相当于不做负载均衡)
Service : Route -> 1:n

Client 请求的流量通过 Route 指向与之相关的 Service,如果配置插件的话就会作用插件,Service 接到流量后给到相应的 Upstream 的服务上面。

Kong API操作 配置服务

通过向 Admin API 发送 HTTP 请求来向 Kong 添加服务:

curl -i -X POST http://localhost:8001/services/ -d 'name=test-service' -d 'url=http://test-service.com' HTTP/1.1 201 Created ... { "connect_timeout": 60000, "created_at": 1587869247, "host": "test-service.com", "id": "d54da06c-d69f-4910-8896-915c63c270cd", "name": "test-service", "path": "/", "port": 80, "protocol": "http", "read_timeout": 60000, "retries": 5, "updated_at": 1587869247, "write_timeout": 60000 }

这里注册一个名为 test-service 的服务,该服务指向 http://test-service.com(上游)。

url 参数是一个简化参数,用于一次性添加 protocol,host,port 和 path。

路由匹配规则
现在让我们讨论 Kong 如何匹配针对路由的已配置 host,path 和 methods 属性(或字段)的请求。请注意,所有这三个字段都是可选的,但必须至少指定其中一个。

对于匹配路线的请求:

请求必须包含所有已配置的字段请求中的字段值必须至少与其中一个配置值匹配(当字段配置接收一个或多个值时,请求只需要其中一个值被视为匹配)
这里思考一个问题,Kong route 中的 host 的作用是什么?有什么意义?哪些场景会用到设置多个 host 呢?

这是官方的解释:
Routing a request based on its Host header is the most straightforward way to proxy traffic through Kong, as this is the intended usage of the HTTP Host header. Kong makes it easy to do so via the hosts field of the API entity.

显然官方对 host 的说明,没有回答上面的问题,下面看下网络上对 host 的解释:
我们知道 HTTP 请求头信息里面会带有一个 Host 字段,很多人不是很清楚这个字段具体的作用或者用法,包括我被很多人问过也曾经有些迷茫,这里具体扫盲下。

Host 是 HTTP 1.1 协议中新增的一个请求头,主要用来实现虚拟主机技术。我们知道一个 IP 地址可以对应多个域名,比如假设我有这么几个域名 www.baidu.com,www.taobao.com 和 www.jd.com 然后在域名提供商那通过 A 记录或者 CNAME 记录的方式最终都和我的虚拟机服务器 IP:111.111.111.111 关联起来,那么我通过任何一个域名去访问最终解析到的都是 IP:111.111.111.111。

但是还是没有提到 Host 的概念,其实可以这样看,我们的那台虚拟机 111.111.111.111 上面其实是可以放很多很多网站的(不然如果只能放一个网站的话就太不合理了,虚拟机那么多资源都浪费了),我们可以把 www.baidu.com,www.taobao.com 和 www.jd.com 这些网站假设都部署在那台虚拟机上面,但是这样会有一个问题,我们每次访问这些域名其实都是解析到服务器 IP:111.111.111.111,我怎么来区分每次根据域名显示出不同的网站的内容呢,其实这就要用到请求头中 Host 的概念了,每个 Host 可以看做是我在服务器 111.111.111.111 上面的一个站点,每次我用那些域名访问的时候都是会解析同一个虚拟机没错,但是我通过不同的 Host 可以区分出我是访问这个虚拟机上的哪个站点。

我们再来看几个例子就彻底明白了。考虑如下配置的路由:

{ "hosts": ["example.com", "test-service.com"], "paths": ["/header", "/test"], "methods": ["GET"]}

下面我们假设请求时不带 Host:

curl -v -H "Host: ''" -i http://localhost:8000/users/1

注意观察请求头,* Connected to localhost (127.0.0.1) port 8000 (#0);客户端和 Kong 建立了 tcp 连接,但是 host 是空的,所以 Kong 匹配不到上面的 route。

让我们看下设置了正确 Host 的请求:

curl -v -H "Host: example.com" -i http://localhost:8000/users/1

这次 Kong 匹配到了 route,所以拿到了数据。所以 Host 作用明白了吧。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。