源码分析Dubbo Invoker概述----服务发现、集群、负载均衡、路由体系

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: Invoker,负载网络调用组件,底层依懒与网络通信,Invoker主要负责服务调用,自然与路由(比如集群)等功能息息相关,本节先从整体上把控一下Dubbo服务调用体系,服务发现、集群、负载均衡、路由机制等整个知识体系,梳理整理Dubbo Invoker整个类图如下: 主要有如下接口群Invocation(调用上下文环境)Invocation:1、String getMethodName() 获取调用方法名。

Invoker,负载网络调用组件,底层依懒与网络通信,Invoker主要负责服务调用,自然与路由(比如集群)等功能息息相关,本节先从整体上把控一下Dubbo服务调用体系,服务发现、集群、负载均衡、路由机制等整个知识体系,梳理整理Dubbo Invoker整个类图如下:
这里写图片描述
主要有如下接口群

  1. Invocation(调用上下文环境)
  • Invocation:
    1、String getMethodName() 获取调用方法名。

2、Class< ? >[] getParameterTypes() 获取被调用方法的参数列表(参数类型)
3、Object[] getArguments() 获取被调用方法的参数值数组。
4、Map< String, String> getAttachments() 获取附加属性。
5、String getAttachment(String key) 根据key获取附加属性值。
6、String getAttachment(String key, String defaultValue) 根据key获取附加属性,如果不存在,取默认值。
7、Invoker< ?> getInvoker() 获取当前的invoker。

  • RpcInvocation rpc服务调用实现类

      Invocation执行调用上下文环境,就是用一个Bean存储当前调用方法的参数,其本质就是一个普通的Bean而已。
  • MockInvocation

      用于mock单元测试用。
  • DecodeableRpcInvocation 带解码功能的rpc调用上下文

      该实现主要能从RPC服务调用请求中解析二进制流(二进制包)得到RPC服务调用上下文(方法调用元数据)。
    
  1. Invoker 服务调用器,Dubbo中调用服务的抽象。
    Invoer的抽象接口,继承自com.alibaba.dubbo.common.Node接口
  • Node:
    1、URL getUrl(); 获取URL,在dubbo中,注册中心、服务提供者、服务消费者、监控中心等都使用URL描述。

2、boolean isAvailable() :判断是否可用。
3、void destroy() :资源销毁。

  • Invoker:
    1、Class getInterface() :获取服务提供者的接口。

Result invoke(Invocation invocation) throws RpcException :调用服务,返回调用结果。

  • AbstractInvoker Invoker默认实现(模板类)

     该方法主要实现public Result invoke(Invocation inv) throws RpcException,定义执行invoker的基础流程(模板),然后根据不同的实现子类(不同的协议)执行各自个性化的执行任务。其抽象方法:protected abstract Result doInvoke(Invocation invocation) throws Throwable,具体实现将在后文中分析。
  • DubboInvoker dubbo协议调用器具体实现。
  • InjvmInvoker injvm协议调用其具体实现(本地协议)
  1. AbstractClusterInvoker 集群模式调用模板类

     该类为Dubbo集群模式的调用模板类,主题解决一个服务服务有多个服务提供者,此时消息消费端在调用服务时如何选择具体的服务提供者。该类需要组织多个服务提供者,并按照指定算法选择一服务提供者进行调用。
  • AvailableClusterInvoker
    通过< dubbo:service cluster = "available" .../> 或 < dubbo:reference cluster="available" .../>

集群策略:总是选择第一个可用的服务提供者。

  • BroadcastClusterInvoker
    通过< dubbo:service cluster = "broadcast" .../> 或 < dubbo:reference cluster="broadcast" .../>

集群策略:广播模式,向所有服务提供者都发送请求,任何一个调用失败,则认为失败。

  • FailbackClusterInvoker
    通过< dubbo:service cluster = "failback" .../> 或 < dubbo:reference cluster="failback" .../>

