dubbo 连接注册中心和直连的区别
在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,
点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表,
服务注册中心,动态的注册和发现服务,使服务的位置透明,并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover, 注册
中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。注册中心负责服务地
址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,服务消费者向注册中心获取服
务提供者地址列表,并根据负载算法直接调用提供者,注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外,注册中心
通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表注册中心和监控中心都是可选的,服务消
费者可以直连服务提供者。
1. dubbo 服务集群配置(集群容错模式)
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。可以自行扩展集群容错策略
l Failover Cluster(默认)
失败自动切换,当出现失败,重试其它服务器。(缺省)通常用于读操作,但重试会带来更长延迟。可通过retries="2"来设置重试次数(不含第
一次)。
l Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
l Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
l Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
l Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过forks="2"来设置最大
并行数。
l 配置
<dubbo:service retries="2" cluster="failover"/> 或: <dubbo:reference retries="2"
cluster="failover"/> cluster="failover"可以不用写,因为默认就是 failover
dubbo:service cluster="failfast" /> 或:
<dubbo:reference cluster="failfast" />
cluster="failfast"和 把 cluster="failover"、retries="0"是一样的效果,retries="0"就是不重试
<dubbo:service cluster="failsafe" /> 或:
<dubbo:reference cluster="failsafe" />
<dubbo:service cluster="failback" /> 或:
<dubbo:reference cluster="failback" />
<dubbo:service cluster=“forking" forks="2"/> 或:
<dubbo:reference cluster=“forking" forks="2"/>1. dubbo 通信协议 dubbo 协议为什么要消费者比提供者个数多:
因 dubbo 协议采用单一长连接,假设网络为千兆网卡(1024Mbit=128MByte),
根据测试经验数据每条连接最多只能压满 7MByte(不同的环境可能不一样,供参考),理论上 1 个服务提供者需要 20
个服务消费者才能压满网卡。
2. dubbo 通信协议 dubbo 协议为什么不能传大包:
因 dubbo 协议采用单一长连接,
如果每次请求的数据包大小为 500KByte,假设网络为千兆网卡(1024Mbit=128MByte),每条连接最大 7MByte(不同的环境可能不一样,供
参考),
单个服务提供者的 TPS(每秒处理事务数)最大为:128MByte / 500KByte = 262。
单个消费者调用单个服务提供者的 TPS(每秒处理事务数)最大为:7MByte / 500KByte = 14。如果能接受,可以考虑使用,否则网络将成为
瓶颈。
3. dubbo 通信协议 dubbo 协议为什么采用异步单一长连接:
因为服务的现状大都是服务提供者少,通常只有几台机器,而服务的消费者多,可能整个网站都在访问该服务,
比如 Morgan 的提供者只有 6 台提供者,却有上百台消费者,每天有 1.5 亿次调用,如果采用常规的 hessian 服务,服务提供者很容易就被
压跨,通过单一连接,保证单一消费者不会压死提供者,长连接,减少连接握手验证等,
并使用异步 IO,复用线程池,防止 C10K 问题。
4. dubbo 通信协议 dubbo 协议适用范围和适用场景
适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输
大文件或超大字符串。
适用场景:常规远程服务方法调用 dubbo协议补充:
连接个数:单连接连接方式:长连接传输协议:TCP
传输方式:NIO 异步传输
序列化:Hessian 二进制序列化
5. RMI 协议
RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式,Java标准的远程调用协议。
连接个数:多连接连接方式:短连接传输协议:TCP 传输方式:同步传输序列化:Java标准二进制序列化
适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。
适用场景:常规远程服务方法调用,与原生RMI服务互操作
6. Hessian 协议
Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用
Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现基于Hessian的远程调用协议。
连接个数:多连接连接方式:短连接传输协议:HTTP 传输方式:同步传输
序列化:Hessian二进制序列化适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。
适用场景:页面传输,文件传输,或与原生hessian服务互操作
7. http
采用Spring的HttpInvoker实现基于http表单的远程调用协议。
连接个数:多连接连接方式:短连接传输协议:HTTP 传输方式:同步传输序列化:表单序列化(JSON)
服务端服务级别
<dubbo:service interface="..." oadbalance="roundrobin" />
客户端服务级别
<dubbo:reference interface="..." loadbalance="roundrobin" />
服务端方法级别
<dubbo:service interface="..."> <dubbo:method name="..." loadbalance="roundrobin"/>
客户端方法级别
<dubbo:reference interface=".."> <dubbo:method name="..." loadbalance="roundrobin"/>适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。适用场
景:需同时给应用程序和浏览器JS使用的服务。
8. Webservice
基于CXF的frontend-simple和transports-http实现基于WebService的远程调用协议。
连接个数:多连接连接方式:短连接传输协议:HTTP 传输方式:同步传输
序列化:SOAP文本序列化适用场景:系统集成,跨语言调用。
9. Thrif
Thrift是Facebook捐给Apache的一个RPC框架,当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些
额外的头信息,比如service name,magic number等
Thrift
Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。本文将从 Java 开发人员角度详细介绍 Apache
Thrift 的架构、开发和部署,并且针对不同的传输协议和服务类型给出相应的 Java 实例,同时详细介绍 Thrift 异步客户端的实现,最后提出
使用 Thrift 需要注意的事项。
目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等。其中所用到的数据
传输方式包括 XML,JSON 等,然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善。本文将介绍由 Facebook 开
发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在
多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二
进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。本文将详细介绍 Thrift 的使用,并且提供丰富的
实例代码加以解释说明,帮助使用者快速构建服务。
为什么要 Thrift:
1、多语言开发的需要
2、性能问题
Protoclol Buffer
protocol buffer 是 google 的一个开源项目,它是用于结构化数据串行化的灵活、高效、自动的方法,例如 XML,不过它比 xml 更小、更
快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况
下更新数据结构。
特点Protocol Buffer 的序列化 & 反序列化简单 & 速度快的原因是:
1. 编码 / 解码 方式简单(只需要简单的数学运算 = 位移等等)
2. 采用 Protocol Buffer 自身的框架代码 和 编译器 共同完成
Protocol Buffer 的数据压缩效果好(即序列化后的数据量体积小)的原因是:
1. a. 采用了独特的编码方式,如 Varint、Zigzag 编码方式等等
2. b. 采用 T - L - V 的数据存储方式:减少了分隔符的使用 & 数据存储得紧凑