- 整理的文档比较早,kong版本可能是0.10.3版本。详情请看官网最新文档
准备
使用kong代理后端请求
1.开放几个接口如下:
本地请求1:http://aaa.wyc.com:8888/aaa
返回:server_name:aaa.wyc.com,port:8888
本地请求2:http://aaa.wyc.com:8889/aaa
返回:server_name:aaa.wyc.com,port:8889
。。。
向kong注册后端请求
1.向kong里添加一条转发,将uri为/test的请求转发到本地请求request1
规则如下:
curl -i -X POST
--url http://127.0.0.1:8001/apis/
--data 'name=wyc'
--data 'uris=/test'
--data 'upstream_url=http://aaa.wyc.com:8888/aaa'
--data 'preserve_host=true'
--data 'strip_uri=true'
然后请求
http://localhost:8000/test
,返回server_name:aaa.wyc.com,port:8888
,说明添加成功。
2.在kong里添加一个名为test_v1的upstream
curl -i -X POST
--url http://127.0.0.1:8001/upstreams/
--data 'name=test_v1'
--data 'slots=10'
生成:
{
"orderlist": [
1,
6,
7,
8,
2,
4,
10,
5,
9,
3
],
"slots": 10,
"id": "6beedc5d-87fc-4382-92be-1dc752f28383",
"name": "test_v1",
"created_at": 1505217458404
}
3.在以上生成的upstream中添加target
curl -i -X POST
--url http://127.0.0.1:8001/upstreams/test_v1/targets
--data 'target=aaa.wyc.com:8888'
--data 'weight=10'
生成:
{
"target": "aaa.wyc.com:8888",
"id": "479dbc3a-74fe-47e7-b7b5-3ff188f5c08a",
"weight": 10,
"created_at": 1505269393596,
"upstream_id": "6beedc5d-87fc-4382-92be-1dc752f28383"
}
如果要删除某个target,则将其weiget设置为0
curl -i -X POST
--url http://127.0.0.1:8001/upstreams/test_v1/targets
--data 'target=aaa.wyc.com:8888'
--data 'weight=0'
查看正常活跃的target:
curl -i -X GET
--url http://127.0.0.1:8001/upstreams/test_v1/targets/active
kong的upstreams配置来负载均衡
1.修改request1的upstream为test_v1
{
"http_if_terminated": true,
"id": "d7685fd9-4caa-4f61-9b2c-8cc874ebc4d9",
"retries": 5,
"preserve_host": false,
"created_at": 1496395744000,
"upstream_connect_timeout": 60000,
"upstream_url": "http://test_v1/aaa",
"upstream_read_timeout": 60000,
"upstream_send_timeout": 60000,
"https_only": false,
"strip_uri": true,
"uris": [
"/test"
],
"name": "wyc",
"hosts": {}
}
然后重复执行上面步骤:
请求http://localhost:8000/test
,返回server_name:aaa.wyc.com,port:8888
。代理请求成功。
2.在upstream(test_v1)中再添加两条target
{
"data": [
{
"weight": 10,
"id": "66e30dcb-f504-408c-8269-fc86cbdc9cc6",
"target": "aaa.wyc.com:8890",
"created_at": 1505285074670,
"upstream_id": "6beedc5d-87fc-4382-92be-1dc752f28383"
},
{
"weight": 10,
"id": "e4c20a71-50d6-4b0e-989b-67f04758dbcb",
"target": "aaa.wyc.com:8889",
"created_at": 1505285069882,
"upstream_id": "6beedc5d-87fc-4382-92be-1dc752f28383"
},
{
"weight": 10,
"id": "cc79f82f-d9d8-4a8a-9dbd-9cb59f35f078",
"target": "aaa.wyc.com:8888",
"created_at": 1505273186303,
"upstream_id": "6beedc5d-87fc-4382-92be-1dc752f28383"
}
],
"total": 3
}
三个target的权重相同,应该轮流返回如上接口返回的信息。但是结果貌似不对:
https://github.com/Mashape/kong/issues/2887
实际测试:请求kong总是代理请求到upstream的其中一个target,例如:aaa.wyc.com:8889.
如果将aaa.wyc.com:8889所在服务down掉,kong将自动选择其他的健康的节点,将请求代理过去。
用consul配置kong负载均衡和服务发现
健康检查
1.https://github.com/openresty/lua-resty-upstream-healthcheck
官方提供的健康检查,使用http方式定时调用,需要对应的上游服务器暴露一个api来验证。
将上述的接口放在test_v1的upstream中:
upstream test_v1 {
server 127.0.0.1:8889;
server 127.0.0.1:8890;
server 127.0.0.1:8891 backup;
}
定义一个status的location查看upstream状态:
Nginx Worker PID: 45014
Upstream test_v1
Primary Peers
127.0.0.1:8889 up
127.0.0.1:8890 up
Backup Peers
127.0.0.1:8891 up
将其中一个upstream去除:server 127.0.0.1:8890;返回结果:
Nginx Worker PID: 45160
Upstream test_v1
Primary Peers
127.0.0.1:8889 up
127.0.0.1:8890 DOWN
Backup Peers
127.0.0.1:8891 up