负载均衡(Load balancing)是一种计算机网络技术,我们使用它在网络资源间分配负载,以达到最佳化资源使用,避免过载。
kong提供了基于DNS的方法与Ring-balancer(环平衡器),后者可以在无DNS服务器下配置。本篇章将围绕Ring-balancer展开介绍。
当使用环形均衡器,将不需要DNS服务器,kong充当服务注册表,通过API对服务与请求进行添加与删除处理。
这个环形的均衡器通过upsteam与target来配置。
在业务中我们可以收集多个服务地址与端口,组成target。
虚拟主机名即为upsteam。通过虚拟主机代理到这些target。
例如:
target -> 192.168.1.2:8887 192.168.1.2:8888 192.168.1.6:8889
upsteam -> www.lalahost.com
环形平衡器提供以下算法:
round-robin, consistent-hashing,和least-connections
算法 | 默认 | 描述 |
---|---|---|
round-robin | 是 | 为目标提供分布均匀的加权轮询 |
consistent-hashing | 基于一致性哈希,最大程度地提高目标命中率 | |
least-connections | 选择连接数最少的目标,并按目标的weight进行加权 |
这个例子可以与kong的代码比较,实现效果一致
upstream upstream01 {
server localhost:8888 weight=10;
server localhost:8889 weight=100;
}
server {
listen 80;
location /api/ {
proxy_pass http://upstream01 ;
}
}
<?php
/**
* @author: 飘逸的罗伯特
*/
//1. 创建名字为 upstream01 的 upstream
$upstream_data = [
'name' => 'upstream01',
];
http_request('http://hz12.cn:8001/upstreams', $upstream_data);
//2. 创建项目对应的target,此处创建两个
$target_data = [
'target' => 'hz12.cn:8888', //服务地址
'weight' => 10 //权重
];
http_request('http://hz12.cn:8001/upstreams/upstream01/targets', $target_data);
$target_data = [
'target' => 'hz12.cn:8889',
'weight' => 100
];
http_request('http://hz12.cn:8001/upstreams/upstream01/targets', $target_data);
/**
* 发送post请求
* @param [string] $url 请求地址
* @param [array] $postdata post参数
* @return [ar] [description]
*/
function http_request($url, $postdata=[]){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
$data = curl_exec();
curl_close($curl);
return $data;
}
等同于
upstream upstream01 {
server localhost:8888 weight=10;
server localhost:8889 weight=100;
}
<?php
/**
* @author: 飘逸的罗伯特
*/
//创建service
$services_data = [
'name' => 'service01', //服务名称
'host' => 'upstream01' //设置对应的upstream名字
];
http_request('http://hz12.cn:8001/services', $services_data);
//创建route
$route_data = [
'name' => 'route01', //路由名称
'paths' => [
'/api' //可访问服务的路由地址
]
];
http_request('http://hz12.cn:8001/services/service01/routes', $route_data);
/**
* 发送post请求
* @param [string] $url 请求地址
* @param [array] $postdata post参数
* @return [ar] [description]
*/
function http_request($url, $postdata=[]){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
$data = curl_exec();
curl_close($curl);
return $data;
}
等同于
server {
listen 80;
location /api/ {
proxy_pass http://upstream01 ;
}
}
准备测试demo
我分别在hz12.cn:8888与hz12.cn:8889服务器上准备测试demo,站点根目录下新建demo.php,内容分别为8888与8889
访问我的服务器 -> http://hz12.cn:8000/api