kong笔记 目录导航

在上两篇文章,我们主要介绍了kong的概念以及kong的部署,相信大家对kong已经有了基本认识,那么我们该如何使用它呢?

kong的功能有许多,我们一个一个来,先从kong的路由功能开始把~~~

kong的路由主要涉及到两个组件,serviceroute,接下来我们来谈谈究竟把~~~~

定义

  • service服务

    就是我们自己定义的上游服务,通过Kong匹配到相应的请求要转发的地方, Service 可以与下面的Route进行关联,一个Service可以有很多Route,匹配到的Route就会转发到Service中, 当然中间也会通过Plugin的处理,增加或者减少一些相应的Header或者其他信息。

  • route路由

    Route实体定义匹配客户端请求的规则. 每个路由都与一个服务相关联,而服务可能有多个与之相关联的路由. 每一个匹配给定路线的请求都将被提交给它的相关服务。

route和service的组合(以及它们之间的关注点分离)提供了一种强大的路由机制, 可以在Kong中定义细粒度的入口点,从而引导您的访问到不同upstream服务。

其执行流程为:

1232699-20191122095645942-1220269543.png

实战

目标:实践Kong的service和route基础配置功能,实现简单的API接口代理功能。

效果:通过kong代理www.baidu.com,使用kong的地址跳转到百度页面。

主要分为两个方式配置,分别为:

  1. konga方式;
  2. kong命令方式

如下:

konga方式

打开konga后台管理画面,打开Service

1632104232(1).jpg

配置service

1111.png

参数含义:

属性描述
name服务名称
retries代理失败后重试的次数
protocol与上游通信的协议
host上游的主机服务
port上游服务的端口号
path请求上游服务的路径
connect_timeout连接上游服务超时时间,默认为 60000 毫秒
write_timeout将请求发送到上游服务的超时时间,默认为 60000 毫秒
read_timeout从上游服务器读取超时时间,默认为 60000 毫秒
tags标签
url简写属性一次性设置 protocol、host、port 和 path。

在这里,我们只填写了name跟url字段,其他暂时均选择默认,有需求的可以自定义修改

接下来,我们来给这个service配置对应的route路由

1632106662(1).jpg

添加route

image-20210920110015973.png

相关参数

image-20210920114144971.png

参数详情

属性描述
name 自选名称。
protocols此路由应允许的协议列表。设置为[“https”]时,将通过请求升级到HTTPS来回答HTTP请求。默认为[“http”,“https”]
methods 半可选与此Route匹配的HTTP方法列表。使用http或https协议时,必须至少设置一个hosts, paths, or methods
hosts 半可选与此路由匹配的域名列表。使用httphttps协议时,必须至少设置一个hosts, paths, 或者 methods。使用表单编码时,符号是hosts [] = example.com&hosts [] = foo.test。使用JSON,使用Array。
paths 半可选与此路由匹配的路径列表。使用httphttps协议时,必须至少设置一个必须至少设置一个hosts, paths, 或者 methods。使用表单编码时,符号是paths [] = / foo&paths [] = / bar。使用JSON,使用数组。
headers 半可选一个或多个按头名索引的值列表,如果在请求中显示,将导致此路由匹配。不能使用此属性的头:应使用属性指定主机。Host``hosts
https_redirect_status_code状态代码孔响应时,路由的所有属性匹配,除了协议,即如果请求的协议是,而不是。 如果该字段设置为 301、302、307 或 308,则由孔注入头部。接受的值是: , , , , . .违约:。HTTP``HTTPS``Location``426``301``302``307``308``426
regex_priority 自选用于选择哪条路由解析给定请求的数字,当多条路由同时使用正则表达式匹配时。当两条路径匹配路径并具有相同的regex_priority时,将使用较旧的路径(最低的created_at)。请注意,非正则表达式路由的优先级不同(较长的非正则表达式路由在较短的路由之前匹配)。默认为0
strip_path通过其中一条path匹配Route时,从上游请求URL中删除匹配的前缀。默认为true
path_handling 自选在向上游发送请求时,控制服务路径、路由路径和请求路径的组合方式。请参阅上文,详细描述每个行为。接受的值是: . .违约:。"v0"``"v1"``"v0"
preserve_host通过其中一个主机域名匹配Route时,请使用上游请求标头中的请求主机头。如果设置为false,则上游主机头将是服务主机的头。
request_buffering是否启用请求身体缓冲。借用 HTTP 1.1,关闭带有大块传输编码的数据的服务可能有意义。违约:。true
response_buffering是否启用响应主体缓冲。借用 HTTP 1.1,关闭带有大块传输编码的数据的服务可能有意义。违约:。true
snis 半可选使用流路由时与此路由匹配的SNI列表。使用tcptls协议时,必须至少设置一个snissourcesdestinations
sources 半可选使用流路由时与此路由匹配的传入连接的IP源列表。每个条目都是一个对象,其字段为“ip”(可选地为CIDR范围表示法)和/或“port”。使用tcptls协议时,必须至少设置一个snissourcesdestinations
destinations 半可选使用流路由时,与此路由匹配的传入连接的IP目标列表。每个条目都是一个对象,其字段为“ip”(可选地为CIDR范围表示法)和/或“port”。使用tcptls协议时,必须至少设置一个snissourcesdestinations
tags 自选与路由相关的可选字符串集,用于分组和筛选。
service 自选此路由所关联的服务。这是Route代理流量的地方,使用表单encode。表示法是service.id = <service_id>。使用JSON,使用“service”:{“id”:“<service_id>”}

