1. “暴露”的本质
RPC调用的本质是进程间通信,就是不同JVM中两个服务之间的通信,在计算机操作系统上进程间通信的方式有几种:共享内存、管道、socket。其中socket通信是不同机器不同进程之间通信最方便的方式。所以说暴露的本质就是将需要的暴露服务监听一个端口,无论是哪一中RPC的实现,无论是dubbo还是RMI都是一样。 这样当别人访问这个ip和端口的时候就可以根据传入的参数来进行回调本地的实现,最后将处理的结果返回。
2.dubbo 暴露服务的细节
先说一些dubbo设计的基本概念:
- invoker
整个dubbo调用过程的核心,在服务方封装了服务实现类 - invoker 调用链
dubbo实现了类似 java web的filter,这样在实际的调用中间环节中可以进行不同的操作,比如监控调用时间、泛化引用的处理、回声测试、token的处理、tps限流,而且可以根据需要自定义filter加入invoker调用链。
1. 一个基本的暴露流程
- 将服务实现封装成invoker
- 形成invoker调用链
- 将invoker调用链封装成exporter,存入exporterMap中,key是根据invoker的url来生成
- 起一个服务端的socketserver,监听端口。
** 2. 当服务端收到请求的时候,如何找到对应的实现类进行调用?**
如果服务器使用的是netty服务器,我们知道在netty服务端创建的时候,可以增加通道处理器,这样在收到请求的时候,就可以回调这些通道处理器,在处理器中根据调用信息生成key,从exporterMap找到对应的expoter,从而找到invoker调用链,invoker中封装了底层的实现类,完成回调,最后将结果封装返回到请求方
网友评论