简介
本节将讲述在 Hyperf 里如何搭建一个 JSONRPC 协议的服务提供者和服务消费者,包括直接指定对端节点信息消费服务,和通过将服务提供者注册到 Consul 并由服务消费者从 Consul 拉取健康的服务节点信息完成 RPC 请求。
RPC
概念
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务。也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
原理
RPC的设计由Client,Client stub,Network ,Server stub,Server构成。 其中Client就是用来调用服务的,Cient stub是用来把调用的方法和参数序列化的(因为要在网络中传输,必须要把对象转变成字节),Network用来传输这些信息到Server stub, Server stub用来把这些信息反序列化的,Server就是服务的提供者,最终调用的就是Server提供的方法。
- Client像调用本地服务似的调用远程服务;
- Client stub接收到调用后,将方法、参数序列化
- 客户端通过sockets将消息发送到服务端
- Server stub 收到消息后进行解码(将消息对象反序列化)
- Server stub 根据解码结果调用本地的服务
- 本地服务执行(对于服务端来说是本地执行)并将结果返回给Server stub
- Server stub将返回结果打包成消息(将结果消息对象序列化)
- 服务端通过sockets将消息发送到客户端
- Client stub接收到结果消息,并进行解码(将结果消息发序列化)
- 客户端得到最终结果。
作用
- 可以做到分布式,现代化的微服务
- 部署灵活
- 解耦服务
- 扩展性强
RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里。通过RPC能解耦服务,这才是使用RPC的真正目的。
服务提供者
服务接口
接口实现类
配置
服务消费者
服务接口
此处服务接口与服务提供者接口相同,将来统一抽离。
配置
调用
Consul注册中心
启动consul
./consul agent -dev
生成consul配置文件
php hyperf.php vendor:publish