1、注册中心
2、服务端(提供者)
3、客户端(调用者)
4、监控中心
API层:
1、Service(业务层,开发者实现的业务代码)
2、Config(配置层,主要围绕ServiceConfig和ReferenceConfig类,管理配置)
SPI层:
1、Proxy(服务代理层,无论生产者还是消费者,都会生成代理类。完成远程调用)
2、Registry(注册层。负责注册和发现)
3、Cluster(集群容错层。远程调用失败的容错机制,选择调用节点的负载均衡策略)
4、Monitor(监控层,主要统计调用次数和时间等。)
5、Protocol(远程调用层。封装RPC调用具体过程,是Invoker暴露和引用的主功能入口)
6、Exchange(信息交换层。建立Request-Response模型,封装请求响应模式)
7、Transport(网络传输层。把网络传输抽象为统一接口。)
8、Seriallze(序列化层。负责序列化和反序列化)
服务暴露过程:
1、服务端在启动时,初始化服务实例
2、通过Proxy组件调用具体的协议(Protocol),把服务端要暴露的接口封装成Invoker,
3、然后转换成Exporter,
4、框架会打开服务端口等并记录服务实例到内存中。
5、最后通过Registry把服务元数据注册到注册中心。
客户端调用过程:
1、消费者调用,先通过Proxy
2、Proxy持有一个Invoker对象
3、然后出发invoke调用。
4、在invoke过程中,需要使用Cluster(负责容错),如调用失败的重试。
5、Cluster在调用之前会通过Directory获取所有可以调用的远程服务Invoker列表
6、通过路由规则将Invoker列表过滤一遍
7、通过LoadBlance方法做负载均衡,最后选出一个Invoker。
8、Invoker经过过滤链,过滤链通常处理上下文,限流,计算等。
9、使用Client做数据传输。
10、使用Codec做私有协议构造。
11、构造完成后,对数据包做序列化,然后传输到服务器提供者。
12、服务提供者收到数据包,也使用Codec处理协议,然后对完整的数据报文做反序列化。
(Request)
13、Request被分配到线程池中进行处理。
14、Server处理Request.
15、根据请求查询到对应的Exporter(内部持有Invoker)
16、经过过滤链Filter
17、得到接口的具体实现,并且调用,再原路把结果返回。