博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dubbo_rpc原理
阅读量:4314 次
发布时间:2019-06-06

本文共 2181 字,大约阅读时间需要 7 分钟。

alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo、hsf),jms消息服务(napoli、notify),KV数据库(tair)等。 
这个框架/工具/产品在实现的时候,都考虑到了
容灾,扩展,负载均衡,于是出现一个
配置中心(ConfigServer)的东西来解决这些问题。
基本原理如图:
alibaba远程调用框架dubbo原理 - sun - 学无止境

 

在我们的系统中,经常会有一些跨系统的调用,如在A系统中要调用B系统的一个服务,我们可能会使用RMI直接来进行,B系统发布一个RMI接口服务,然后A系统就来通过RMI调用这个接口,为了解决容灾,扩展,负载均衡的问题。
 
本文只说dubbo, 原理如下:

ConfigServer

   配置中心, 和每个Server/Client之间会作一个实时的
心跳检测( 因为它们都是 建立的
Socket长连接 ) ,比如几秒钟检测一次。 收集每个Server提供的服务的信息,每个Client的信息,整理出一个服务列表,如:
 serviceName serverAddressList clientAddressList
 UserService 192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4  172.16.0.1,172.16.0.2
 ProductService 192.168.0.3,192.168.0.4,192.168.0.5,192.168.0.6 172.16.0.2,172.16.0.3
 OrderService 192.168.0.10,192.168.0.12,192.168.0.5,192.168.0.6  172.16.0.3,172.16.0.4
   当某个 Server不可用,那么就 更新受影响的服务对应的 
serverAddressList,即把这个Server从
serverAddressList中踢出去 (从地址列表中删除) ,同时将 推送 
serverAddressList 给这些受影响的服务的clientAddressList里面的所有Client 。如:192.168.0.3挂了,那么UserService和ProductService的
serverAddressList都要把192.168.0.3删除掉,同时把新的列表告诉对应的Client  172.16.0.1,172.16.0.2,172.16.0.3 ;
 当 某 个Client挂了,那么 更新受影响的服务对应的
clientAddressList
ConfigServer根据服务列表,就能
提供一个web管理界面,来查看管理服务的提供者和使用者。
新加一个Server时,由于它会主动与ConfigServer取得联系,而ConfigServer又会将这个信息主动发送给Client,所以 新加一个Server时,只需要启动Server,然后几秒钟内,Client就会使用上它提供的服务

Client

    调用服务的机器,每个Client启动时,主动与ConfigServer建立Socket长连接,并将自己的IP等相应信息发送给ConfigServer。
Client在使用服务的时候根据服务名称去ConfigServer中获取服务提供者信息(这样ConfigServer就知道某个服务是 当前 哪几个Client在使用),Client拿到这些服务提供者信息后,与它们都建立连接,后面就可以直接调用服务了,当有多个服务提供者的时候,Client
根据一定的规则来进行负载均衡,如轮询,随机,按权重等。
一旦Client使用的服务它对应的服务提供者有变化(服务提供者有新增,删除的情况),ConfigServer就会把最新的服务提供者列表推送给Client,Client就会依据最新的服务提供者列表重新建立连接,新增的提供者建立连接,删除的提供者丢弃连接

Server

    真正提供服务的机器,每个Server启动 时 ,主动与ConfigServer建立Scoket长连接,并将自己的IP,提供的服务名称,端口等信息直接发送给ConfigServer,ConfigServer就会收集到每个Server提供的服务的信息。
 
优点:
1.只要在Client和Server启动的时候,ConfigServer是好的,服务就可调用了,如果后面 ConfigServer挂了,那只影响 ConfigServer挂了以后服务提供者有变化,而Client还无法感知这一变化。
2.Client每次调用服务是不经过ConfigServer的,Client只是与它建立联系,从它那里获取提供服务者列表而已
3.调用服务- 负载均衡: Client调用服务时,可以根据规则在多个服务提供者之间轮流调用服务。
4.服务提供者- 容灾:某一个Server挂了,Client依然是可以正确的调用服务的,当前提是这个服务有至少2个服务提供者,Client能很快的感知到服务提供者的变化,并作出相应反应。
5.服务提供者-扩展:添加一个服务提供者很容易,而且Client会很快的感知到它的存在并使用它。
 
转自:

转载于:https://www.cnblogs.com/dengzy/p/5677531.html

你可能感兴趣的文章
Asp.net系列--基础篇(三)
查看>>
css基础
查看>>
如何在tomcat中如何部署java EE项目
查看>>
【Python基础教程第2版】——第二讲:列表和元组
查看>>
小常识
查看>>
使用vscode开发python
查看>>
《java编程思想》读书笔记(一)开篇&第五章(1)
查看>>
swift--调用系统单例实现打电话
查看>>
0038-算一算是一年中的第几天
查看>>
51nod 1094 【水题】
查看>>
虚拟机设置静态IP地址
查看>>
Springboot上传文件出现MultipartException
查看>>
NHibernate错误:Could not compile the mapping document的解决
查看>>
关于vue的源码调试
查看>>
003.第一个动画:绘制直线
查看>>
K2BPM怎么让金融数据更有意义?
查看>>
史玉柱自述:我是如何带队伍的
查看>>
靶形数独【贪心+深搜】
查看>>
读大道至简第三章有感
查看>>
BeforeFieldInit的小叙
查看>>