php實戰kong做微服務架構五(動態負載均衡)
- 序言
- kong提供的負載均衡方式
- Ring-balancer
- 平衡演算法
- 負載均衡
- nginx實作例子
- kong 環形均衡器實作
- 添加upstrram與target
- 添加service與route
- 運行效果
序言
負載均衡(Load balancing)是一種計算機網路技術,我們使用它在網路資源間分配負載,以達到最佳化資源使用,避免過載,
kong提供的負載均衡方式
kong提供了基于DNS的方法與Ring-balancer(環平衡器),后者可以在無DNS服務器下配置,本篇章將圍繞Ring-balancer展開介紹,
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進行加權 |
負載均衡
nginx實作例子
這個例子可以與kong的代碼比較,實作效果一致
upstream upstream01 {
server localhost:8888 weight=10;
server localhost:8889 weight=100;
}
server {
listen 80;
location /api/ {
proxy_pass http://upstream01 ;
}
}
kong 環形均衡器實作
添加upstrram與target
<?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;
}
添加service與route
<?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


轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/264276.html
標籤:其他
下一篇:Message Passing Attention Networks for Document Understanding
