rpc是什么
rpc全名是Remote Procedure Call。意思就是远程接口调用。一般用于我们的分布式系统中,从系统A调用系统B的一个接口。可能你有个疑问,从系统A调用一个系统B的接口,我们平常使用http请求,或者webservice都可以调到系统B的接口。但是这种方式的调用,我们都需要写一份建立http请求的代码。一般的rpc框架,需要做到的是调用远程的服务跟调用本地的服务一样。
比如系统B有如下接口:
public interface HelloService {
public String sayHello(String name);
}
然后系统B的实现是:
public class HelloServiceImpl implements HelloService {
public String sayHello(String name) {
return "Hello " + name;
}
}
如果我们在系统B调用这个类的这个方法。我们一般会这么写
HelloService helloService = new HelloService();
System.out.println(helloService.sayHello("123"));
rpc框架,所需要达到的效果,就是想让你在系统A中也能使用类似上述的方式来进行调用系统B的接口,即能类似调用本地方法的方式来调用远程方法
实现一个rpc需要什么
1.首先需要有服务的提供方provider吧
2.然后要有服务的调用方comusmer吧
3.consumer要知道对应的provider在哪里,那就需要一个注册中心吧,从这个注册中心可以找到provider
4.有了注册中心,可能同一个服务有好几个服务器提供,那consumer需要选择哪个服务器进行服务调用,这就是负载均衡,所以也还要有一个负载均衡的算法
5.调用的协议要有把,http协议,netty啥的?
6.网络间传输需要序列化吧,序列化可以使用jdk默认的序列化方式。
7.上述的从注册中心发现服务,然后使用负载均衡算法选择其中的一个服务器进行调用,再选择对应的网络传输协议,再使用对应的序列化方式。这些我们进行服务调用的时候希望使用上述的方式来调用,那调用的HelloService肯定是一个代理对象,这个代理对象里封装了上面的所有的操作。
按照上面的逻辑,可以自己搭建一个简易的rpc框架。
依照上述逻辑写了一个rpc的demo:https://github.com/nanjunbo/rpcDemo
更复杂的可以去看下dubbo的逻辑,他分了10层服务。扩展性很好,每一层都可以单独抽出来供更上层调用。
网友评论