dubbo详解

1、dubbo是什么

dubbo是一个分布式的服务框架,致力于提高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

简言之,dubbo就是一个服务框架,如果没有分布式的需求,其实不需要用的,只有分布式的时候,才需要dubbo这样的分布式框架

本质里,dubbo就是个服务调用的东东。。

说白了就是个远程服务调用的分布式框架(告别webservice模式中的wsdl,以服务者与消费者的方式在dubbo上注册)

dubbo可以和spring无缝集成

2、dubbo能干什么

1)透明化的远程方法调用,就像调用本地方法一样,只需简单配置,没有任何API侵入

2)软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点

3)服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者

4)dubbo采用全spring配置方式,透明化接入应用,对应用没有任何API侵入,只需spring加载dubbo的配置即可,dubbo基于spring的schema扩展进行加载

3、dubbo怎么用——即dubbo工作原理

dubbo的核心:

1)远程通讯:提供多种基于长连接的NIO框架封装,包括多线程模型,序列号,以及“请求-响应”模式的信息交换方式

2)集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持

3)自动发现:基于注册中心目录服务,使服务消费方能够动态查×××提供方,使地址透明,使服务提供方可以平滑增加或减少机器

dubbo主要核心部件

Remoting:网络通信框架,实现了sync-over-async和request-response消息机制。

RPC:一个远程过程调用的抽象,支持负载均衡、容灾和集群功能。

Registry:服务目录框架用于服务的注册和服务事件发布和订阅。

dubbo核心架构图:

角色说明:

provider:服务提供方

consumer:服务消费方

registry:服务注册与发现的注册中心

monitor:统计服务的调用次数和调用时间的监控中心

container:服务运行容器

调用关系说明:

0.服务器负责启动、加载、运行服务提供者

1.服务提供者在启动时,向注册中心注册自己提供的服务

2.服务消费者在启动时,向注册中心订阅自己所需的服务

3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者

4.服务消费者,从提供者列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,更换另一台调用

5.服务消费者和服务提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

4、dubbo怎么用

dubbo基于spring的schema扩展进行加载

服务提供者:

1)下载zookeeper注册中心

2)定义服务接口(该接口需单独打包,在服务提供方和消费方共享)

3)spring配置声明暴露服务

<bean id="demoSevice" class="..."/> //具体的实现Bean

<dubbo:application name="x_provider" /> //提供方信息

<dubbo:egister address="multicast://ip" />//multicast广播注册中心,暴露服务地址

<dubbo:register address="zookeeper://ip:2181" />//zookeeper注册中心暴露服务地址

<dubbo:protocol name="dubbo" port="20880" />//用dubbo协议在20880端口暴露服务

<dubbo:service interface="..." ref="demoService"/>//声明需暴露的服务接口

服务消费者:

applicationContext-dubbo.xml:注册自己需要调用的接口(业务多了,按照业务将拆分成N多个applicationContext-dubbo-xxx.xml)

通过spring配置引用远程服务

<dubbo:application name=".._consumer"/>//消费方应用名

<dubbo:register address="zookeeper://ip:2181"/>//使用zookeeper注册中心暴露服务地址

<dubbo:reference id="demoService" interface="..demoService"/>//生成远程服务代理,可以像使用本地bean一样使用demoService

服务保护:

服务保护的原则上是避免发生类似雪崩效应,尽量将异常控制在服务周围,不要扩散开。

说到雪崩效应,还得提下dubbo自身的重试机制,默认3次,当失败时会进行重试,这样在某个时间点出现性能问题,然后调用方再连续重复调用,很容易引起雪崩,建议的话还是很据业务情况规划好如何进行异常处理,何时进行重试。

服务保护的话,目前我们主要从以下几个方面来实施,也不成熟,还在摸索:

考虑服务的dubbo线程池类型(fix线程池的话考虑线程池大小)、数据库连接池、dubbo连接数限制是否都合适

考虑服务超时时间和重试的关系,设置合适的值

一定时间内服务异常数较大,则可考虑使用failfast让客户端请求直接返回或者让客户端不再请求

zkclient问题

前文已经提到过zkclient有两个问题,修改服务器时间会导致容器挂掉;dubbo使用zkclient没有传超时时间导致zookeeper无法连接的时候,直接阻塞Integer.MAX_VALUE。

正在调研curator,目前只能说curator不会在无法连接的时候直接阻塞。

另外zkclient和curator的jar包应该都是jdk1.6编译的,所以系统还在jdk1.5以下的话无法使用。

注册中心的分组group和服务的不同实现group

这两个东西完全不同的概念,使用的时候不要弄混了。

