Skip to content

Commit

Permalink
Merge pull request #28 from gaobinzhan/5.x
Browse files Browse the repository at this point in the history
up: readme
  • Loading branch information
kiss291323003 authored Dec 17, 2020
2 parents 5e33ca5 + 17f3187 commit 7f05f85
Show file tree
Hide file tree
Showing 4 changed files with 172 additions and 35 deletions.
192 changes: 172 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# EasySwoole RPC

很多传统的Phper并不懂RPC是什么,RPC全称Remote Procedure Call,中文译为远程过程调用,其实你可以把它理解为是一种架构性上的设计,或者是一种解决方案。
例如在某庞大商场系统中,你可以把整个商场拆分为N个微服务(理解为N个独立的小模块也行),例如:

Expand Down Expand Up @@ -32,38 +33,168 @@

粗暴来理解,例如某个服务器最多同时仅能处理100个请求,或者是cpu负载达到百分之80的时候,为了保护服务的稳定性,则不在希望继续收到
新的连接。那么此时就要求客户端不再对其发起请求。因此EasySwoole RPC提供了NodeManager接口,你可以以任何的形式来
监控你的服务提供者,在getServiceNode方法中,返回对应的服务器节点信息即可。

### EasySwoole RPC执行流程

服务端:
注册RPC服务,创建相应的服务swoole table表(ps:记录调用成功和失败的次数)
注册worker,tick进程

woker进程监听:
客户端发送请求->解包成相对应的格式->执行对应的服务->返回结果->客户端
监控你的服务提供者,在getNodes方法中,返回对应的服务器节点信息即可。

tick进程:
注册定时器发送心跳包到本节点管理器
启用广播:每隔几秒发送本节点各个服务信息到其他节点
启用监听:监听其他节点发送的信息,发送相对应的命令(心跳|下线)到节点管理器处理
进程关闭:主动删除本节点的信息,发送下线广播到其他节点
## EasySwoole RPC执行流程

![](easyswoole-rpc.png)
![](./resource/easyswoole-rpc.jpg)

## Composer安装

```
composer require easyswoole/rpc=5.x
```

## 实例代码
### 服务端
## rpc配置

