使用springboot,http实现简单的RPC协议框架
一、 RPC协议的作用
RPC(Remote Procedure Call),远程过程调用,就是像调用本服务中的函数一样去调用别的服务中的函数。
二、RPC与HTTP的区别
远程过程调用这一功能也可用HTTP协议实现,例如服务B暴露Restful接口,然后让服务A调用它的接口。基于Restful的调用方式因为可读性好(服务B暴露出的是Restful接口,可读性当然好)而且HTTP请求可以通过各种防火墙,因此非常不错。
然而,基于Restful的远程过程调用有着明显的缺点,首先是有用信息占比少,毕竟HTTP工作在第七层,包含了大量的HTTP头等信息。其次是效率低,要封装各种参数名和参数值。当存在大量的服务间调用时,这些缺点变得更为突出。
服务A调用服务B的过程是应用间的内部过程,牺牲可读性提升效率、易用性是可取的。而RPC就是为了提高服务间调用的效率而产生的。RPC要求在调用方中放置被调用的方法的接口,调用方调用接口内部的一个方法,但是被RPC框架偷梁换柱为远程的一个方法。服务之间的通信数据可读性不需要好,只需要RPC框架能读懂即可,因此效率可以更高。
三、实现一个简单的RPC客户端和服务端
HTTP协议使用TCP协议通信。RPC协议可使用UDP协议或TCP协议通信,当然也可以使用HTTP协议通信。例如下面的示例中,为了保证实现最简单,就用了HTTP进行通信。代码地址
1. 新建Springboot项目,访问本服务中的方法
- 新建一个maven工程,并添加一个名为rpcclient的springboot模块,里面有
UserController.java
类,UserService.java
接口,UserServiceImpl.java
类,User.java
类,RpcclientApplication.java
类
- UserServiceImpl类使用@Service注解,定义为一个bean,交由Sping容器管理。
//UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
@Override
//public User getUserInfo(int id) {
//User user = setUser(id);
//return user;
//}
public String getUserInfo(int id) {
User user = setUser(id)