Swoft 踩坑筆記十五 - RPC 建立服務端與客戶端
RPC的作用就是遠端呼叫,也就是介面。
需要準備的
- 倆臺虛擬機器,主要用來測試不同ip的。也不是必須,只是便於理解。
- 倆臺虛擬機器都要有一份swoft。
我們先使用swoft裡的domo做講解,然後再自己做一遍。
此時
虛擬機器A的IP:192.168.247.140
虛擬機器B的IP:192.168.247.141
虛擬機器A (客戶端)
首先,我們開啟這三個檔案
圖中88行那改成你虛擬機器B的ip和埠。
DemoInterface.php
:定義介面
DemoService.php
:實現定義的介面
這倆個讓你開啟是讓你看的,無需做修改,你只需修改 .env
DemoService.php
裡的類註釋有一個@Service()
,這個是配置服務端版本號的,@Service()
不填預設為0。用法看下面的客戶端。
至此,服務端建立。
啥是服務端?
就是提供服務的。呼叫這個服務的叫做客戶端。
虛擬機器B(服務端)
虛擬機器只需啟動就可以了
# cd swoft/bin/
# php swoft rpc:start
瀏覽器訪問(這個頁面是一個普通的控制器)
修改客戶端 .env HTTP_PORT=8081
http://192.168.247.140:8081/rpc/call
至此,客戶端也成功呼叫到了。
你想知道是不是真的成功了?那很簡單,你把服務端的swoft停掉再訪問就知道啦。
下面開啟的是上面訪問的控制器
@Reference(name=“user”, version=“1.0.1”)
name
:服務名稱version
:服務版本號
好了,我們來做服務端和客戶端吧!
服務端說明
需要定義一個介面,然後實現這個介面。
定義介面
建立swoft/app/Lib/TestInterface.php
<?php
namespace App\Lib;
use Swoft\Core\ResultInterface;
interface TestInterface
{
public function getStr(string $str);
}
實現介面
建立 swoft/app/Services/TestService.php
<?php
namespace App\Services;
use App\Lib\TestInterface;
use Swoft\Rpc\Server\Bean\Annotation\Service;
/**
* @Service()
*/
class TestService implements TestInterface
{
public function getStr(string $str)
{
return ['我是服務端的' . $str];
}
}
客戶端說明
1、從服務端拷貝一份TestInterface.php 到客戶端swoft/app/Lib/TestInterface.php
,也就是把檔案拉進去
2、將三個User的拷貝一份,把User的都改成Test
和服務端不同的是客戶端需要有連線池和熔斷器。
連線池和熔斷器的名稱要一樣。
連線池由兩部分組成,“連線池”和“連線池配置”。
TestBreaker.php改@Breaker(“user”)為@Breaker(“test”),改類名
TestServicePool.php改@Pool(name=“user”)為@Pool(name=“test”),改類名
TestPoolConfig.php 改類名
3、建立測試控制器 swoft/app/Controllers/TestController.php
<?php
namespace App\Controllers;
use Swoft\Http\Message\Server\Request;
use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;
use Swoft\Rpc\Client\Bean\Annotation\Reference;
use App\Lib\TestInterface;
/**
* Class TestController
* @Controller("/test")
*/
class TestController
{
/**
* @Reference(name="test")
*
* @var TestInterface
*/
private $testService;
/**
* @RequestMapping(route="test")
*/
public function test()
{
$result = $this->testService->getStr('-這兒是客戶端');
return [
'result' => $result,
];
}
}
服務端啟動
# cd swoft/bin/
# php swoft rpc:start
客戶端啟動
修改客戶端 .env HTTP_PORT=8081
# cd swoft/bin/
# php swoft start
訪問
192.168.247.140:8081/test/test
下一篇:服務降級與熔斷器