文档章节

Dubbo

l
 luobin_cd
发布于 2017/09/12 11:44
字数 1664
阅读 202
收藏 4
点赞 0
评论 0

下面这文章是我看官网dubbo.io和其他浏览得出的。

1. 介绍

Dubbo |ˈdʌbəʊ| 是阿里下的一个分布式、高性能、透明化的RPC服务框架,提供服务自动注册、自动发现等高效服务治理方案的开源框架。

 

1.1. RPC需要解决的问题

1.1.1. 通讯问题

主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。 

1.1.2. 寻址问题

A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。 

1.1.3. 序列化与反序列化

  当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。 
同理,B服务器接收参数要将参数反序列化。B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。

 

2. Dubbo架构

 

2.2. Dubbo注册中心

Ø Multicast注册中心 

Ø Zookeeper注册中心 

Ø Redis注册中心 

Ø Simple注册中心

 

2.3. 协议

Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。

<dubbo:protocol name="dubbo" port="20880" />

URL格式:

dubbo://username:password@host:port/path?key=value&key=value

 

3. Dubbo优点

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

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

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

Ø 服务接口监控与治理 
Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。

 

4. 推荐用法

4.1. 在Provider上尽量多配置Consumer端属性

Ø timeout 方法调用超时

Ø retries 失败重试次数,缺省是2(表示加上第一次调用,会调用3次)

Ø loadbalance 负载均衡算法(有多个Provider时,如何挑选Provider调用),缺省是随机(random)。还可以有轮询(roundrobin)、最不活跃优先(leastactive,指从Consumer端并发调用最好的Provider,可以减少的反应慢的Provider的调用,因为反应更容易累积并发的调用)

Ø actives 消费者端,最大并发调用限制,即当Consumer对一个服务的并发调用到上限后,新调用会Wait直到超时。 在方法上配置(dubbo:method)则并发限制针对方法,在接口上配置(dubbo:service),则并发限制针对服务。

4.2. Provider上配置合理的Provider端属性

Ø threads 服务线程池大小

Ø executes 一个服务提供者并行执行请求上限,即当Provider对一个服务的并发调用到上限后,新调用会Wait(Consumer可能到超时)。在方法上配置(dubbo:method )则并发限制针对方法,在接口上配置(dubbo:service),则并发限制针对服务。

4.3. 配置上Dubbo缓存文件

提供者列表缓存文件

<dubbo:registry file=”${user.home}/output/dubbo.cache” />

 

4.4. 配置优先级

Ø 方法级优先,接口级次之,全局配置再次之。

Ø 如果级别一样,则消费方优先,提供方次之。

 

4.5. 推荐XML配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="ops-provider"/>

    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>

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

    <!-- 设置服务方统一参数 -->
    <dubbo:provider timeout="60000" retries="0" accesslog="true"/>

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.**.api.UserInfoService" ref="userInfoService"/>
</beans>

 

5. Dubbo服务划分

     1、接口尽可能大粒度,接口中的方法不要以业务流程来,这个流程尽量在方法逻辑中调用,接口应代表一个完整的功能对外提供;

     2、接口应以业务为单位,业务相近的进行抽象,避免接口数量爆炸

     3、参数先做校验,在传入接口。

     4、要做到在设计接口时,已经确定这个接口职责、预测调用频率

6. Dubbo服务高级特性

1、启动检查

     在启动某服务时,先检查该服务所依赖的服务是否可用,不可用则抛出异常,以便上线时,能及早发现问题,默认check=“true”;

2、负载均衡

     针对某一方法在db管控台进行配置

     负载算法:随机(Random LoadBalance)、轮循(RoundRobin)、最少活跃调用数(LeastActive ,越活跃接收请求的概率越大)、一致性hash(ConsistentHash )

3、线程模型:threadpool threads

     最大线程数计算方式 ulimit -u命令计算服务器可执行最大线程数

4、只订阅

     只订阅服务,自己不注册,例如该服务正在测试,先不能向zk中注册避免其他服务调用它报错

5、只注册

     只注册服务,不订阅;应用在集群中该服务器上无该服务需要调用的服务,就让他只注册,指定调用其它服务器上的可用服务

© 著作权归作者所有

共有 人打赏支持
l
粉丝 1
博文 1
码字总数 1664
作品 0
成都

暂无相关文章

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 45分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部