何为rpc

本文转自: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序号的含义如下:

  1. Client像调用本地服务似的调用远程服务;
  2. Client stub接收到调用后,将方法、参数序列化
  3. 客户端通过sockets将消息发送到服务端
  4. Server stub 收到消息后进行解码(将消息对象反序列化)
  5. Server stub 根据解码结果调用本地的服务
  6. 本地服务执行(对于服务端来说是本地执行)并将结果返回给Server stub
  7. Server stub将返回结果打包成消息(将结果消息对象序列化)
  8. 服务端通过sockets将消息发送到客户端
  9. Client stub接收到结果消息,并进行解码(将结果消息发序列化)
  10. 客户端得到最终结果.

二,做个简单的RPC程序,这里使用Dubbo做demo

首先填充下节点角色:

Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方

这里关于消费端(客户端)和服务端的配置文件就不写,主要写一下服务的暴露,实现和调用

1.服务端接口暴露:

1
2
3
4
public interface xService {
String upPicture(String cityId) throws Exception;

}

2.服务端接口的实现

1
2
3
4
5
6
7
@Slf4j
@Service(interfaceClass = CloudService.class)
public class xServiceImpl implements xService {
public String upPicture(String cityId) throws Exception {
log.info("xxx");
}
}

3.消费端(客户端)远程调用

1
2
3
4
5
6
7
public class Cust {
@Reference
private xService xservice;
public void custXservice(){
xservice.upPicture("0755");
}
}

这样一个简单的rpc服务就完成了。

其中@Service,@Reference分别是dubbo中的接口,分别表示注解暴露服务、注解引用服务