php实战kong做微服务架构四(动态负载均衡)

序言

负载均衡(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

在这里插入图片描述
在这里插入图片描述

扫描二维码关注公众号,回复: 12533271 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_45111820/article/details/114096978