一、负载均衡

当前一个服务进行多实例部署后,外部调用其中任意一个服务地址都可以得到响应。但是外部不可能记住也不应该记住所有的服务地址,这个时候就需要一个统一入口提供给外部进行调用,类似提供一个虚拟主机形式进行实现。后续就请求这个虚拟主机,由这个虚拟主机进行请求的转发,将请求依次转发给后面的服务,而kong服务就是承担这个虚拟主机的作用,其结构如下:

Java网关负载均衡 网关做负载均衡_jar


外部进行到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调用

Java网关负载均衡 网关做负载均衡_Java网关负载均衡_02

三、为upstream绑定target对象

1、下载jar包

这里我们使用kong-demo.jar分别在192.168.19.50:8080及8081两个端口运行服务。

jar可以去下图所示地址进行下载,具体链接:

Java网关负载均衡 网关做负载均衡_负载均衡_03

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

Java网关负载均衡 网关做负载均衡_Java网关负载均衡_04


添加192.168.19.50:8081target

Java网关负载均衡 网关做负载均衡_负载均衡_05

四、新建一个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来进行创建

Java网关负载均衡 网关做负载均衡_java_06

五、给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来进行创建

Java网关负载均衡 网关做负载均衡_jar_07

六、测试具有负载均衡效果

使用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

Java网关负载均衡 网关做负载均衡_jar_08

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 ~]#