服务提供者
启动服务提供者容器
docker run --name hyperf_ser -v /e/php_code/hyperf-skeleton/user:/hyperf-skeleton -p 9501:9501 -it --privileged -u root --entrypoint /bin/sh hyperf/hyperf:8.0-alpine-v3.15-swoole
安装hyperf
composer create-project hyperf/hyperf-skeleton hyperf
cd hyperf
将 Composer 镜像设置为阿里云镜像,加速国内下载速度
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer
进入hyperf项目后安装以下依赖
composer require hyperf/json-rpc //只是 JSON RPC 的协议处理的组件
composer require hyperf/rpc-server //JSON RPC 服务端
composer require hyperf/service-governance
composer require hyperf/service-governance-nacos //发布到服务中心时 需要用到这个组件
publishTo 属性为定义该服务所要发布的服务中心,目前仅支持 consul、nacos 或为空,为空时代表不发布该服务到服务中心去,但也就意味着您需要手动处理服务发现的问题,要使用此功能需安装 hyperf/service-governance 组件及对应的驱动依赖。
可以看一下 服务注册篇:https://hyperf.wiki/3.0/#/zh-cn/service-register
配置和代码
定义服务提供者:进入到config/autoload/server.php 在servers中添加下面配置:
[
'name' => 'jsonrpc-http',
'type' => Server::SERVER_HTTP,
'host' => '0.0.0.0',
'port' => 9504,
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
Event::ON_REQUEST => [Hyperf\JsonRpc\HttpServer::class, 'onRequest'],
],
],
完整代码:
server.php
<?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
*/
use Hyperf\Server\Event;
use Hyperf\Server\Server;
use Swoole\Constant;
return [
'mode' => SWOOLE_PROCESS,
'servers' => [
[
'name' => 'http',
'type' => Server::SERVER_HTTP,
'host' => '0.0.0.0',
'port' => 9511,
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
Event::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'],
],
],
[
'name' => 'jsonrpc-http',
'type' => Server::SERVER_HTTP,
'host' => '0.0.0.0',
'port' => 9504,
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
Event::ON_REQUEST => [Hyperf\JsonRpc\HttpServer::class, 'onRequest'],
],
],
],
'settings' => [
Constant::OPTION_ENABLE_COROUTINE => true,
Constant::OPTION_WORKER_NUM => swoole_cpu_num(),
Constant::OPTION_PID_FILE => BASE_PATH . '/runtime/hyperf.pid',
Constant::OPTION_OPEN_TCP_NODELAY => true,
Constant::OPTION_MAX_COROUTINE => 100000,
Constant::OPTION_OPEN_HTTP2_PROTOCOL => true,
Constant::OPTION_MAX_REQUEST => 100000,
Constant::OPTION_SOCKET_BUFFER_SIZE => 2 * 1024 * 1024,
Constant::OPTION_BUFFER_OUTPUT_SIZE => 2 * 1024 * 1024,
],
'callbacks' => [
Event::ON_WORKER_START => [Hyperf\Framework\Bootstrap\WorkerStartCallback::class, 'onWorkerStart'],
Event::ON_PIPE_MESSAGE => [Hyperf\Framework\Bootstrap\PipeMessageCallback::class, 'onPipeMessage'],
Event::ON_WORKER_EXIT => [Hyperf\Framework\Bootstrap\WorkerExitCallback::class, 'onWorkerExit'],
],
];
定义服务接口类
创建接口类:App\JsonRpc\TestServiceInterface
<?php
namespace App\JsonRpc;
interface TestServiceInterface
{
public function sum(int $a, int $b): int;
public function diff(int $a, int $b): int;
}
定义接口实现类
创建实现类: App\JsonRpc\TestService
<?php
namespace App\JsonRpc;
use Hyperf\RpcServer\Annotation\RpcService;
#[RpcService(name: "TestService",protocol: "jsonrpc-http",server: "jsonrpc-http",publishTo: "nacos")]
class TestService implements TestServiceInterface
{
public function sum(int $a, int $b): int
{
return $a + $b;
}
public function diff(int $a, int $b): int
{
return $a - $b;
}
}
@RpcService 共有 4 个参数:
name 属性为定义该服务的名称,这里定义一个全局唯一的名字即可,Hyperf 会根据该属性生成对应的 ID 注册到服务中心去;
protocol 属性为定义该服务暴露的协议,目前仅支持 jsonrpc 和 jsonrpc-http,分别对应于 TCP 协议和 HTTP 协议下的两种协议,默认值为 jsonrpc-http,这里的值对应在 Hyperf\Rpc\ProtocolManager 里面注册的协议的 key,这两个本质上都是 JSON RPC 协议,区别在于数据格式化、数据打包、数据传输器等不同。
server 属性为绑定该服务类发布所要承载的 Server,默认值为 jsonrpc-http,该属性对应 config/autoload/server.php 文件内 servers 下所对应的 name,这里也就意味着我们需要定义一个对应的 Server;
publishTo 属性为定义该服务所要发布的服务中心,目前仅支持 consul、nacos 或为空,为空时代表不发布该服务到服务中心去,但也就意味着您需要手动处理服务发现的问题,要使用此功能需安装 hyperf/service-governance 组件及对应的驱动依赖;
最后配置服务驱动
此地址为服务中心的地址,在启动服务时,Hyperf 会自动地将 @RpcService 定义了 publishTo 属性为 nacos的服务注册到服务中心去。
新建config/autoload/services.php文件,以下是配置:
<?php
return [
'enable' => [
'discovery' => true,
'register' => true,
],
'consumers' => [],
'providers' => [],
'drivers' => [
'nacos' => [
// nacos server url like https://nacos.hyperf.io, Priority is higher than host:port
// 'url' => '',
// The nacos host info
'host' => '117.108.30.33',//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 //是否注册临时实例
],
],
];
ip等配置根据自己的来写啊
以上就完成配置和代码了,最后执行:
php bin/hyperf.php start
启动后:
docker中显示:
image.png
代表注册成功,每五秒心跳一次。
在nacos中可以看到:
image.png
最后如果想要在一个项目中同时实现消费者的话:
1.安装客户端,composer require hyperf/rpc-client
- 在services.php中增加这段配置
'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://96.125.168.77:8848/nacos/#/login',
],
]
],
3.在Index中编写方法
use App\JsonRpc\UserServiceInterface;
use Hyperf\Di\Annotation\Inject;
/**
* @var UserServiceInterface
*/
#[Inject]
private $userService;
public function index()
{
$result = $this->userService->sum(1,2);
var_dump($result);
return $result;
}
//这样写也行
//#[Inject]
//private UserServiceInterface $userService;
//public function index()
//{
// $result = $this->userService->sum(1,2);
// var_dump($result);
// return $result;
//}
最后访问接口即可












网友评论