Dubbo

2021-06-18  本文已影响0人  幻如常

Dubbo(服务治理框架)

RPC

  1. 各服务都要实现rpc协议,才能实现服务间的调用

  2. rpc:远程过程调用协议,是一种通过网络从远程计算机程序上请求服务

  3. rpc原理:就是对象的序列化,反序列化以及序列化后数据的传输 rpc底层原理.png

和Feign的区别:微服务中远程调用Dubbo与Feign对比 - 悬铃木pp - 博客园 (cnblogs.com)

  1. 首先各个服务会把自己服务的名称和ip地址,注册到注册中心去

  2. 如果某个服务有集群的话,那么在注册中心就是一个服务名字对应多个ip地址

  3. 服务消费方会向服务中心去订阅消息,一旦注册中心的服务列表有变化,那么注册中心就把最新的服务列表发给服务消费方

  4. 服务消费方会把拉取到的最新服务列表保存在本地,调用服务的时候是去保存在本地的服务列表里面找到对应的服务和ip地址的

  5. 当项目运行的过程中注册中心挂了,是不影响现有的服务调用的,因为服务消费方用的都是本地的服务列表,但是会影响服务注册方,新的服务无法注册了,服务消费方也拿不到最新的服务列表,也就不知道有哪些服务有变化了

消费者把自己的名字设置好,设置好注册中心的地址,设置好要消费的是哪一个接口,当前端发来请求调用IUserService里面的方法(比如getId)时,那么dubbo会给IUserService对应的远程UserServiceImpl实现类创建一个动态代理类(也就是IUserService的一个实现类),在这个代理类里面是可以拿到服务提供者(member-server)暴露出来的信息(我的推测是从注册中心拿到的),那么我们就可以在代理类里面根据具体的url和UserServiceImpl实现类来执行远程的调用了。

  1. 本地存根:作用是先检验本地的参数,当参数不合法时就不调用远程服务,减少远程服务的压力,第二个作用:是可以做容错处理,如果调用远程服务失败时,可以返回一个空对象出去 本地存根.png
  1. 负载均衡策略:1.默认是缺省为random随机调用(随机是支持权重的,可以在dubbo监控台设置倍权和半权来改变权重),2.轮询就是轮着来,3.最少活跃调用数就是dubbo每次调用服务时记录下集群服务各服务的时间,花的时间最少,就证明效率最高,下次就让更多的请求去到那台服务器,直到发现下次发现其他更低响应时间的服务,就往更低的那台服务器发送请求,4.一致性hash,对请求进行hash算法,求余看落到哪一个服务器上,缺点就是可能导致某一台服务器压力过大,而其他服务器没用上;在<dubbo:refrence中配置loadbalance=“roundrobin"就表示轮询

  2. 集群容错:默认是已经处理了(自动切换),当调用集群中一台不成功时,就会调用集群中其他的服务器,也可以设置不同的集群容错处理:1.快速失败,只发起一次调用,失败立即报错,一般用来处理非幂等性的写操作,2.失败安全,出现异常时直接忽略,一般用于写日志,3.失败自动恢复,后台记录失败请求,定时重发,一般用于消息通知,4.并行调用多个服务器,只要一个成功即返回,一般用于实时性要求高的读操作,但是需要浪费更多服务资源,可通过fork=2来设置最大并行数,5.广播调用,逐个调用所有的服务,任意一台报错则报错,一般用于通知所有提供者更新缓存或日志等本地资源信息

  3. 服务降级:在服务器压力剧增时,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证服务器核心交易正常或高效运行

  4. 本地存根和远程代理的关系 本地存根和远程代理的关系.png

当我们的消费者调用dubbo提供的远程服务时,会在客户端生成一个远程动态代理类,我们知道动态代理里面是有一个属性拥有真实类的(通过注册中心拿到具体的地址和实现类),在代理类中把我们要传入的对象进行序列化后,再通过真正的远程地址和实现类进行调用,本地存根是干什么用的呢?本地存根也是我们要调用的接口的一个实现类,dubbo会把动态代理类传入到本地存根里来,我们可以在本地存根里面做自己的逻辑处理,如果参数异常我们就放弃通过远程动态代理调用服务,减少生产者的压力,同时也可以做容错处理,使用try catch,当调用远程方法失败时,返回一个空数据给到前端然后做下友好界面的处理

  1. 参考资料:dubbo的本地存根(Stub) - 杭州胡欣 - 博客园 (cnblogs.com)

zookeeper

上一篇 下一篇

猜你喜欢

热点阅读