Dubbox学习笔记

Dubbox 学习笔记,本文观点仅代表个人理解,如有错误之处,请留言指正,谢谢。

本文主要根据Dubbox用户手册进行学习,从提供的配置去看dubbox的全貌,没有从源码角度去分析,而是从应用的角度上去学习。

1、dubbo配置学习

1)  dubbo:protocol   服务提供方协议配置,如果需要支持多协议,我可以声明多个

dubbo:protocol标签,并在 dubbo:service标签的protocol属性中指定。

dubbo:protocol标签配置项如下:

id

name

port

host

threadpool   (fixed | cache)

threads

iothreads

accepts

payload        请求即响应包大小,默认8M,单位字节

codec

serialization

accesslog

path

transport

server

client

dispatcher

queues          默认为0,线程池队列长度

charset

buffer

heatbeat

telnet

register

contextpath

从这些配置项中我学到了什么

1)线程模型

1、通信相关参数

transport      netty,mina等NIO框架,指定client ----> server  从server--->client的网络通信模式,默认使用netty

server

client             单独指定server与client端的通信NIO框架。

2、序列化,编码、解码

codec与serialization  需重点学习与了解。

3、线程池,派发方面

threads  指定处理业务的线程池大小,也就是implement处线程池大小

threadpool  线程池类别,默认为fixed(固定大小),可选值 cache

iothreads    处理连接的线程数,iothreads线程接收请求后,通过dispather将连接派发到线程池处理。dubbo协议默认使用单一长连接,是否可以这样理

解,如果iothreads设置为2,dubbo会为 每服务每服务端每消费端 提供两条长连接。

queues      线程池队列长度,建议设置为0,如果线程池满了,应该立即失败,去尝试其他服务提供者。

accepts

payload   请求包与响应包大小,单位为字节,默认为8M

dispatcher   :可选值为 all direct message,execution connection,默认为ll

all : 所有的消息都派发到线程池,包括请求,响应,连接事件、断开事件、心跳。

direct 所有的消息都不派发到线程池,直接在IO线程上执行。

message 只有请求、响应消息派发到线程池,其他如断开事件,连接事件

、心跳等在IO线程上执行

execution,只请求消息派发到线程池,响应和其他连接比如断开事件都在IO线程上执行。

connection 在IO线程上,将连接断开事件放入队列,有序逐个执行,其他消息转发到线程池。

疑问:execution,,响应不在IO线程上执行,是什么个意思,那整个流程是怎么交互的呢?

对all,direct message模式理解,对execution模式不理解。

2)<dubbo:registry> 注册中心配置,如果有多个注册中心,可以声明多个标签,并在dubbo:service或dubbo:refercence中

的registry属性指定要注册到哪些注册中心。

相关配置属性:

id

address

protocol

port

username

password

transport

timeout

session

file

wait

register

subscribe

dynamic

从这些标签中学到了什么:

address   协议://host:ip

procotol

host

port

file 标签,可以将注册中心列表,提供者列表缓存在本地文件中。

transport 网络通信模式,可选值 netty mina

register    是否注册

subscribe  是否从注册中心订阅服务。

3、 dubbo:service 服务提供者声明标签

interface

ref

version

group      服务分组,如果一个接口有多个实现时,可以用分组来区分。

path

delay       服务延迟暴露,-1表示当spring容器初始化后在暴露。

timeout

retries

connections    对每个服务提供者最大的连接数。

loadbalance   负载均衡算法

async              是否为异步调用

stub

mock

token

registry

provider         指定默认属性关联

depreacated  是否过期

dynamic         是否动态上下线

accesslog

owner

document

weight

executes         服务提供者每服务每方法最大可并行执行请求数

actives            每服务每消费者每服务每方法最大可并行请求数

proxy             生成动态代理方式

cluster           集群方式

filter

listener

protocol

layer

register

重要属性学习:

interface        接口名称

delay             设置为-1,表示等待Spring容器初始化后,再暴露服务。

timeout         设置服务调用超时时间,单位为毫秒。

retries            设置重试次数,默认为2,表示重试次,最多调用3次。

connections   服务最大连接数

loadbalance   负载均衡算法,默认random, roudbin(轮询)、最小负载。

stub                表示本地存根,在调用服务之前调用

mock              表示服务调用后执行出现RpcException时执行。

cluster            集群方式,主要有failover failfast failsafe failback forking

failover

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

通常用于读操作,幂等操作。

failfast

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

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

failback

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

