Swoft2.x 小白学习笔记 (四) --- RPC
介绍 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的更多相关文章
- Swoft2.x 小白学习笔记 (一) ---控制器
Swoft通过官方文档进行学习,这里不做介绍,直接上手. 涉及到Swoft方面:(配置.注意的坑) 1.控制器(路由.验证器.中间件) 2.mysql (Model使用).Redis配置及通用池 3 ...
- Swoft2.x 小白学习笔记 (二) --- mysql、redis
介绍swoft中 1.mysql. 2.Redis 一.mysql使用: 1.配置,在 app\bean.php文件中 'db' => [ 'class' => Database::cla ...
- Swoft2.x 小白学习笔记 (三) --- Task、协程
介绍swoft中 1.Task 2.协程 一:Task任务: 1.配置,在 app/bean.php文件中加入 'httpServer' => [ // ... 'on' => [ Swo ...
- go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)
目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
随机推荐
- Linux之GDB命令(二)
gdb命令: 前提条件:可执行文件必须包含调试信息 gcc -g gdb 文件名 –启动gdb调试 查看代码命令 当前文件: list 行号(函数名) 指定文件: list 文 ...
- 基础 Linux 命令速查清单
jaywcjlove/linux-command: Linux命令大全搜索工具,内容包含Linux命令手册.详解.学习.搜集.https://git.io/linux https://github. ...
- [Linux]kali更新/etc/apt/sources.list
vim /etc/apt/sources.list #中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contri ...
- java虚拟机JVM
Java Virtual Machine ,简称JVM; 它是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一,JVM读取并处理编译过的与平台无关的字节码 ...
- Lombok Pojo默认初始值问题
Lombok以注解形式来简化java代码,提高开发效率.比如我们常用的@Builder.@Data.@AllArgsConstructor.@NoArgsConstructor.@ToString等. ...
- Linux 常用命令安装
系统版本: Centos-7-x86_64-minimal 1. 网络相关 1.1 MTR 跟踪路由,还可以测试丢包率.网络延迟 yum -y install mtr 2. 文件相关 2.1 sz ...
- Linux设备驱动程序 之 内核符号表
insmod使用公共内核符号表来解析模块中未定义的符号.功能内核符号表中包含了所有全局内核项(函数和变量)的地址,这是实现模块化驱动程序所必须的.当模块装载到内核后,它所导出的任何符号都会变成内核符号 ...
- LeetCode 84. 柱状图中最大的矩形(Largest Rectangle in Histogram)
题目描述 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的 ...
- HearthBuddy CSharpCodeProvider 如何编译cs文件
源码 源码1 namespace Hearthbuddy.Windows{ // Token: 0x02000041 RID: 65 public class MainWindow : W ...
- CentOS 7服务器下Nginx安装配置
一.安装编译工具及库文件 $ yum -y install make zlib zlib-devel gcc gcc-c++ libtool openssl openssl-devel pcre pc ...