集群策略:服务调用失败后,定时重试,重试次数无线次,重试频率:5s。并不会切换服务提供者。

  • FailfastClusterInvoker
    通过< dubbo:service cluster = "failfast" .../> 或 < dubbo:reference cluster="failfast" .../>

集群策略:服务调用后,快速失败,直接抛出异常,并不重试,也不受retries参数的制约,适合新增、修改类操作。

  • FailoverClusterInvoker
    通过< dubbo:service cluster = "failover" .../> 或 < dubbo:reference cluster="failover" .../>

集群策略:服务调用后,如果出现失败,则重试其他服务提供者,默认重试2次,总共执行3次,重试次数由retries配置,dubbo集群默认方式。

  • FailsafeClusterInvoker
    通过< dubbo:service cluster = "failsafe" .../> 或 < dubbo:reference cluster="failsafe" .../>

集群策略:服务调用后,只打印错误日志,然后直接返回。

  • ForkingClusterInvoker
    通过< dubbo:service cluster = "forking" .../> 或 < dubbo:reference cluster="forking" .../>

集群策略:并发调用多个服务提供者,取第一个返回的结果。可以通过forks设置并发调用的服务台提供者个数。

更多的集群策略,可以参考/dubbo-cluster/src/main/resources/META-/com.alibaba.dubbo.rpc.cluster.Cluster文件。
这里写图片描述

  1. LoadBalance 集群负载算法
    当一个服务有多个服务提供者时,消费端在进行服务调用时选择服务服务提供者的负载均衡算法。

LoadBalance定义的接口为:
< T> Invoker select(List< Invoker> invokers, URL url, Invocation invocation) throws RpcException;

  • ConsistentHashLoadBalance
    可以通过< dubbo:service loadbalance="consistenthash" .../>或< dubbo:provider loadbalance = "consistenthash" .../>

负载均衡算法:一致性Hash算法,在AbstractClusterInvoker中从多个服务提供者中选择一个服务提供者时被调用。

  • LeastActiveLoadBalance
    可以通过< dubbo:service loadbalance="leastactive" .../>或< dubbo:provider loadbalance = "leastactive" .../>

负载均衡算法:最小活跃调用。

  • RandomLoadBalance
    可以通过< dubbo:service loadbalance="random" .../>或< dubbo:service loadbalance = "random" .../>

负载均衡算法:随机,如果weight(权重越大,机会越高)

  • RoundRobinLoadBalance
    可以通过< dubbo:service loadbalance="roundrobin" .../>或< dubbo:provider loadbalance = "roundrobin" .../>

负载均衡算法:加权轮询算法。

  1. Directory(目录服务,Invoker的目录服务)
    该接口主要的作用是服务提供者的目录服务,管理多个服务提供者。
  • Directory
    1、Class< T> getInterface() 获取该服务接口类别。

2、List< Invoker< T>> list(Invocation invocation) throws RpcException 根据调用上下文获取当前所有该服务的服务提供者。
4.2 AbstractDirectory 目录服务实现的抽象列(模板类)
4.3 StaticDirectory 静态目录服务

所谓静态目录服务就是在创建StaticDirectory时指定一个服务提供者集合,则该目录服务实例在其生命周期中,只会返回这些服务提供者。
  • RegistryDirectory 动态目录服务(基于注册中心)、
    从注册中心动态获取发现服务提供,默认消息消费者并不会指定特定的服务提供者URL,所以会向注册中心订阅服务的服务提供者(监听注册中心providers目录),利用RegistryDirectory自动获取注册中心服务器列表。
  1. Router 路由功能
    根据消息消费者URL,结合路由表达式或JS引擎,从Directory中选择符合路由规则的Invoker,再执行负载均衡算法。
  • Router
    1、URL getUrl(); 获取消息消费者URL。

2、< T> List< Invoker< T>> route(List< Invoker< T>> invokers, URL url, Invocation invocation) throws RpcException 根据消息消费者URL,从invokers中筛选合适的Invokers。

  • ConditionRouter 基于条件表达式的路由实现。
  • ScriptRouter 基于JS引擎的路由实现。