通常用于消息通知操作

forking

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

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

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

broadcast

广播调用所有提供者,逐个调用,任意一台报错即报错。

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

4、 dubbo:reference 服务消费者引用服务配置

id

interface

version

group

timeout

retries

connections

async

generic

check

url   直连服务提供者

stub

mock
               cache

validation

proxy

client

owner

actives

cluster

filter

listener

init

protocol

2、dubbo常用问题学习

1)dubbo协议缺省 每服务每提供者每消费者使用单一长连接,如果数据传输量大,

可以考虑使用多条连接。

<dubbo:service connections="0">  表示使用JVM共享长连接. 什么是JVM共享长连接。

<dubbo:service connections="1">  表示使用独立长连接

<dubbo:server connections="2"> 表示使用两条长连接。

2)

3、服务化最佳实践

1、分包

1)建议将服务接口,服务模型,服务异常等都放到API包中。

实际使用情况:

服务类接口放在API包中,服务模型放在服务提供方;接口返回值,接口

参数使用一个上下文对接,服务模型在服务提供方序列化为JSON字符串。

2、粒度

1)、服务接口尽可能大粒度,每个服务方法代表一个功能,而不是一个功能的

一个步骤,否则将面临分布式事务。

2)、服务接口建议以业务场景为单位,将相近的业务做抽象,这样避免接口爆

炸,也有利于服务治理,比如降级。

3)、不建议使用过于抽象的通用接口,如Map query(Map)这样接口没有明

确的语义,会给后期维护带来不便。

实际使用情况

遵从1、2两点,服务接口的声明类似

RainbowContent    sendTopic(RainbowContent);关于维护性,我们规定

Dao层的接口,不使用过于抽象的通用声明,坚决不使用Map query(Map),来尽

量保证可维护性。

3、版本

1)每个接口都应对应版本号,为后续不兼容升级提供可能
       2)建议使用两位版本号,因为第三位版本号通常表示兼容版本号。

3)当不兼容时,先升级一半提供者为新版本,再将消费者全部升级为新版本,然后将

另一半提供者升级为新版本。

目前:我们在dubbo服务这层,没有使用版本号。

4、兼容性

服务接口增加方法,服务模型增加字段,可向后兼容。这也是做接口特别需要注意的地

方,要尽量兼容以前版本;如果不兼容,接口应该应该与客户端制定版本约定。

5、异常

1)建议使用异常汇报错误,而不是返回错误码,异常信息能携带更多的语义提示。

2)如果担心性能问题,在必要时,可以通过ovverride将异常类的fillInStackTrace()方

法覆盖为空方法。

3)查询方法不建议抛出chcked异常。

4)服务提供方不应该将DAO或SQL等异常抛出给消费方。

4、推荐用法

1)在Provider上尽量多配置Consumer端属性。

原因如下:

1、作为服务的提供方,比服务使用方更清楚服务性能参数,比如调用的超时时间、

合理的重试次数等。

2、在Provider配置后,Customer不配置则会使用服务端的配置值,即Provider方

的配置可以作为Consumer端的缺省配置,否则会使用Consumer端的全局配

置。在服务端多配置Consumer端的属性,让Provider实现者一开始就思考

Provider服务特点、服务质量问题。

2)在服务端可以配置如下客户端属性

timeout                   方法调用超时时间

retries                      失败重试次数,缺省为2,表示最多调用3次。

loadbalances          负载均衡算法,默认为随机(加权),还有轮询,最不活跃

actives                     消费者端,最大并发调用限制,即当Consumer对一个服务的

并发调用达到上限,新的调用会wait直到超时。

3)在服务端配置合理的Provider属性。

threads                    服务线程池大小

queues                      服务线程队列长度,默认为0,如果线程池的已满,已经返回错误,引导连接重试。

executes                  一个服务提供者并行执行请求的上限。需要查阅executes与

activies的区别。

4)配置管理上信息

5)配置dubbo缓存文件

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

1、文件的路径,应用可以根据需要调整,保证这个文件不会在发布过程中被清除。

2、如果有多个应用进程注意不要使用同一个文件,避免内容被覆盖。

这个文件会缓存 注册中心的列表、服务提供者列表。

待解决问题:

1、如何测试压满连接

2、dubbo各协议比较。

3、序列化方式比较

4、监控中心。

时间: 2024-08-04 22:18:30

Dubbox学习笔记的相关文章

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Activiti 学习笔记记录(三)

上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

[原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过