PHP actual combat kong para hacer arquitectura de microservicio cuatro (equilibrio dinámico de carga)
Prefacio
El equilibrio de carga es una tecnología de red informática que la utilizamos para distribuir la carga entre los recursos de la red para optimizar el uso de los recursos y evitar la sobrecarga.
Método de equilibrio de carga proporcionado por kong
Kong proporciona métodos basados en DNS y Ring-balancer (balanceador de anillo), que se puede configurar sin un servidor DNS. Este capítulo se centrará en Ring-balancer.
Balanceador de anillos
Cuando se usa un ecualizador de anillo, no se requiere un servidor DNS y Kong actúa como un registro de servicios, agregando y eliminando servicios y solicitudes a través de API.
Este ecualizador circular se configura a través de upsteam y target.
En el negocio, podemos recopilar múltiples direcciones de servicio y puertos para formar un objetivo.
El nombre de host virtual es upsteam. Proxy a estos destinos a través de hosts virtuales.
例如:
target -> 192.168.1.2:8887 192.168.1.2:8888 192.168.1.6:8889
upsteam -> www.lalahost.com
Algoritmo de equilibrio
El balanceador de anillo proporciona los siguientes algoritmos:
round-robin, hash consistente y conexiones mínimas.
algoritmo | defecto | descripción |
---|---|---|
round robin | sí | Proporcionar sondeos ponderados distribuidos uniformemente para los objetivos. |
hash consistente | Basado en hash consistente para maximizar la tasa de aciertos objetivo | |
conexiones-mínimas | Seleccione el objetivo con el menor número de conexiones y péselo de acuerdo con el peso del objetivo |
Balanceo de carga
Ejemplo de implementación de Nginx
Este ejemplo se puede comparar con el código de Kong y el efecto es consistente.
upstream upstream01 {
server localhost:8888 weight=10;
server localhost:8889 weight=100;
}
server {
listen 80;
location /api/ {
proxy_pass http://upstream01 ;
}
}
Implementación del ecualizador de anillo Kong
Agregar ascendente y objetivo
<?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;
}
Equivalente a
upstream upstream01 {
server localhost:8888 weight=10;
server localhost:8889 weight=100;
}
Agregar servicio y ruta
<?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;
}
Equivalente a
server {
listen 80;
location /api/ {
proxy_pass http://upstream01 ;
}
}
resultado de ejecución
准备测试demo
我分别在hz12.cn:8888与hz12.cn:8889服务器上准备测试demo,站点根目录下新建demo.php,内容分别为8888与8889
访问我的服务器 -> http://hz12.cn:8000/api