介绍 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

 

Swoft2.x 小白学习笔记 (四) --- RPC的更多相关文章

  1. Swoft2.x 小白学习笔记 (一) ---控制器

    Swoft通过官方文档进行学习,这里不做介绍,直接上手. 涉及到Swoft方面:(配置.注意的坑) 1.控制器(路由.验证器.中间件) 2.mysql  (Model使用).Redis配置及通用池 3 ...

  2. Swoft2.x 小白学习笔记 (二) --- mysql、redis

    介绍swoft中 1.mysql. 2.Redis 一.mysql使用: 1.配置,在 app\bean.php文件中 'db' => [ 'class' => Database::cla ...

  3. Swoft2.x 小白学习笔记 (三) --- Task、协程

    介绍swoft中 1.Task 2.协程 一:Task任务: 1.配置,在 app/bean.php文件中加入 'httpServer' => [ // ... 'on' => [ Swo ...

  4. go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)

    目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...

  5. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  6. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  7. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. Pytest学习笔记(三) 在代码中运行pytest

    前面介绍的是在cmd中执行pytest,平常我们一般都是通过编译器(如pycharm)来编写用例的,写完用例后,需要调试看看是否能运行,如果每次都切换到cmd中执行,太麻烦. 因此,这一节来说下怎么在 ...

  2. TypeScript 技巧

    前言 很早以前就尝试过使用 TypeScript 来进行日常编码,但自己对静态类型语言的了解并不深入,再加上 TypeScript 的类型系统有着一定的复杂度,因此感觉自己并没有发挥好这门语言的优势, ...

  3. scarpy crawl 爬取微信小程序文章(将数据通过异步的方式保存的数据库中)

    import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider ...

  4. Java项目服务器跨域设置

    引入jar包 cors-filter-2.6 :http://central.maven.org/maven2/com/thetransactioncompany/cors-filter/2.6/co ...

  5. 【软件工程】Alpha冲刺 (5/6)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 学习调用中国天气网API,接近实现天气推送功能 对天气推送的形式进行讨论及重确 ...

  6. Flutter移动电商实战 --(1)项目学习记录

    1.项目相关截图 2.项目知识点梳理图 Dio2.0: Dio是一个强大的 Dart Http 请求库,支持 Restful API.FormData.拦截器.请求取消等操作. Swiper: Swi ...

  7. rocketmq备忘

    rocketmq unrecognized VM option 'MetaspaceSize=128m' => jdk1.8 JAVA_HOME https://blog.csdn.net/c3 ...

  8. 基于角色的权限控制系统(role-based access control)

    role-based access control(rbac),指对于不同角色的用户,拥有不同的权限 .用户对应一个角色,一个角色拥有若干权限,形成用户-角色-权限的关系,如下图所示.当一个用户进行访 ...

  9. js 时间戳格式化日期格式

    时间戳转换为日期,网上搜了好几个或多或少都有点问题,自己整理了一下,写了个方法 console.log(formatDate(1565280000000)) 输出: 2019-08-09 00:00: ...

  10. mybatis配置文件祥解(mybatis.xml)

    以下是mybatis.xml文件,提倡放在src目录下,文件名任意 <?xml version="1.0" encoding="UTF-8"?> & ...