registry上可以配置group,用于区分不同分组的注册中心,比如在同一个注册中心下,有一部分注册信息是要给开发环境用的,有一部分注册信息时要给测试环境用的,可以分别用不同的group区分开,目前对这个理解还不透彻,大致就是用于区分不同环境。

service和reference上也可以配置group,这个用于区分同一个接口的不同实现,只有在reference上指定与service相同的group才会被发现,还有前文提到的分组合并结果也是用的这个。

5、dubbo的容错方案

当我们的系统中用到Dubbo的集群环境,因为各种原因在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover重试。

   Dubbo的集群容错在这里想说说他是因为我们实际的项目中出现了此类的问题,因为依赖的第三方项目出现异常,导致dubbo调用超时,此时使用的是默认的集群容错方式,而配置的reties=‘3‘,这样前段系统连续掉用了三次服务,结果可想而知.

 先说一下各节点关系:

   这里的Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地址及Service接口信息。

    Directory代表多个Invoker,可以把它看成List<Invoker>,但与List不同的是,它的值可能是动态变化的,比如注册中心推送变更。

     Cluster将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。

     Router负责从多个Invoker中按路由规则选出子集,比如读写分离,应用隔离等。

     LoadBalance负责从多个Invoker中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选。

集群容错模式: Failover Cluster

失败自动切换,当出现失败,重试其它服务器。(缺省)

通常用于读操作,但重试会带来更长延迟。

可通过retries="2"来设置重试次数(不含第一次)。正是文章刚开始说的那种情况.

Failfast Cluster

快速失败,只发起一次调用,失败立即报错。

通常用于非幂等性的写操作,比如新增记录。

Failsafe Cluster

失败安全,出现异常时,直接忽略。

通常用于写入审计日志等操作。

Failback Cluster

失败自动恢复,后台记录失败请求,定时重发。

通常用于消息通知操作。

Forking Cluster

并行调用多个服务器,只要一个成功即返回。

通常用于实时性要求较高的读操作,但需要浪费更多服务资源。

可通过forks="2"来设置最大并行数。

Broadcast Cluster

广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)

通常用于通知所有提供者更新缓存或日志等本地资源信息。

重试次数配置如:(failover集群模式生效)

<dubbo:serviceretries="2"/>

或:<dubbo:referenceretries="2"/>

或:<dubbo:reference>

   <dubbo:methodname="findFoo"retries="2"/>

</dubbo:reference>

集群模式配置如:

<dubbo:servicecluster="failsafe"/>

或:<dubbo:referencecluster="failsafe"/>

6、dubbo负载均衡策略

在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用。

RandomLoadBalance

随机,按权重设置随机概率。

在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

RoundRobinLoadBalance

轮循,按公约后的权重设置轮循比率。

存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

LeastActiveLoadBalance

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

ConsistentHashLoadBalance

一致性Hash,相同参数的请求总是发到同一提供者。

当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

   Dubbo的集群容错和负载均衡同样也是Dubbo本身的高级特性.正如我们在说自定义扩展的时候一样,这两个特征同样也可以进行自定义扩展,用户可以根据自己实际的需求来扩展他们从而满足项目的实际需求。

7、服务之间如何实现通信

1)同步调用

REST(JAX-RS,Spring Boot)

RPC(Thrift,Dubbo,HSF)

2)异步消息调用(kafka,Notify,NetaQ)

RESTFUL和RPC比较:

restful基于HTTP,更易实现,服务端技术更灵活,各语言都支持,跨客户端,对客户端无特殊要求,只需封装HTTP的SDK就能调用

RPC:传输协议更高效,安全更可控

特别在一个公司内部,如果有统一的开发规范和统一的服务框架时,开发效率优势更明显

同步:调用问题,性能差(特别是层次多时)

异步:减低调用服务之间的耦合,调用之间的缓冲,确保消息挤压不会冲垮被调用方,同时保证调用方的服务体验,继续干自己该干的活,不至于被后台性能拖慢,付出的代价是一致性的减弱,需要接受数据最终一致性,后台服务一般要实现幂等性,因为消息发送处于性能的考虑一般会有重复;必须引入一个独立的broker。

有兴趣的朋友们可以前往球球:1903832579

原文地址:http://blog.51cto.com/13777880/2153467

时间: 2024-11-05 09:32:49

dubbo详解的相关文章

Dubbo详解-说明(一)

Dubbo 是什么? Dubble是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理的方案. Dubbo 有啥特点? 远程通讯:提供透明化的远程方法的调用,提供多协议支持. 集群容错:软负载均衡,失败容错,地址路由,动态配置等集群支持. 自动发现:基于注册中心目录服务(zookeeper),使服务消费方能动态的查找服务提供方,支持平滑减少和增加机器. 架构演进? MVC:适合刚刚创业的公司,人员大概在几个程序员的范畴内. RPC:适合已经有几十个程序员的程