通过以上的设置,kong的路由功能已经设置好了,那么我们就来测试一下吧~~~~

在浏览器输入:

http://kong服务的ip:8000/myPath

即可跳转到百度的页面

或者

在shell上输入curl http://localhost:8000/myPath

image-20210920115047482.png

kong命令方式

其实引入此模块主要是为了方便这些场景

  1. 只安装了kong,没有安装可视化页面;
  2. 项目启动时,需要编写kong相关的脚本,从而需要一些命令;

步骤如下:

  • 创建service服务

    curl -i -X POST \
      --url http://localhost:8001/services/ \
      --data 'name=baidu-test' \
      --data 'url=http://www.baidu.com'
    
  • 为service添加route

    curl -i -X POST \
      --url http://localhost:8001/services/baidu-test/routes \
      --data 'name=baidu-route' \
      --data 'paths[]=/myPath'
    
  • 验证是否成功

    curl http://localhost:8000/myPath
    

然后就可以去验证了~~~~~~~

这里在科普一些我们常用的命令吧:

  • 查看kong现存的service

    curl -i -X GET \
      --url http://localhost:8001/services
    
  • 查看某个service下存在的routes

    curl -i -X GET \
      --url http://localhost:8001/services/baidu-test/routes
    
  • 更新某个service的配置

    curl -i -X PUT \
      --url http://localhost:8001/services/baidu-test \
      --data 'protocol=http' \
      --data 'host=www.javahly.com' \ 
      --data 'port=80'
    
  • 删除某个services的配置

    curl -i -X DELETE \
      --url http://localhost:8001/services/baidu-test 
    

    其余的可查看一下官方文档

    官方文档

踩坑点

  1. 在这里记录一个小坑:

    route模块下的配置:strip_path字段和path_handling字段,这两个是联动的,具体对应关系如下:

    S.PATHR.PATHR.STRIP_PATHR.PATH_HANDLINGREQUEST PATHPROXIED PATH
    /s/fv0falsev0/fv0req/s/fv0req
    /s/fv1falsev1/fv1req/sfv1req
    /s/tv0truev0/tv0req/s/req
    /s/tv1truev1/tv1req/sreq
    /s/fv0/falsev0/fv0/req/s/fv0/req
    /s/fv1/falsev1/fv1/req/sfv1/req
    /s/tv0/truev0/tv0/req/s/req
    /s/tv1/truev1/tv1/req/sreq

    什么意思呢,这两个字段设置是用来决定你访问的真是路径的

    比如你的设置如下

    paths =/myPath,

    strip_path=true,

    path_handling=v0,

    你service配置的url是http://www.baidu.com;

    那么根据以上配置,你访问kong的请求地址是:http://localhost:8000/myPath/123,其真实的访问地址是:http://www.baidu.com/123

  2. 通过kong命令添加多个path路径时,是这样的:

    curl -i -X POST \
      --url http://localhost:8001/services/baidu-test/routes \
      --data 'name=baidu-route' \
      --data 'paths[]=/myPath&paths[] = /test'
    

    而不是加,的方式

最后,附加一张konga操作页面的说明图

20200929182937428.jpg

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