```php
<?php

// 构造方法内用户可传入节点管理器实现`NodeManagerInterface` 默认`MemoryManager`
$config = new \EasySwoole\Rpc\Config();

/** 服务端配置 */

// 设置服务名称
$config->setServerName('User'); // 默认 EasySwoole

// 设置节点id
$config->setNodeId(\EasySwoole\Utility\Random::character(10)); // 可忽略 构造函数已经设置

// 设置异常处理器 对Service-Worker 和 AssistWorker的异常进行处理 必须设置 防止未捕获导致进程退出
$config->setOnException(function (\Throwable $throwable) {

});

$serverConfig = $config->getServer();

// 设置本机ip 必须设置
$serverConfig->setServerIp('127.0.0.1');

// 设置工作进程数量
$serverConfig->setWorkerNum(4);

// 设置监听地址及端口
$serverConfig->setListenAddress('0.0.0.0');
$serverConfig->setListenPort('9600');

// 设置服务端最大接受包大小
$serverConfig->setMaxPackageSize(1024 * 1024 * 2);

// 设置接收客户端数据时间
$serverConfig->setNetworkReadTimeout(3);

/** 广播设置 */

$assistConfig = $config->getAssist();

// 服务定时自刷新到节点管理器
$assistConfig->setAliveInterval(5000);

// 广播进程设置
$serviceFinderConfig = $assistConfig->getUdpServiceFinder();

// 监听地址和端口
$serviceFinderConfig->setEnableListen(true);
$serviceFinderConfig->setListenAddress('0.0.0.0');
$serviceFinderConfig->setListenPort(9600);

// 设置广播地址
$serviceFinderConfig->setEnableBroadcast(true);
$serviceFinderConfig->setBroadcastAddress(['127.0.0.1:9600', '127.0.0.1:9601']);
$serviceFinderConfig->setBroadcastInterval(5000); // 5s 广播一次

// 设置广播秘钥
$serviceFinderConfig->setEncryptKey('EasySwoole');

/** 客户端设置 */

// 如果只是暴露rpc服务 不进行调用别的rpc服务 可不用设置

$clientConfig = $config->getClient();

// 传输最大数据包大小
$clientConfig->setMaxPackageSize(1024 * 1024 * 2);

// 设置全局回调函数 成功及失败 $response->getStatus !== 0 全部为失败
$clientConfig->setOnGlobalSuccess(function (\EasySwoole\Rpc\Protocol\Response $response){

});
$clientConfig->setOnGlobalFail(function (\EasySwoole\Rpc\Protocol\Response $response){

});

/** 注册服务 */

$rpc = new \EasySwoole\Rpc\Rpc($config);

$serviceOne = new \EasySwoole\Rpc\Tests\Service\ServiceOne();
$serviceOne->addModule(new \EasySwoole\Rpc\Tests\Service\ModuleOne());
$serviceOne->addModule(new \EasySwoole\Rpc\Tests\Service\ModuleTwo());

$serviceTwo = new \EasySwoole\Rpc\Tests\Service\ServiceTwo();
$serviceTwo->addModule(new \EasySwoole\Rpc\Tests\Service\ModuleOne());
$serviceTwo->addModule(new \EasySwoole\Rpc\Tests\Service\ModuleTwo());

$rpc->serviceManager()->addService($serviceOne);
$rpc->serviceManager()->addService($serviceTwo);

/** 客户端调用 */

$client = $rpc->client();
// 添加请求
$ctx1 = $client->addRequest('ServiceOne.ModuleOne.action');
// 设置参数
$ctx1->setArg(['a','b','c']);
$ctx1->setOnSuccess(function (\EasySwoole\Rpc\Protocol\Response $response){

});
$ctx1->setOnFail(function (\EasySwoole\Rpc\Protocol\Response $response){

});

$ctx2 = $client->addRequest('ServiceTwo.ModuleOne.action');
// 设置参数
$ctx2->setArg(['a','b','c']);
$ctx2->setOnSuccess(function (\EasySwoole\Rpc\Protocol\Response $response){

});
$ctx2->setOnFail(function (\EasySwoole\Rpc\Protocol\Response $response){

});

$client->exec(3);

/** 节点管理器 */

// 用户在调用rpc过程中 当发现节点不可用 可自行调用下线

$nodeManager = $rpc->getConfig()->getNodeManager();

// 获取服务的所有节点
$nodeManager->getNodes('serviceOne', 1);

// 随机获取服务的一个节点
$nodeManager->getNode('serviceOne', 1);

// 下线一个服务节点
$nodeManager->offline(new \EasySwoole\Rpc\Server\ServiceNode());

// 刷新一个服务节点
$nodeManager->alive(new \EasySwoole\Rpc\Server\ServiceNode());

// 宕机一个服务节点
$nodeManager->failDown(new \EasySwoole\Rpc\Server\ServiceNode());
```

## 独立使用

```php
use EasySwoole\Rpc\Config;
use EasySwoole\Rpc\Protocol\Response;
use EasySwoole\Rpc\Rpc;
use EasySwoole\Rpc\Tests\Service\ModuleOne;
use EasySwoole\Rpc\Tests\Service\Service;
use EasySwoole\Rpc\Tests\Service\ServiceOne;
use Swoole\Http\Server;
require 'vendor/autoload.php';

Expand All @@ -72,7 +203,7 @@ $config->getServer()->setServerIp('127.0.0.1');

$rpc = new Rpc($config);

$service = new Service();
$service = new ServiceOne();
$service->addModule(new ModuleOne());

$rpc->serviceManager()->addService($service);
Expand All @@ -85,11 +216,32 @@ $http->on('request', function ($request, $response) use($rpc){
$client = $rpc->client();
$ctx1 = $client->addRequest('Service.Module');
$ctx2 = $client->addRequest('Service.Module.action');
$ctx2->setArg('xxx');
$ctx2->setOnSuccess(function (Response $response){
var_dump($response->getMsg());
});
$client->exec();
});

$http->start();
```

## EasySwoole中使用

```php
public static function mainServerCreate(EventRegister $register)
{
$config = new \EasySwoole\Rpc\Config();
$config->getServer()->setServerIp('127.0.0.1');

$rpc = new \EasySwoole\Rpc\Rpc($config);

$service = new \EasySwoole\Rpc\Tests\Service\ServiceOne();
$service->addModule(new \EasySwoole\Rpc\Tests\Service\ModuleOne());

$rpc->serviceManager()->addService($service);


$rpc->attachServer(ServerManager::getInstance()->getSwooleServer());
}
```
Binary file removed easyswoole-rpc.png
Binary file not shown.
Binary file added resource/easyswoole-rpc.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 0 additions & 15 deletions tests/Service/Service.php

This file was deleted.

0 comments on commit 7f05f85

Please sign in to comment.