创建服务消费者:
1.先搞个容器
docker run --name hyperf_xiaofei -v /e/php_code/hyperf-skeleton/xiaofei:/hyperf-skeleton -p 9512:95012 -it --privileged -u root --entrypoint /bin/sh hyperf/hyperf:8.0-alpine-v3.15-swoole
主要是为了区分端口。
2.新建项目:
composer create-project hyperf/hyperf-skeleton rpc_consume
rpc_consume是项目名称
3.安装jsonRpc组件&客户端:
composer require hyperf/json-rpc //jsonRpc组件
composer require hyperf/rpc-client //客户端
报错(Config of registry or nodes missing),检查文件services.php无误发现还需组件:
composer require hyperf/service-governance-nacos
4.报错(cURL error 7: Failed to connect to 127.0.0.1 port 8848 after 0 ms: Connection refused)
,直接按照文档配置开始就感觉有点不对劲,服务提供时新开的namespace_id不用配置?最后发现在服务提供者那和consumers
同级有个drivers
,直接带过来就可以了。直接看第七条也行。
5.server.php
中需要修改port
为9512
6.新建UserServiceInterface
接口类
<?php
namespace App\JsonRpc;
interface UserServiceInterface
{
public function sum(int $a,int $b);
}
image.png
7.增加services.php
配置,用于自动创建代理消费者类。
<?php
return [
// 此处省略了其它同层级的配置
'consumers' => [
[
// name 需与服务提供者的 name 属性相同
'name' => 'UserService',
// 服务接口名,可选,默认值等于 name 配置的值,如果 name 直接定义为接口类则可忽略此行配置,如 name 为字符串则需要配置 service 对应到接口类
'service' => \App\JsonRpc\UserServiceInterface::class,
// 对应容器对象 ID,可选,默认值等于 service 配置的值,用来定义依赖注入的 key
'id' => \App\JsonRpc\UserServiceInterface::class,
// 服务提供者的服务协议,可选,默认值为 jsonrpc-http
// 可选 jsonrpc-http jsonrpc jsonrpc-tcp-length-check
'protocol' => 'jsonrpc-http',
// 负载均衡算法,可选,默认值为 random
'load_balancer' => 'random',
// 这个消费者要从哪个服务中心获取节点信息,如不配置则不会从服务中心获取节点信息
'registry' => [
'protocol' => 'nacos',
'address' => 'http://447.888.77.13:8848/nacos/#/login',
],
]
],
//Nacos服务驱动相关配置 官方文档是只有上面的配置
'drivers' => [
'nacos' => [
// nacos server url like https://nacos.hyperf.io, Priority is higher than host:port
// 'url' => '',
// The nacos host info
'host' => '110.11.00.55',//ip地址
'port' =>'8848/nacos/#/login',//端口号,之前只写8848不行 还是要加上后边儿的才可以,相当于到登录页面
// The nacos account info
'username' => 'nacos',//账号
'password' => 'nacos',//密码
'group_name' => 'DEFAULT_GROUP',//分组名称 一般大家都写这个
'namespace_id' => 'public',//命名空间 可选 (public/dev/test/pro)
'heartbeat' => 5,//心跳 五秒一次
'ephemeral'=>true //是否注册临时实例
],
],
];
8.在Index中编写方法
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace App\Controller;
use App\JsonRpc\UserServiceInterface;
use Hyperf\Di\Annotation\Inject;
class IndexController extends AbstractController
{
/**
* @var UserServiceInterface
*/
#[Inject]
private $userService;
public function index()
{
$result = $this->userService->sum(1,2);
var_dump($result);
return $result;
}
}
这样就可以执行到服务提供者的 sum函数。
启动服务提供者;
再访问接口 http://localhost:9512/
就会输出 3
拓展
配置复用
通过循环生成配置
1.配置服务消费者绑定关系
<?php
//定义服务消费者配置文件,用来快速注册服务消费者
return [
//用户服务 服务名=>接口文件
'UserService' => \App\JsonRpc\UserServiceInterface::class,
'HyperfTest' => \App\JsonRpc\TestServiceInterface::class,
];
2.通过在 config/autoload/services.php
配置文件内进行一些简单的配置,即可通过[动态代理]自动创建消费者类。
<?php
return [
// 此处省略了其它同层级的配置
//通过闭包函数完成多个服务消费者的定义
'consumers' => value(function () {
$consumers = [];
// 这里示例自动创建代理消费者类的配置形式,顾存在 name 和 service 两个配置项,这里的做法不是唯一的,仅说明可以通过 PHP 代码来生成配置
// 下面的 FooServiceInterface 和 BarServiceInterface 仅示例多服务,并不是在文档示例中真实存在的
$services = include __DIR__ . '/service_consumers.php';
foreach ($services as $name => $interface) {
$consumers[] = [
'name' => $name,
'service' => $interface,
'registry' => [
'protocol' => 'nacos',
'address' => 'http://11.11.11.33:8848/nacos/#/login',
]
];
}
return $consumers;
}),
// 'consumers' => [
// [
// // name 需与服务提供者的 name 属性相同
// 'name' => 'UserService',
// // 服务接口名,可选,默认值等于 name 配置的值,如果 name 直接定义为接口类则可忽略此行配置,如 name 为字符串则需要配置 service 对应到接口类
// 'service' => \App\JsonRpc\UserServiceInterface::class,
// // 对应容器对象 ID,可选,默认值等于 service 配置的值,用来定义依赖注入的 key
// 'id' => \App\JsonRpc\UserServiceInterface::class,
// // 服务提供者的服务协议,可选,默认值为 jsonrpc-http
// // 可选 jsonrpc-http jsonrpc jsonrpc-tcp-length-check
// 'protocol' => 'jsonrpc-http',
// // 负载均衡算法,可选,默认值为 random
// 'load_balancer' => 'random',
// // 这个消费者要从哪个服务中心获取节点信息,如不配置则不会从服务中心获取节点信息
// 'registry' => [
// 'protocol' => 'nacos',
// 'address' => 'http://11.11.11.33:8848/nacos/#/login',
// ],
// ]
// ],
//Nacos服务驱动相关配置
'drivers' => [
'nacos' => [
// nacos server url like https://nacos.hyperf.io, Priority is higher than host:port
// 'url' => '',
// The nacos host info
'host' => '11.11.11.33',//ip地址
'port' =>'8848/nacos/#/login',//端口号,之前只写8848不行 还是要加上后边儿的才可以,相当于到登录页面
// The nacos account info
'username' => 'nacos',//账号
'password' => 'nacos',//密码
'group_name' => 'DEFAULT_GROUP',//分组名称 一般大家都写这个
'namespace_id' => 'test',//命名空间 可选 (public/dev/test/pro)
'heartbeat' => 5,//心跳 五秒一次
'ephemeral'=>true //是否注册临时实例
],
],
];
3.封装rpc调用方法
可以通过封装简易调用方法,以方便业务开发者使用,不需要关注调用逻辑。
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace App\Controller;
use Hyperf\Context\ApplicationContext;
class IndexController extends AbstractController
{
public function index()
{
//调用demo ( 接口类,方法名,数组参数)
$result = $this->rpc('\App\JsonRpc\UserServiceInterface','sum', [110,100]);
$result2 = $this->rpc('\App\JsonRpc\TestServiceInterface','sum', [110,100]);
var_dump($result);
var_dump($result2);
}
//封装简易rpc调用,
public function rpc($interface, $function, $args)
{
$interface = (new \ReflectionClass($interface))->getName();
$data = ApplicationContext::getContainer()->get($interface)->$function($args);
return $data;
}
}
执行后拿到输出
image.png
4.消费者项目中用到的两个接口。
TestServiceInterface
<?php
namespace App\JsonRpc;
interface TestServiceInterface
{
public function sum(array $args): int;
public function diff(int $a, int $b): int;
}
UserServiceInterface
<?php
namespace App\JsonRpc;
interface UserServiceInterface
{
public function sum(array $args): int;
public function diff(int $a, int $b): int;
}
5.UserService服务提供者两个类:
<?php
namespace App\JsonRpc;
use Hyperf\RpcServer\Annotation\RpcService;
#[RpcService(name: "UserService",protocol: "jsonrpc-http",server: "jsonrpc-http",publishTo: "nacos")]
class UserService implements UserServiceInterface
{
public function sum(array $args): int
{
return array_sum($args);
}
public function diff(int $a, int $b): int
{
return $a - $b;
}
}
<?php
namespace App\JsonRpc;
interface UserServiceInterface
{
public function sum(array $args): int;
public function diff(int $a, int $b): int;
}
6.HyperfTest服务提供者两个类:
<?php
namespace App\JsonRpc;
use Hyperf\RpcServer\Annotation\RpcService;
#[RpcService(name: "HyperfTest",protocol: "jsonrpc-http",server: "jsonrpc-http",publishTo: "nacos")]
class TestService implements TestServiceInterface
{
public function sum(array $args): int
{
return array_sum($args)+102;
}
public function diff(int $a, int $b): int
{
return $a - $b;
}
}
<?php
namespace App\JsonRpc;
interface TestServiceInterface
{
public function sum(array $args): int;
public function diff(int $a, int $b): int;
}
转载:https://blog.csdn.net/LuckyStar_D/article/details/125404054
网友评论