介绍 swoft 中 RPC使用:搭建访问服务端和客户端

  

RPC服务端:

一、配置,在文件 /app/bean.php中添加

return [
'rpcServer' => [
'class' => ServiceServer::class,
'port' => 18308,
],
] Http server 启动中集成 RPC 服务:
return [
'httpServer' => [
'class' => HttpServer::class,
'port' => 18306,
'listener' => [
'rpc' => bean('rpcServer')
], // ...
],
]

二、使用

  1、定义接口,服务提供方定义好接口格式,存放到公共的lib库里面,服务调用方,加载lib库,就能使用接口服务,接口定义和普通接口完全一致。

在/app/Rpc/Lib/ 文件夹下添加文件DemoInterface.php:

<?php

namespace App\Rpc\Lib;

/**
* Interface DemoInterface
*/
interface DemoInterface{
/**
* @return array
* @param int $id
*/
public function getLists(int $id): array ; /**
* @return string
*/
public function getBig():string ;
}

  2、接口实现,在文件夹 /app/Rpc/Service/ 下添加文件DemoService.php

<?php
namespace App\Rpc\Service; use App\Rpc\Lib\DemoInterface;
use Swoft\Rpc\Server\Annotation\Mapping\Service; /**
* Class DemoService
*
* @Service(version="1.0") //定义版本
*
*/
class DemoService implements DemoInterface{
/**
* @param int $id
* @return array
*/public function getLists(int $id): array
{
// TODO: Implement getLists() method. return ["id" => $id];
} /**
* @return string
*/
public function getBig(): string
{
// TODO: Implement getBig() method. return "ddddddd";
}
}

定义版本2,在文件夹 /app/Rpc/Service/ 下添加文件DemoServiceV2.php

<?php
namespace App\Rpc\Service; use App\Rpc\Lib\DemoInterface;
use Swoft\Rpc\Server\Annotation\Mapping\Service; /**
* Class DemoService
*
* @Service(version="1.2") //定义版本1.2
*
*/
class DemoServiceV2 implements DemoInterface{ /**
* @param int $id
* @return array
*/public function getLists(int $id): array
{
// TODO: Implement getLists() method. return ["id" => $id, "ver" => "1.2"];
} /**
* @return string
*/
public function getBig(): string
{
// TODO: Implement getBig() method. return "dddd_V2";
}
}
不同的地方在  @Service(version="1.2") ,定义不同版本

  3、启动访问:

//单独启动rpc
php bin/swoft rpc:start //启动http、伴随启动RPC
php bin/swoft http:start

RPC客户端:服务调用方法,通过使用服务提供方法,提供的lib接口,调用接口实现服务,不需要了解实现细节

  一:配置,客户端也需要安装swoft,在其/app/bean.php 中添加

 //定义RPC客户端连接,TCP方式,端口为RPC服务器端口
return [
   'user' => [
'class' => ServiceClient::class,
'host' => '127.0.0.1', //服务端IP
'port' => 18307, //服务端RPC的端口
'setting' => [
'timeout' => 0.5,
'connect_timeout' => 1.0,
'write_timeout' => 10.0,
'read_timeout' => 0.5
],
'packet' => bean('rpcClientPacket')
],
'user.pool' => [
'class' => ServicePool::class,
'client' => bean('user'),
],
]

  二:使用:

    (1) : 拷贝服务端的 /app/Rpc/Lib/ 文件夹到客户端的 /app/Rpc/Lib/

    (2) :在客户端的 /app/Http/Controller/ 文件夹下添加控制器 RpcClientController.php

<?php
namespace App\Http\Controller; use App\Rpc\Lib\DemoInterface;
use Exception;
use Swoft\Http\Server\Annotation\Mapping\Controller;
use Swoft\Http\Server\Annotation\Mapping\RequestMapping;
use Swoft\Rpc\Client\Annotation\Mapping\Reference; /**
* Class RpcClientController
*
* @Controller(prefix="/rpcApi") //定义路由
*
*/
class RpcClientController{
/**
* @Reference(pool="user.pool") //pool 指定使用那个服务的连接池(使用那个服务),version 指定服务的版本
*
* @var DemoInterface
*/
private $userSer; /**
* @Reference(pool="user.pool", version="1.2") //pool 指定使用那个服务的连接池(使用那个服务),version 指定服务的版本
*
* @var DemoInterface
*/
private $userSerV2; /**
* @RequestMapping("rpcV1") //访问路由 /rpcApi/recV1/
*/
public function getRpcApiV1(): array {
$result = $this->userSer->getLists(21); //调用1.0版本接口
$resultV2 = $this->userSerV2->getLists(33); //调用1.2版本接口
return [$result,$resultV2];
} /**
* @return array
* @RequestMapping("rpcV2")
*/
public function getBigString(): array {
$bigV1 = $this->userSer->getBig();
$bigV2 = $this->userSerV2->getBig(); return [strlen($bigV1),strlen($bigV2)];
}
}

使用非swoft客户端框架访问RPC ,参考官方文档 : https://www.swoft.org/docs/2.x/zh-CN/rpc-client/usage.html

参考文档:https://www.swoft.org/docs/2.x/zh-CN/rpc-server/index.html

       https://www.swoft.org/docs/2.x/zh-CN/rpc-client/index.html

     与Swoft RPC Server通信的Client扩展:  https://www.ctolib.com/article/compares/91157

 

最新文章

  1. Leetcode 254. Factor Combinations
  2. 58. N-Queens &amp;&amp; N-Queens II
  3. 基于微信红包插件的原理实现android任何APP自动发送评论(已开源)
  4. Web.Config文件中使用configSource
  5. MySql运算符
  6. Yii 图片FTP批量上传 并生成缩略图
  7. WPF DataGrid 之数据绑定
  8. Joomla 3.x. How to edit registration page
  9. Java项目开发第二天
  10. mybatis 一对多和多对一关联查询
  11. java.util报错
  12. Java部署项目命令学习小结
  13. 【python 3】 字符串方法操作汇总
  14. 0x80070522:客户端没有所需的特权的解决方法(win7,win10通过)
  15. hive中的分桶表
  16. VidLoc: A Deep Spatio-Temporal Model for 6-DoF Video-Clip Relocalization
  17. WPF 多线程异常抛送到UI线程
  18. linux ping报错Name or service not known
  19. sd卡不能格式化
  20. EXCEL 单元格引用问题

热门文章

  1. Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)
  2. 【CF671D】 Roads in Yusland(对偶问题,左偏树)
  3. Django环境搭建win(二)
  4. java实现自定义同步组件的过程
  5. ES6中的模板字符串使用方法
  6. 打印li索引值
  7. XGBoost原理简介
  8. yield and send的使用详细解释
  9. synchronized对象解析
  10. Redis调试 Centos