单个Invoker的实现,例如DubboInvoker、InJVMInvoker底层调用网络通道发送请求命令(oneway、同步、异步调用方式),其网络底层细节将在后续专门讲解网络实现篇章重点分析,接下来的篇章,主要从源码的角度剖析集群、负载均衡、动态路由目录服务(RegistryDirectory )的实现细节。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
2月前
|
负载均衡 Dubbo 应用服务中间件
【Dubbo 解析】Dubbo支持几种负载均衡策略?
【1月更文挑战第11天】【Dubbo 解析】Dubbo支持几种负载均衡策略?
|
12天前
|
负载均衡 Kubernetes 算法
K8s服务发现与负载均衡的技术探索
【7月更文挑战第15天】K8s通过Service资源对象和kube-proxy组件实现了高效、灵活的服务发现和负载均衡机制。通过合理选择Service类型、优化kube-proxy配置以及使用Ingress进行高级路由,可以确保应用在K8s集群中高效、可靠地运行。随着云原生技术的不断发展,K8s的服务发现和负载均衡机制也将不断完善和优化,为更多场景提供强大的支持。
|
12天前
|
负载均衡 监控 Kubernetes
Service Mesh 是一种用于处理服务间通信的基础设施层,它通常与微服务架构一起使用,以提供诸如服务发现、负载均衡、熔断、监控、追踪和安全性等功能。
Service Mesh 是一种用于处理服务间通信的基础设施层,它通常与微服务架构一起使用,以提供诸如服务发现、负载均衡、熔断、监控、追踪和安全性等功能。
|
2月前
|
负载均衡 网络协议 算法
【Docker 专栏】Docker 容器内服务发现与负载均衡
【5月更文挑战第8天】本文探讨了Docker容器中的服务发现与负载均衡。服务发现通过环境变量、DNS或集中式系统(如Consul、Zookeeper)来定位服务实例。负载均衡则采用轮询、随机等算法,可通过软件负载均衡器、云服务或容器编排工具(如Kubernetes)实现。服务发现与负载均衡结合使用,确保请求有效分发和系统稳定性。面对动态性、网络延迟及大规模部署的挑战,需采取相应措施优化。选择合适技术并持续优化,能提升Docker容器应用的性能和可靠性。
【Docker 专栏】Docker 容器内服务发现与负载均衡
|
1月前
|
负载均衡 算法 调度
负载均衡算法概述
负载均衡算法概述
|
2月前
|
负载均衡 算法
Dubbo-负载均衡原理解析(1),一个本科渣渣是怎么逆袭从咸鱼到Offer收割机的
Dubbo-负载均衡原理解析(1),一个本科渣渣是怎么逆袭从咸鱼到Offer收割机的
|
2月前
|
负载均衡 网络协议 Java
构建高效可扩展的微服务架构:利用Spring Cloud实现服务发现与负载均衡
本文将探讨如何利用Spring Cloud技术实现微服务架构中的服务发现与负载均衡,通过注册中心来管理服务的注册与发现,并通过负载均衡策略实现请求的分发,从而构建高效可扩展的微服务系统。
|
1月前
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
55 2
|
3天前
|
运维 负载均衡 算法
SLB与NGINX的异同是什么
SLB与NGINX的异同是什么
14 2
|
2月前
|
负载均衡 应用服务中间件 nginx
解决nginx配置负载均衡时invalid host in upstream报错
在Windows环境下,配置Nginx 1.11.5进行负载均衡时遇到问题,服务无法启动。错误日志显示“invalid host in upstream”。检查发现上游服务器列表中,192.168.29.128的主机地址无效。负载均衡配置中,两个服务器地址前误加了&quot;http://&quot;。修正方法是删除上游服务器列表和proxy_pass中的&quot;http://&quot;。问题解决后,Nginx服务应能正常启动。
161 4
解决nginx配置负载均衡时invalid host in upstream报错