Dubbo相关

看过dubbo源码?1、服务调用过程最外层是Mock逻辑,调用前,调用后进行Mock从服务目录中,根据当前调用的方法和路由链,筛选出部分服务Invoker(DubboInvoker) 对服务Invoker进行负载均衡,选出一个服务Invoker 执行Filter链 AsyncToSyncInvoker完成异步转同步,因为DubboInvoker的执行是异步非阻塞的,所以如果是同步调用,则会在此处阻塞,知道拿到响应结果 DubboInvoker开始异步非阻塞的调用HeaderExcha
摘要由CSDN通过智能技术生成

看过dubbo源码?

1、服务调用过程

  • 最外层是Mock逻辑,调用前,调用后进行Mock
  • 从服务目录中,根据当前调用的方法和路由链,筛选出部分服务Invoker(DubboInvoker)
  • 对服务Invoker进行负载均衡,选出一个服务Invoker
  • 执行Filter链
  • AsyncToSyncInvoker完成异步转同步,因为DubboInvoker的执行是异步非阻塞的,所以如果是同步调用,则会在此处阻塞,知道拿到响应结果
  • DubboInvoker开始异步非阻塞的调用
  • HeaderExchangeChannel中会阻塞timeout的时间来等待结果,该timeout就是用户在消费端所配置的timeout

2、限流算法

1、一般的限制每秒多少请求量 ,用信号量来做,相当于线程池

2、TPS ,Dubbo默认使用令牌桶算法实现限流。某段时间内,桶里面只能放进n个令牌,然后来一个请求就减少一个令牌,如果桶里面的令牌没有了,则不能继续执行请求。限流通过com.alibaba.dubbo.rpc.filter.TpsLimitFilter实现。

3、负载均衡算法

1、随机   

  a、根据权重加总计算出总权重10

  b、随机一个10以内的数字

  c、轮询所有的invokers,然后拿随机值offset-每一个invoker的权重

  d、当结果小于0时,直接返回这个invoker即可

2、轮询(权重一样,就取余的方式获取到invoker,权重不同按照按公约后的权重设置轮循比率)

3、一致性hash(利用缓存的hash思想 每个privoder 有一个hash值存在一个圆环上,范围是0-2的32次方,然后key的hash)

4、最少活跃数(每个provider维护了一个active,调用+1 调用完成-1,轮询所有的invokers,取最小的active,如果active相同,就看权重,权重相同,就随机)

Dubbo动态代理:

1、javassist(默认)

2、jdk动态代理

JavassistProxyFactory 来创建引用服务的代理,JavassistProxyFactory 源码如下:

public class JavassistProxyFactory extends AbstractProxyFactory {
// 获取代理
public <T> T getProxy(Invoker<T> invoker, Class<?>[] interfaces) {
    return (T) Proxy.getProx

y(interfaces).newInstance(new InvokerInvocationHandler(invoker));
}

public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {
    final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ?             proxy.getClass() : type);
    return new AbstractProxyInvoker<T>(proxy, type, url) {
          @Override
          protected Object doInvoke(T proxy, String methodName, Class<?>[] parameterTypes,

           Object[] arguments) throws Throwable {
            return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);
    }
};
}
}

JavassistProxyFactory的getProxy方法看似跟jdk生成动态代理一样, 但这里的Proxy类不是jdk的类,而是dubbo自写的Proxy类(com.alibaba.dubbo.common.bytecode.Proxy),该类可利用javassist工具对接口生成代理代码(dubbo是不能对非接口类进行代理的)

Cglib和jdk动态代理的区别?

1、Jdk动态代理:利用拦截器(必须实现InvocationHandler)加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理

2、 Cglib动态代理:利用ASM框架,对代理对象类生成的class文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值