一、负载均衡
当前一个服务进行多实例部署后,外部调用其中任意一个服务地址都可以得到响应。但是外部不可能记住也不应该记住所有的服务地址,这个时候就需要一个统一入口提供给外部进行调用,类似提供一个虚拟主机形式进行实现。后续就请求这个虚拟主机,由这个虚拟主机进行请求的转发,将请求依次转发给后面的服务,而kong服务就是承担这个虚拟主机的作用,其结构如下:
外部进行到kong里面后,先通过路径找到route,然后基于route寻找到其绑定的service。service通过load Banlancer(这里是指的upstream) 来任意选择一个tagert进行请求转发。
因此,从这里我们可以看出,kong实现负载均衡需要以下四个组件:ROUTE、SERVICE、UPSTREAM、TARGET
前提条件:已经基于kong网关安装及konga安装成功安装了kong组件,konga暂时不需要,安装的kong的地址是192.168.19.50
二、UPSTREAM
Upstream 是指 Kong Gateway 将请求转发到的 API、应用程序或微服务。 在 Kong Gateway 中,Upstream 对象代表一个虚拟主机名,可用于健康检查、断路和负载平衡多个服务的传入请求。
使用kong Admin API来创建一个upstream
使用curl工具或者postman工具调用都可以
curl命令调用
curl -X POST http://192.168.19.50:8001/upstreams \
--data name=first_upstream
postman调用
三、为upstream绑定target对象
1、下载jar包
这里我们使用kong-demo.jar分别在192.168.19.50:8080及8081两个端口运行服务。
jar可以去下图所示地址进行下载,具体链接:
2、部署jar包
[root@min ~]# nohup java -jar kong-demo-0.0.1-SNAPSHOT.jar --server.port=8080 &
[1] 86373
[root@min ~]# nohup java -jar kong-demo-0.0.1-SNAPSHOT.jar --server.port=8081 > 8081.txt &
[2] 86439
使用curl命令检查服务是否已经成功运行,
[root@min ~]# curl http://192.168.19.50:8081/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8080/hello
hello : 8080[root@min ~]#
可以看到服务已经正常运行了
3、为first_upstream添加192.168.19.50:8081、192.168.19.50:8080两个端口
curl命令如下:
curl -X POST http://192.168.19.50:8001/upstreams/first_upstream/targets \
--data target='192.168.19.50:8080'
curl -X POST http://localhost:8001/upstreams/first_upstream/targets \
--data target='192.168.19.50:8081'
postman调用如下:
添加192.168.19.50:8080target
添加192.168.19.50:8081target
四、新建一个service
在 Kong Gateway 中,服务是代表外部上游 API 或微服务的实体。 例如,数据转换微服务、计费 API 等。
服务的主要属性是它的 URL。 您可以使用单个字符串指定 URL,或者通过单独指定其协议、主机、端口和路径来指定。
使用admin api来进行创建,创建的官方参考文档:https://docs.konghq.com/gateway/latest/admin-api/#service-object
通过curl 命令进行创建
curl -i -s -X POST http://192.168.19.50:8001/services \
--data name=first_service \
--data host='first_upstream'
通过postman来进行创建
五、给first_service绑定一个新的route
使用admin api来进行创建,
curl命令创建
curl -i -X POST http://localhost:8001/services/first_service/routes \
--data 'paths[]=/first_service' \
--data name=first_route
使用postman来进行创建
六、测试具有负载均衡效果
使用curl命令来进行测试
[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
hello : 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello
可以看到得到响应的中都是8080和8081两个机器进行轮询
七、测试新增一个示例并且给对应的upstream上新增target,流量是否会均衡到第三个服务上去
1、部署新服务,端口号为8082
[root@min ~]# nohup java -jar kong-demo-0.0.1-SNAPSHOT.jar --server.port=8082 > 8082.txt &
[3] 88221
2、新增一个target
3、测试新增的target已经可以生效
[root@min ~]# curl http://192.168.19.50:8000/first_service/hello/sub
sub-hello: 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello/sub
sub-hello: 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello/sub
sub-hello: 8082[root@min ~]# curl http://192.168.19.50:8000/first_service/hello/sub
sub-hello: 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello/sub
sub-hello: 8082[root@min ~]# curl http://192.168.19.50:8000/first_service/hello/sub
sub-hello: 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello/sub
sub-hello: 8080[root@min ~]# curl http://192.168.19.50:8000/first_service/hello/sub
sub-hello: 8081[root@min ~]# curl http://192.168.19.50:8000/first_service/hello/sub
sub-hello: 8082[root@min ~]#