Skip to the content.

首页

RPC


概念

RPC(Remote Procedure Call) 即远程过程调用,是为了让调用远程方法就像调用本地方法一样简单。

组成:


Dubbo

采用微内核(Microkernel)+插件(Plugin)模式,微内核只负责组装插件。

支持的功能

  1. 负载均衡;
  2. 服务链路生成;
  3. 服务统计,资源调度治理;
  4. 服务降级;

调用过程

调用代码 -> Proxy -> Invoker -> TCP/IP -> Exporter -> Invoker -> 服务实现

架构

通信协议

负载均衡策略

  1. RandomLoadBalance:默认策略,生成权重分布坐标,使用随机数确认区间选择对应服务器;
  2. LeastActiveLoadBalance:最小活跃数,活跃数表示当前正处理的请求数量,实现上还会考虑加权,如果相同则使用RandomLoadBalance;
  3. ConsistentHashLoadBalance:使用一致性哈希算法,为了避免数据倾斜会添加虚拟节点;
  4. RoundRobinLoadBalance:平滑加权轮询。

Cluster容错策略

服务暴露

  1. Spring容器刷新完成后,首先完成初始化装配ServiceConfig对象;
  2. 检查及更新ServiceConfig对象,如果没有设置延迟暴露则开始暴露服务;
  3. 向注册中心注册服务,同时也会注册到本地ServiceRepository;
  4. 解析需要暴露的服务和协议然后构建URL,默认情况下会同时暴露到本地和远程;
  5. 暴露服务到本地,使用injvm协议,创建InjvmExporter,不监听本地端口,不走网络传输,但是会走Filter和Listener;
  6. 暴露服务到远程,通过proxyFactory.getInvoker()方法,默认使用javassist字节码技术,生成invoker对象;
  7. 根据协议将invoker对象封装为export对象,封装到exportedMap中,供远程调用查找;
  8. 将提供者信息注册到注册中心;
  9. 最后订阅Configurations节点。

延迟暴露

为了解决平滑发布的问题,即在生产者启动后延时一段时间才暴露服务。serviceBean是Spring容器初始化完成后在执行export方法,如果设置了延迟,则通过定时线程池去延迟执行export方法。

服务引用

支持饿汉式和懒汉式,默认懒汉式,即只有当服务被引用到其他类中才开启服务引用,首先构建要引用服务的URL对象,然后向注册中心注册消费者,并订阅提供者、配置、路由等节点,使用指定的集群容错策略包装invoker,然后通过proxyFactory.getInvoker()获取代理类。

服务检查

如果出现了循环引用或者由于服务的启动顺序,会出现引用的服务不存在而抛出异常的情况,需要在消费者端关闭服务检查。

服务请求流程

  1. 提供者启动时,往注册中心注册所有接口,并订阅动态配置节点;
  2. 消费者启动时,会在注册中心订阅需要引用的提供者、配置、路由节点;
  3. 信息变更时,注册中心基于长连接推送变更给消费者;
  4. 消费者从提供者地址列表中,根据负载均衡策略选择一个提供者调用,如果失败则使用集群容错策略;
  5. 服务提供者和消费者自身统计调用信息,并每分钟发送一次到监控中心。

角色

优雅上下线

  1. Kill-9或容器stop命令会通知到进程;
  2. 使用JDK的shutdown hook实现关闭清理动作,同时Spring也注册了钩子方法,可以直接监听ApplicationEvent;
  3. 提供者会把自身标记为不接受请求,新请求直接报错,剩余请求及任务处理完成;
  4. 消费方,不再发起请求,未返回的响应等待完成;
  5. 同时提供者下线后注册中心会通知到所有消费者。

Open Feign

是RPC框架,是基于HTTP协议实现。


gRPC