zoukankan      html  css  js  c++  java
  • RPC笔记搬迁

     
     
    远程调用,服务注册与发现,容错和负载均衡
    选择dubbo
     
    1.扩展性,dubbo各个分层都是很多扩展,比如注册中心有redis、zookeeper选项,通信模块有netty、mina,序列化有hession、hession2、java序列化等,本文不能面面俱到,重点阐述主线流程,注册中心选择zookeeper(client选择curator),通信选择netty,协议选择dubbo,序列化选择hession2,容器选择Spring。
     
    2.负载均衡
     
    分布式RPC框架dubbo
    远程通讯:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型、序列化、"请求-响应"模式的信息交换方案
    集群容错:提供基于借口方法的透明远程过程调用,包括多协议支持、软负载均衡、失败容错、地址路由、动态配置等集群支持
    自动发现:基于注册中心目录服务,使服务消费方能动态地查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器
    透明化,就像本地调用远程方法一样,没有任何APi侵入;负载均衡容灾错;基于注册中心自动发现。
     
    特点概括
    1.它主要是使用高效的网络框架和序列化框架,让分布式服务之间调用效率更高。
    2.采用注册中心
    管理众多的服务接口地址,当你想调用服务的时候只需要跟注册中心询问即可,不用像使用WebService一样每个服务都得记录好接口调用方式。
    3.监控中心
    实现对服务方和调用方之间运行状态的监控,还能控制服务的优先级、权限、权重、上下线等,让整个庞大的分布式服务系统的维护和治理比较方便。
    4.高可用
    有个服务宕机了?注册中心就会从服务列表去掉该节点。还是调用到了?客户端会向注册中心请求另一台可用的服务节点重新调用。注册中心宕机?注册中心也能实现高可用(ZooKeeper)。
    5.负载均衡
    采用软负载均衡算法实现对多个相同服务的节点的请求负载均衡。
     
     
    RPC之 Dubbo 实现主要为三点,动态代理、反射、socket网络编程
    其核心部分包含:
    • 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
    • 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
    • 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
     
    连接方式:长连接
    传输协议:TCP
    传输方式:NIO异步传输
    序列化:Hessian二进制序列化
     
     
     
     
    启动原理
    上图中的第一步start,就是将服务装载容器中,然后准备注册服务。和Spring中启动过程类似,spring启动时,将bean装载进容器中的时候,首先要解析bean。所以dubbo也是先读配置文件解析服务。
    解析服务
    1)基于dubbo.jar内的Meta-inf/spring.handlers配置,spring在遇到dubbo名称空间时,会回调DubboNamespaceHandler类。
    2)所有的dubbo标签,都统一用DubboBeanDefinitionParser进行解析,基于一对一属性映射,将XML标签解析为Bean对象。
    源码截图:
    在ServiceConfig.export 或者ReferenceConfig.get 初始化时,将Bean对象转会为url格式,将所以Bean属性转成url的参数。
    然后将URL传给Protocol扩展点,基于扩展点的Adaptive机制,根据URL的协议头,进行不同协议的服务暴露和引用。
     
    暴露服务
    a、 只暴露服务端口
    在没有使用注册中心的情况,这种情况一般适用在开发环境下,服务的调用这和提供在同一个IP上,只需要打开服务的端口即可。
    即,当配置 or
    ServiceConfig解析出的URL的格式为:
    Dubbo://service-host/com.xxx.TxxService?version=1.0.0
    基于扩展点的Adaptiver机制,通过URL的“dubbo://”协议头识别,直接调用DubboProtocol的export()方法,打开服务端口。
     
    b、向注册中心暴露服务:
    和上一种的区别:需要将服务的IP和端口一同暴露给注册中心。
    ServiceConfig解析出的url格式为:
    registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode(“dubbo://service-host/com.xxx.TxxService?version=1.0.0”)
     
    基于扩展点的Adaptive机制,通过URL的“registry://”协议头识别,调用RegistryProtocol的export方法,将export参数中的提供者URL先注册到注册中心,再重新传给Protocol扩展点进行暴露:
    Dubbo://service-host/com.xxx.TxxService?version=1.0.0
     
    引用服务
    a、直接引用服务:
    在没有注册中心的,直连提供者情况下,
    ReferenceConfig解析出的URL格式为:
    Dubbo://service-host/com.xxx.TxxService?version=1.0.0
    基于扩展点的Adaptive机制,通过url的“dubbo://”协议头识别,直接调用DubboProtocol的refer方法,返回提供者引用。
     
    b、从注册中心发现引用服务:
    此时,ReferenceConfig解析出的URL的格式为:
    registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(“consumer://consumer-host/com.foo.FooService?version=1.0.0”)
     
    基于扩展点的Apaptive机制,通过URL的“registry://”协议头识别,就会调用RegistryProtocol的refer方法,基于refer参数总的条件,查询提供者URL,如:
    Dubbo://service-host/com.xxx.TxxService?version=1.0.0
     
    基于扩展点的Adaptive机制,通过提供者URL的“dubbo://”协议头识别,就会调用DubboProtocol的refer()方法,得到提供者引用。
    然后RegistryProtocol将多个提供者引用,通过Cluster扩展点,伪装成单个提供这引用返回。
     
     
    提供服务流程
     
     
    结合Netty
    Dubbo 底层使用的是 Netty 作为网络通信
     
     
     
    Dubbo服务之间的调用是阻塞的吗?
    Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,
    异步调用会返回一个 Future 对象。
    异步调用流程图如下。
     
    Dubbo推荐使用什么序列化框架,你知道的还有哪些?
    推荐使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。
     
    Dubbo必须依赖的包有哪些
    Dubbo 必须依赖 JDK,其他为可选。
     
    Dubbo的管理控制台能做什么?
    管理控制台主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能。
     
    说说 Dubbo 服务暴露的过程。
    Dubbo 会在 Spring 实例化完 bean 之后,在刷新容器最后一步发布 ContextRefreshEvent 事件的时候,通知实现了 ApplicationListener 的 ServiceBean 类进行回调 onApplicationEvent 事件方法,Dubbo 会在这个方法中调用 ServiceBean 父类 ServiceConfig 的 export 方法,而该方法真正实现了服务的(异步或者非异步)发布。
     
    对比
    Dubbo 和 Spring Cloud 区别
    1)通信方式不同
    Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。
    2)组成部分不同
     
    HSF
    High Speed Framework
    HSF以高性能网络通信框架为基础,提供了诸如服务发布与注册,服务调用,服务路由,服务鉴权,服务限流,服务降级和服务调用链路跟踪等一系列久经考验的功能特性

  • 相关阅读:
    Architecture and working of an Antivirus Engine
    ASP.NET HttpApplication HttpModule + Page Life Cycle Events Sequence Test
    EasyCodeTimerPlus PerformanceCounter 改自 @老赵
    CodeTimerPerformance EasyPerformanceCountersHelper .NET v3.5
    HTML Input Text cursor position control
    DataTable List<T> 互转 扩展方法 Extension Methods
    删除N天前的M(天)个目录 、删除N天前最后修改的文件 ForFiles, dos command 批处理命令cmd/bat
    DataTableHelper
    DynamicMethodHelper R2 20120814 DynamicMethod ILGenerator.Emit
    DynamicCallMethodExpressionTreeInvokerHelper CodeDom 动态编译代码 执行代码
  • 原文地址:https://www.cnblogs.com/novalist/p/11621348.html
Copyright © 2011-2022 走看看