OSChina 技术周刊第二十二期 —— DUBBO 配置规则详解

每周技术抢先看,总有你想要的! 移动开发 [翻译]为你的 Android 应用增加本地搜索功能 前端开发 [软件]AngularJS 的剪贴板扩展 ngClip [软件]国际化和本地化 JavaScript 库 Globalize [资讯]为网站开发准备的 30 个惊艳的 jQuery 插件 服务端开发/管理 [翻译]一年之后重新审视 Docker -- 根本性缺陷和炒作 [翻译]单线程 1KB 的 Redis 写操作有 84% 都是耗费在内核上 [翻译]使用 HAProxy 基于 HTTP 头

[转载,感觉写的非常详细]DUBBO配置方式详解

[转载,感觉写的非常详细]DUBBO配置方式详解 原文链接:http://www.cnblogs.com/chanshuyi/p/5144288.html DUBBO 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是阿里巴巴 SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo采用全spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Sp

DUBBO配置规则详解

DUBBO配置规则详解 欢迎加入DUBBO交流群:259566260 研究DUBBO也已经大半年了,对它的大部分源码进行了分析,以及对它的内部机制有了比较深入的了解,以及各个模块的实现.DUBBO包含很多内容,如果想了解DUBBO第一步就是启动它,从而可以很好的使用它,那么如何更好的使用呢?就需要知道DUBBO的各个配置项,以及它可以通过哪些途径进行配置.个人对配置的理解,就好比时对动物的驯服,如何很好的驯服一头猛兽,那就需要知道它各种习性,从而调整,已达到自己期望的结果.这篇不对DUBBO有哪

Dubbo+SpringMVC工程创建详解(附工程文件)

Dubbo+SpringMVC工程创建详解(附工程文件) Dubbo出现的目的是为了应对现在高并发,高数据量请求的问题.目前的垂直应用架构已经无法满足现在大数据的冲击,SOA就应运而生,而Dubbo在国内使用的还是比较多,稳定性也比较不错. 架构 节点角色说明: Provider: 暴露服务的服务提供方. Consumer: 调用远程服务的服务消费方. Registry: 服务注册与发现的注册中心. Monitor: 统计服务的调用次调和调用时间的监控中心. Container: 服务运行容器.

Dubbo配置文件详解

为新项目练手,把项目中用到的web service.RMI的服务改用Dubbo+Zookeeper+Spring,网上找到几篇不错的配置详解 1.此篇博文主要从以下几种配置方式来讲 XML 配置文件方式.XML 配置文件方式.annotation 配置方式 https://www.cnblogs.com/chanshuyi/p/5144288.html 2.此篇博文主要从以下几点来讲 服务发现:表示该配置项用于服务的注册与发现,目的是让消费方找到提供方. 服务治理:表示该配置项用于治理服务间的关

Spring Cloud:使用Ribbon实现负载均衡详解(下)

在上一篇文章(Spring Cloud:使用Ribbon实现负载均衡详解(上))中,我对 Ribbon 做了一个介绍,Ribbon 可以实现直接通过服务名称对服务进行访问.这一篇文章我详细分析一下如何使用 Ribbon 实现客户端的负载均衡. 1. 使用 Ribbon 实现负载均衡 要实现负载均衡,首先要有多个订单服务提供者,目前我们就一个 microservice-order-provider01,端口号 8001,我们可以仿照这个服务,再创建两个子模块,也是订单服务提供者,取名为 micro

《Java面试全解析》1000道面试题大全详解(转)

<Java面试全解析>1000道 面试题大全详解 本人是 2009 年参加编程工作的,一路上在技术公司摸爬滚打,前几年一直在上海,待过的公司有 360 和游久游戏,因为自己家庭的原因,放弃了阿里钉钉团队的 offer 回到了西安. 从 2015 年四月开始在一家上市公司担任研发经理的职位,至今也快 5 年了,一路上见了很多也面试了很多人技术人,大部分面试的结果很令我沮丧,这也是我出这本书的原因之一,帮助更多的人搞懂技术最核心的知识. 为了写好这个专栏内容,我先后拜访了一二十家互联网公司,与不同

KafkaProducer Sender 线程详解(含详细的执行流程图)

目录 1.Sender 线程详解 2.RecordAccumulator 核心方法详解 温馨提示:本文基于 Kafka 2.2.1 版本. 上文 <源码分析 Kafka 消息发送流程> 已经详细介绍了 KafkaProducer send 方法的流程,该方法只是将消息追加到 KafKaProducer 的缓存中,并未真正的向 broker 发送消息,本文将来探讨 Kafka 的 Sender 线程. @(本节目录) 在 KafkaProducer 中会启动一个单独的线程,其名称为 "