本文转自:https://www.javazhiyin.com/17912.html 。
一:什么是RPC
1.什么是RPC
RPC是基于JDK动态代理。
RPC是Remote Procedure Call的缩写,即远程过程调用,意思是可以在一台机器上调用远程的服务。在非分布式环境下,我们的程序调用服务都是本地调用,但是随着分布式结构的普遍,越来越多的应用需要解耦,将不同的独立功能部署发布成不同的服务供客户端调用,RPC就是为了解决这个问题的。
2.RPC原理
如何去调用一个远程的服务?
①肯定要知道IP和端口吧(确定唯一一个进程)
②肯定要知道调用什么服务吧(方法名和参数)
③调用服务后可能需要结果吧。
这三点又怎么实现呢?往下看:
RPC的设计由Client,Client stub,Network ,Server stub,Server构成。
其中Client就是用来调用服务的,Cient stub是用来把调用的方法和参数序列化的(因为要在网络中传输,必须要把对象转变成字节),Network用来传输这些信息到Server stub, Server stub用来把这些信息反序列化的,Server就是服务的提供者,最终调用的就是Server提供的方法。
RPC的结构如下图:
图中1-10序号的含义如下:
- Client像调用本地服务似的调用远程服务;
- Client stub接收到调用后,将方法、参数序列化
- 客户端通过sockets将消息发送到服务端
- Server stub 收到消息后进行解码(将消息对象反序列化)
- Server stub 根据解码结果调用本地的服务
- 本地服务执行(对于服务端来说是本地执行)并将结果返回给Server stub
- Server stub将返回结果打包成消息(将结果消息对象序列化)
- 服务端通过sockets将消息发送到客户端
- Client stub接收到结果消息,并进行解码(将结果消息发序列化)
- 客户端得到最终结果.
二,做个简单的RPC程序,这里使用Dubbo做demo
首先填充下节点角色:
Provider |
暴露服务的服务提供方 |
---|---|
Consumer |
调用远程服务的服务消费方 |
这里关于消费端(客户端)和服务端的配置文件就不写,主要写一下服务的暴露,实现和调用
1.服务端接口暴露:
1 | public interface xService { |
2.服务端接口的实现
1 | @Slf4j |
3.消费端(客户端)远程调用
1 | public class Cust { |
这样一个简单的rpc服务就完成了。
其中@Service,@Reference分别是dubbo中的接口,分别表示注解暴露服务、注解引用服务