interface RegisterInterface {
function join(string $service_name, string $ip, int $port);
function leave(string $service_name, string $ip, int $port);
}
客户端
use function Swoole\Coroutine\run;
Co::set([
'name_resolver' => [
new Swoole\NameService\Redis('127.0.0.1', 6379),
],
]);
run(function () {
echo Http\Get("http://user_service/path")->getBody();
});
服务端
use Swoole\Coroutine\Http\Server;
use function Swoole\Coroutine\run;
run(function () {
$server = new Server("127.0.0.1", 8080);
$server->set([
'service_register' => [
new Swoole\NameService\Redis('127.0.0.1', 6379),
new Swoole\NameService\ZooKeeper('127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183'),
],
'service_name' => 'user.service',
]);
$server->handle('/', function ($req, $resp) {
$resp->end('hello');
});
$server->start();
});
参考:https://github.com/swoole/community-chinese/issues/76
客户端支持
name_resolver
后,服务端可以在此基础上实现服务注册。名字服务只支持
IPv4
和IPv6
协议的端口,对UnixSocket
端口无效。接口原型
客户端
服务端
通过配置
service_register
选项实现服务注册,配置service_name
设置服务名称。在:Server
启动后,调用register
对象的join()
方法注册到NameServer
中Server
关闭前,调用register
对象的leave()
方法从NameServer
中注销包括
TCP
、HTTP
、HTTP2
、WebSocket
、Redis\Server
协程和异步Server
均支持此配置。与
Client
端不同name_resolver
配置不同,service_register
配置项是与
的关系,底层会遍历service_register
数组,依次调用每个service_register
的join()
方法。IP 地址
register
不需要填写IP
地址,如consul
,它会获取请求来源IP
作为服务地址0.0.0.0
和::
时,join()
方法使用监听的地址作为服务地址0.0.0.0
和::
时,join()
方法使用swoole_get_local_ip()
获取本机IP
地址,选取一个局域网IP
地址作为服务地址,或者调用register
的withAddress($ip)
方法指定IP
端口
Register
会自动获取Server\Port
的端口,不需要外部传入。续期
在
Server
启动后底层会每隔一定时间调用RegisterInterface::join()
方法向名字服务注册节点。可以在Register
对象上使用withInterval($seconds)
设置间隔时间。健康检查
某些服务发现组件,如
consul
不需要Node
主动续期,而是由服务发现主动进行健康检查,侦测节点是否存活。这时可以将join()
间隔时间设置为0
,不再主动续期。限流策略
服务端在超过最大并发时拒绝新的请求,客户端收到服务器的拒绝信号后可以故障转移至其他节点,进行重试。
max_concurrency
:最大并发请求数量,当服务器accept
一个新请求时 +1,完成处理发送响应之后 -1max_concurrency=100
:静态限制,当前正在处理的请求数量超过100后,新的请求直接返回503
错误max_concurrency=auto
:自适应限流,根据请求处理耗时(latency
)变化测量服务器的实际最大并发处理能力。当max_concurrency
调大一定比例后,测量latency
是否大幅上涨,如果是表示需要降低max_concurrency
,如果为否,表示max_concurrency
可以继续调大latency
:处理耗时,从接收请求到处理完成发送响应之间的时间,单位精确到毫秒或微秒,耗时是观测服务器程序负载情况的重要指标