Dubbo的基础配置
Dubbo的基础配置使用
- 启动时检查
- 超时重连
- 集群容错
- 负载均衡配置
- 结果缓存
- 服务分组
- 多版本
- 只订阅/只注册
- 异步调用
- 事件通知
- 参数回调
- 本地伪装-- 服务降级
- 本地存根
- 集群容错
- 服务降级
- Provider 端应尽量配置的属性
- 泛化调用
- Dubbo中的REST
- Dubbo 控制台部署
Dubbo的基础配置使用
xml 配置方式
服务提供者暴露服务配置: 配置类: com.alibaba.dubbo.config.ServiceConfig
- interface : 服务接口名
- ref : 服务对象实现引用
- version : 服务版本,建议使用两位数字版本,如:1.0, 通常在接口不兼容时版本号才需要升级
- group : 服务分组,当一个接口有多个实现,可以用分组 区分
- path : 服务路径 (注意:1.0 不支持自定义路径,总是使用接口名,如果有 1.0 调 2.0,配置服务路径 可能不兼容)
- delay : 延迟注册服务时间(毫秒) ,设为-1 时,表示延 迟到 Spring 容器初始化完成时暴露服务 (0)
- timeout : 远程服务调用超时时间(毫秒) (1000)
- retries : 远程服务调用重试次数,不包括第一次调用,不 需要重试请设为 0 (2)
- connections : 对每个提供者的最大连接数,rmi、http、hessian 等短连接协议表示限制连接数,dubbo 等长连接 协表示建立的长连接个数 (100)
- loadbalance : 负载均衡策略,可选值: random,roundrobin,leastactive,分别表示:随 机,轮循,最少活跃调用 (random)
- async : 是否缺省异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程 (false)
- stub : 设为 true,表示使用缺省代理类名,即:接口名 + Local 后缀,服务接口客户端本地代理类名, 用于在客户端执行本地逻辑,如本地缓存等,该 本地代理类的构造函数必须允许传入远程代理对象,构造函数如:public XxxServiceLocal(XxxService xxxService)
- mock : 设为 true,表示使用缺省 Mock 类名,即:接口 名 + Mock 后缀,服务接口调用失败 Mock 实现 类,该 Mock 类必须有一个无参构造函数,与 Local 的区别在于,Local 总是被执行,而 Mock 只在出现非业务异常(比如超时,网络异常等)时 执行,Local 在远程调用之前执行,Mock 在远 程调用后执行。
- token : 令牌验证,为空表示不开启,如果为 true,表示 随机生成动态令牌,否则使用静态令牌,令牌的 作用是防止消费者绕过注册中心直接访问,保证 注册中心的授权功能有效,如果使用点对点调 用,需关闭令牌功能
- registry : 向指定注册中心注册,在多个注册中心时使用 值为
的 id 属性,多个注册中心 ID 用逗号分隔,如果不想将该服务注册到任何 registry,可将值设为 N/A
- provider : 指定 provider,值为dubbo:provider的 id 属性
- deprecated : 服务是否过时,如果设为 true,消费方引用时将 打印服务过时警告 error 日志
- dynamic : 服务是否动态注册,如果设为 false,注册后将 显示后 disable 状态,需人工启用,并且服务提 供者停止时,也不会自动取消册,需人工禁用
- accesslog : 设为 true,将向 logger 中输出访问日志,也可 填写访问日志文件路径,直接把访问日志输出到 指定文件
- owner : 服务负责人,用于服务治理,请填写负责人公司 邮箱前缀
- document : 服务文档 URL
- weight : 服务权重
- executes : 服务提供者每服务每方法最大可并行执行请求数
- actives : 每服务消费者每服务每方法最大并发调用数
- proxy : 生成动态代理方式,可选:jdk/javassist
- cluster : 集群方式,可选: failover/failfast/failsafe/failback/forking
- filter : 服务提供方远程调用过程拦截器名称,多个名称 用逗号分隔
- listener : 服务提供方导出服务监听器名称,多个名称用逗 号分隔
- protocol : 使用指定的协议暴露服务,在多协议时使用,值 为
的 id 属性,多个协议 ID 用 逗号分隔
- layer : 服务提供者所在的分层。如:biz、dao、intl:web china:acton。
- register : 该协议的服务是否注册到注册中心
服务消费者引用服务配置: 配置类: com.alibaba.dubbo.config.ReferenceConfig
- id : 服务引用 BeanId
- interface : 服务接口名
- version : 服务版本,与服务提供者的版本一致
- group : 服务分组,当一个接口有多个实现,可以用分组区分,必需和服务提供方一致
- timeout : 服务方法调用超时时间(毫秒)
- retries : 远程服务调用重试次数,不包括第一次调 用,不需要重试请设为 0
- connections : 对每个提供者的最大连接数,rmi、http、 hessian 等短连接协议表示限制连接数, dubbo 等长连接协表示建立的长连接个数
- loadbalance : 负载均衡策略,可选值: random,roundrobin,leastactive,分别表 示:随机,轮循,最少活跃调用
- async : 是否异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程
- generic : 是否缺省泛化接口,如果为泛化接口,将 返回 GenericService
check
: 启动时检查提供者是否存在,true 报错, false 忽略
- url : 点对点直连服务提供者地址,
将绕过注册中心
- stub : 服务接口客户端本地代理类名,用于在客 户端执行本地逻辑,如本地缓存等,该本地代理类的构造函数必须允许传入远程 代理对象,构造函数如:public XxxServiceLocal(XxxService xxxService)
- mock : 服务接口调用失败 Mock 实现类名,该
Mock 类必须有一个无参构造函数,与 Local 的区别在于,Local 总是被执行,而 Mock 只在出现非业务异常(比如超时,网 络异常等)时执行,Local 在远程调用之前 执行,Mock 在远程调用后执行。
- cache : 以调用参数为 key,缓存返回结果,可选 lru, threadlocal, jcache 等
- validation : 是否启用 JSR303 标准注解验证,如果启用,将对方法参数上的注解进行校验
- proxy : 选择动态代理实现策略,可选:javassist, jdk (javassist)
- client : 客户端传输类型设置,如 Dubbo 协议的 netty 或 mina。
- registry : 从指定注册中心注册获取服务列表,在多 个注册中心时使用,值为
的 id 属性,多个注册中 心 ID 用逗号分隔
- owner : 调用服务负责人,用于服务治理,请填写负责人公司邮箱前缀
- actives : 每服务消费者每服务每方法最大并发调用数
- cluster : 集群方式,可选: failover/failfast/failsafe/failback/forking (failover)
- filter : 服务消费方远程调用过程拦截器名称,多个名称用逗号分隔
- listener : 服务消费方引用服务监听器名称,多个名称用逗号分隔
- layer : 服务调用者所在的分层。如:biz、dao、 intl:web、china:acton。
- init : 是否在 afterPropertiesSet()时饥饿初始化引用,否则等到有人注入或引用该实例时再初始化。(false)
- protocol : 只调用指定协议的服务提供方,其它协议忽略。
服务提供者协议配置: 配置类:com.alibaba.dubbo.config.ProtocolConfig
说明:如果需要支持多协议,可以声明多个
标签,并在
中通过 protocol 属性指定使用的协议。
- id : 协议 BeanId,可以在
中引用此 ID,如果 ID 不填, 缺省和 name 属性值一样,重复则在 name 后加序号。(dubbo)
- name : 协议名称 (dubbo)
- port : 服务端口 (dubbo 协议缺省端 口为 20880,rmi 协议缺省端口为 1099,http 和 hessian 协议缺省 端口为 80 如果配置为-1 或 者 没有配置 port, 则会分配一个没有 被占用的端口。 Dubbo 2.4.0+,分 配的端口在协议缺 省端口的基础上增 长,确保端口段可 控。)
- host : 服务主机名,多网卡选择或指定 VIP 及域 名时使用,为空则自动查找本机 IP,-
建议 不要配置,让 Dubbo 自动获取本机 IP
(自动查找本机 IP)
- threadpool : 线程池类型,可选:fixed/cached (fixed)
- threads : 服务线程池大小(固定大小) (100)
- iothreads : io 线程池大小(固定大小) (cpu 个数+1)
- accepts : 服务提供方最大可接受连接数 (0)
- payload : 请求及响应数据包大小限制,单位:字节 (88388608(=8M))
- codec : 协议编码方式 (dubbo)
- serialization : 协议序列化方式,当协议支持多种序列化方式时使用,比如:dubbo 协议的 dubbo,hessian2,java,compactedjava,以 及 http 协议的 json 等 (dubbo 协议缺省为 hessian2,rmi 协 议缺省为 java,http 协议缺省为 json)
- accesslog : 设为 true,将向 logger 中输出访问日志, 也可填写访问日志文件路径,直接把访问 日志输出到指定文件
- path : 提供者上下文路径,为服务 path 的前缀
- transporter : 协议的服务端和客户端实现类型,比如: dubbo 协议的 mina,netty 等,可以分拆为 server 和 client 配置 (dubbo 协议缺省为 netty)
- server : 协议的服务器端实现类型,比如:dubbo 协议的 mina,netty 等,http 协议的 jetty,servlet 等 (dubbo 协议缺省为 netty,http 协议缺 省为 servlet)
- client : 协议的客户端实现类型,比如:dubbo 协 议的 mina,netty 等
- dispatcher : 协议的消息派发方式,用于指定线程模型 比如:dubbo 协议的 all, direct, message, execution, connection 等 (dubbo 协议缺省为 all)
- queues : 线程池队列大小,当线程池满时,排队等待执行的队列大小,建议不要设置,当线程程池时应立即失败,重试其它服务提供机器,而不是排队,除非有特殊需求。 (0)
- charset : 序列化编码 (UTF-8)
- buffer : 网络读写缓冲区大小 (8192)
- heartbeat : 心跳间隔,对于长连接,当物理层断开时 比如拔网线,TCP 的 FIN 消息来不及发送对方收不到断开事件,此时需要心跳来帮助检查连接是否已断开
- telnet : 所支持的 telnet 命令,多个命令用逗号分隔
- register : 该协议的服务是否注册到注册中心
- contextpath
注册中心配置:
配置类:com.alibaba.dubbo.config.RegistryConfig
说明:如果有多个不同的注册中心,可以声明多个
标签,并在
或
的 registry 属性指定使用的注册中心。
- id : 注册中心引用 BeanId,可以在
或
中引 用此 ID
- address : 注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如: ip:port,ip:port,不同集群的注册中心,请配置多个
标签
- protocol : 注同中心地址协议,支持 dubbo, http, local 三种协 议,分别表示,dubbo 地址,http 地址,本地注册中心
- port : 注册中心缺省端口,当 address 没有带端口时使用 此端口做为缺省值 (9090)
- username : 登录注册中心用户名,如果注册中心不需要验证可不填
- password : 登录注册中心密码,如果注册中心不需要验证可不填
- transport : 网络传输方式,可选 mina,netty
- timeout : 注册中心请求超时时间(毫秒) (5000)
- session : 注册中心会话超时时间(毫秒),用于检测提供者非正常断线后的脏数据,比如用心跳检测的实现,此 时间就是心跳间隔,不同注册中心实现不一样。(60000)
- file : 使用文件缓存注册中心地址列表及服务提供者列表,应用重启时将基于此文件恢复,注意:两个注 册中心不能使用同一文件存储
- wait : 停止时等待通知完成时间(毫秒)
- check : 注册中心不存在时,是否报错
- register : 是否向此注册中心注册服务,如果设为 false,将只订阅,不注册
- subscribe : 是否向此注册中心订阅服务,如果设为 false,将只注册,不订阅
- dynamic : 服务是否动态注册,如果设为 false,注册后将显示后 disable 状态,需人工启用,并且服务提供者停 止时,也不会自动取消册,需人工禁用。
监控中心配置类:com.alibaba.dubbo.config.MonitorConfig
- protocol : 监控中心协议,如果为 protocol=“registry”,表示从注册中 心发现监控中心地址,否则直连监控中心。
- address : 直连监控中心服务器地址, address=“x.x.x.x:12080”
应用信息配置类:com.alibaba.dubbo.config.ApplicationConfig
- name : 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样,此参 数不是匹配条件,你当前项目叫什么名字就填什么,和提供者消费者角色无关
- version : 当前应用的版本
- owner : 应用负责人,用于服务治理,请填写负责人公司邮 箱前缀
- organization : 组织名称(BU 或部门),用于注册中心区分服务来源,此配置项建议不要使用 autoconfig,直接写 死在配置中,比如 china,intl,itu,crm,asc,dw,aliexpress 等
- architecture : 用于服务分层对应的架构。如,intl、china。不同的架构使用不同的分层。
- environment : 应用环境,如:develop/test/product,不同环境使 用不同的缺省值,以及作为只用于开发测试功能的 限制条件
- compiler : Java 字节码编译器,用于动态类的生成,可选:jdk 或 javassist
- logger : 日志输出方式,可选:slf4j,jcl,log4j,jdk (slf4j)
- name : 当前模块名称,用于注册中心计算模块间依赖关系
- version : 当前模块的版本
- owner : 模块负责人,用于服务治理,请填写负责人公司邮箱前缀
- organization : 组织名称(BU 或部门),用于注册中心区分服务来源,此配 置项建议不要使用 autoconfig,直接写死在配置中
服务提供者缺省值配置类:com.alibaba.dubbo.config.ProviderConfig
说明:该标签为
和
标签的缺省值设置。
- id : 协议 BeanId,可以在
中引用此 ID
- protocol : 协议名称
- host : 服务主机名,多网卡选择或指定 VIP 及 域名时使用,为空则自动查找本机 IP, 建议不要配置,让 Dubbo 自动获取本机 IP
- threads : 服务线程池大小(固定大小) (100)
- payload : 请求及响应数据包大小限制,单位:字节 (88388608(=8M))
- path : 提供者上下文路径,为服务 path 的前缀
- server : 协议的服务器端实现类型,比如:dubbo 协议的 mina,netty 等,http 协议的jetty,servlet 等
- client : 协议的客户端实现类型,比如:dubbo 协议的 mina,netty 等
- codec : 协议编码方式
- serialization : 协议序列化方式,当协议支持多种序列 化方式时使用,比如:dubbo 协议的 dubbo,hessian2,java,compactedjava, 以及 http 协议的 json,xml 等
- filter : 服务提供方远程调用过程拦截器名称,多个名称用逗号分隔
- listener : 服务提供方导出服务监听器名称,多个名称用逗号分隔
- threadpool : 线程池类型,可选:fixed/cached
- accepts : 服务提供者最大可接受连接数
- version : 服务版本,建议使用两位数字版本,如 1.0,通常在接口不兼容时版本号才需要 升级
- group : 服务分组,当一个接口有多个实现,可以用分组区分
- delay : 延迟注册服务时间(毫秒)- ,设为-1 时, 表示延迟到 Spring 容器初始化完成时暴 露服务
- timeout : 远程服务调用超时时间(毫秒)(1000)
- retries : 远程服务调用重试次数,不包括第一次 调用,不需要重试请设为 0 (2)
- connections : 对每个提供者的最大连接数,rmi、http hessian 等短连接协议表示限制连接数 dubbo 等长连接协表示建立的长连接个数
- loadbalance : 负载均衡策略,可选值: random,roundrobin,leastactive,分别表 示:随机,轮循,最少活跃调用
- async : 是否缺省异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程
- stub : 设为 true,表示使用缺省代理类名,即 接口名 + Local 后缀。
- mock : 设为 true,表示使用缺省 Mock 类名, 即:接口名 + Mock 后缀。
- token : 令牌验证,为空表示不开启,如果为 true,表示随机生成动态令牌
- registry : 向指定注册中心注册,在多个注册中心 时使用,值为
的 id 属 性,多个注册中心 ID 用逗号分隔,如果 不想将该服务注册到任何 registry,可将 值设为 N/A
- dynamic : 服务是否动态注册,如果设为 false,注 册后将显示后 disable 状态,需人工启用,并且服务提供者停止时,也不会自 动取消册,需人工禁用。
- accesslog : 设为 true,将向 logger 中输出访问日志 也可填写访问日志文件路径,直接把访 问日志输出到指定文件
- owner : 服务负责人,用于服务治理,请填写负责人公司邮箱前缀
- document : 服务文档 URL
- weight : 服务权重
- executes : 服务提供者每服务每方法最大可并行执行请求数
- actives : 每服务消费者每服务每方法最大并发调用数
- proxy : 生成动态代理方式,可选:jdk/javassist
- cluster : 集群方式,可选: failover/failfast/failsafe/failback/forking
- deprecated : 服务是否过时,如果设为 true,消费方 引用时将打印服务过时警告 error 日志
- queues : 线程池队列大小,当线程池满时,排队等待执行的队列大小,建议不要设置,当线程程池时应立即失败,重试其它服务提供机器,而不是排队,除非有特殊需求。
- charset : 序列化编码
- buffer : 网络读写缓冲区大小
- iothreads : IO 线程池,接收网络读写中断,以及序 列化和反序列化,不处理业务,业务线 程池参见 threads 配置,此线程池和 CPU 相关,不建议配置。(CPU + 1)
- telnet : 所支持的 telnet 命令,多个命令用逗号 分隔
- layer : 服务提供者所在的分层。如:biz、dao intl:web、china:acton
- contextpath
服务消费者缺省值配置类: com.alibaba.dubbo.config.ConsumerConfig
说明:该标签为
标签的缺省值设置
- timeout : 远程服务调用超时时间(毫秒) (1000)
- retries : 远程服务调用重试次数,不包括第一次 调用,不需要重试请设为 0 (2)
- loadbalance : 载均衡策略,可选值: random,roundrobin,leastactive,分别 表示:随机,轮循,最少活跃调用 (random)
- async : 是否缺省异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程
- connections : 每个服务对每个提供者的最大连接数, rmi、http、hessian 等短连接协议支持 此配置,dubbo 协议长连接不支持此配置
- generic : 是否缺省泛化接口,如果为泛化接口, 将返回 GenericService
- check : 启动时检查提供者是否存在,true 报错 false 忽略
- proxy : 生成动态代理方式,可选:jdk/javassist
- owner : 调用服务负责人,用于服务治理,请填写负责人公司邮箱前缀
- actives : 每服务消费者每服务每方法最大并发调用数
- cluster : 集群方式,可选: failover/failfast/failsafe/failback/forking (failover)
- filter : 服务消费方远程调用过程拦截器名称,多个名称用逗号分隔
- listener : 服务消费方引用服务监听器名称,多个 名称用逗号分隔
- registry : 向指定注册中心注册,在多个注册中心 时使用,值为
的 id 属 性,多个注册中心 ID 用逗号分隔,如 果不想将该服务注册到任何 registry, 可将值设为 N/A
- layer : 服务调用者所在的分层。如:biz、dao intl:web、china:acton。
- init : 是否在 afterPropertiesSet()时饥饿初始 化引用,否则等到有人注入或引用该实 例时再初始化。
- cache : 以调用参数为 key,缓存返回结果,可 选:lru, threadlocal, jcache 等
- validation : 是否启用 JSR303 标准注解验证,如果 启用,将对方法参数上的注解进行校验
方法级配置类:com.alibaba.dubbo.config.MethodConfig
说明:该标签为
或
的子标签,用于控制到方法级
- name : 方法名
- timeout : 方法调用超时时间(毫秒)
- retries : 远程服务调用重试次数,不包括第 一次调用,不需要重试请设为 0
- loadbalance : 负载均衡策略,可选值: random,roundrobin,leastactive, 分别表示:随机,轮循,最少活跃 调用
- async : 是否异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程
- sent : 异步调用时,标记 sent=true 时, 表示网络已发出数据
- actives : 每服务消费者最大并发调用限制
- executes : 每服务每方法最大使用线程数限制,此属性只在
作为
子标签时有效
- deprecated : 服务方法是否过时,此属性只在
作为
子标签时有效
- sticky : 设置 true 该接口上的所有方法使用同一个 provider.如果需要更复杂的规则,请使用用路由
- return : 方法调用是否需要返回值,async 设置为 true 时才生效,如果设置 为 true,则返回 future,或回调 onreturn 等方法,如果设置为 false,则请求发送成功后直接返 回 Null
- oninvoke : 方法执行前拦截
- onreturn : 方法执行返回后拦截
- onthrow : 方法执行有异常拦截
- cache : 以调用参数为 key,缓存返回结 果,可选:lru, threadlocal, jcache 等
- validation : 是否启用 JSR303 标准注解验证 如果启用,将对方法参数上的注解 进行校验
方法参数配置类: com.alibaba.dubbo.config.ArgumentConfig
说明:该标签为
的子标签,用于方法参数的特征描述
- index : 方法名
- type : 通过参数类型查找参数的 index
- callback : 参数是否为 callback 接口,如果为 callback,服务提供方将生成反向代理可以从服务提供方反向调用消费方,通常用于事件推送.
选项参数配置类: java.util.Map
说明:该标签为
或
或
或
或
的子标签,用于配置自定义参数,该配置项将作为扩展点设置自定义参数使用
- key : 路由参数键
- value : 路由参数键
注解方式
ApplicationConfig、ProtocolConfig 、 RegistryConfig、Service、Reference
EnableDubbo 开启服务
- @EnableDubbo: 开启注解 Dubbo 功能 ,其中可以加入 scanBasePackages 属性配置包扫描的路径,用于扫描并 注册 bean。其中封装了组件 @DubboComponentScan,来扫描 Dubbo @Service 注解暴露 Dubbo 服务,以及 扫描Dubbo @Reference字段或者方法注入Dubbo服务代理。
其它 Dubbo 三种公共信息的配置,有两种方式,根据自己喜好选用
Configuration 方式配置公共信息
@Configuration
@EnableDubbo(scanBasePackages = "com.dubbo.demo.service")
class ProviderConfiguration {
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("busi-provider");
return applicationConfig;
}
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress("192.168.0.128");
registryConfig.setPort(2181);
return registryConfig;
}
@Bean
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
return protocolConfig;
}
}
Property 方式自动装配公共信息
- Property 方式: 使用 Springboot 属性文件方式,由 Dubbo 自动将文件信息配置入容器,示例 如下:
@Configuration
@EnableDubbo(scanBasePackages = "com.dubbo.demo.service")
@PropertySource("classpath:/dubbo-provider.properties")
static class ProviderConfiguration {
}
dubbo.application.name=busi-provider
dubbo.registry.address=zookeeper://192.168.0.128:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
Dubbo 高级特性配置
1. 启动时检查
Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻 止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check=“true”
可以通过 check="false"关闭检查,比如,测试时,有些服务不关心,或者出 现了循环依赖,必须有一方先启动
另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务, 请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check=“false”,总是会返回引用,当服务恢复时,能自动连上
- 关闭某个服务的启动时检查(没有提供者时报错):
- 关闭所有服务的启动时检查(没有提供者时报错):
- 关闭注册中心启动时检查(注册订阅失败时报错):
2. Dubbo 超时重连
超时
Dubbo 消费端在发出请求后,需要有一个临界时间界限来判断服务端是否正常。这样消费端达到超 时时间,那么 Dubbo 会进行重试机制,不合理的重试在一些特殊的业务场景下可能会引发很多问题, 需要合理设置接口超时时间
Dubbo 超时和重试配置示例:
<dubbo:reference id="xxxService" interface="com.xxx.XxxService" retries="0" timeout="5000"/>
在服务提供者和服务消费者上都可以配置服务超时时间,这两者是不一样的。
消费者调用一个服务,分为三步:
- 消费者发送请求(网络传输)
- 服务端执行服务
- 服务端返回响应(网络传输)
如果在服务端和消费端只在其中一方配置了timeout,那么没有歧义,表示消费端调用服务的超时时间,消费端如果超过时间还没有收到响应结果,则消费端会抛超时异常,但,服务端不会抛异常,服务端在执行服务后,会检查执行该服务的时间,如果超过timeout,则会打印一个超时日志。服务会正常的执行完。
如果在服务端和消费端各配了一个timeout,那就比较复杂了,假设
- 服务执行为5s
- 消费端timeout=3s
- 服务端timeout=6s
那么消费端调用服务时,消费端会收到超时异常(因为消费端超时了),服务端一切正常(服务端没有超时)。
重连
Dubbo 在调用服务不成功时,默认会重试 2 次
Dubbo 的路由机制,会把超时的请求路由到其他机器上,而不是本机尝试,所以 Dubbo 的重试机制也能一定程度的保证服务的质量
3. 集群容错
当消费端某次调用失败是一些环境偶然因素造成的(如网络抖动),dubbo 还给予了容错补救机会。补救方式存在以下几种
<dubbo:consumer cluster="failover” retries="2" forks="2" />
1、 Failover :当出现失败,重试其它服务器。 retries=“2” 来设置重试次数(不含第一次)。
幂等性操作使用,如读操作
2、 Failfast :快速失败,只发起一次调用,失败立即报错
非幂等性操作,如写操作
3、 Failsafe :出现异常时,直接忽略
无关紧要的旁支操作,如打日志
4、 Failback :后台记录失败请求,定时重发
后续专业处理
5、 Forking :并行调用多个服务器,只要一个成功即返回
forks=“2” 来设置最大并行数
4. 负载均衡配置
在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。 可以自行扩展负载均衡策略
<dubbo:consumer loadbalance="random"/>
1、 Random :按权重随机------根据weight值(服务方设置)来随机
2、 RoundRobin :轮询
3、 LeastActive :最少活跃数(正在处理的数),慢的机器,收到的请求少
5. 结果缓存
dubbo 对方法调用的结果,还有缓存功能。
在服务消费方和提供方都可以配置使用缓存。
以消费方为例,可以配置全局缓存策略,这样所有服务引用都启动缓存
<dubbo:consumer cache="lru"/>
还可以仅对某个服务引用配置缓存策略
<dubbo:reference id="xxxService" interface="com.xxx.XxxService" cache="lru" >
还支持对单个方法启用缓存策略
<dubbo:reference id="xxxService" interface="com.xxx.XxxService" >
<dubbo:method name="sayHello" cache="lru"> dubbo:method>
dubbo:reference>
服务方配置方法与消费端完全一样
6. 服务分组
比如,想在同一个注册中心中,分隔测试和开发环境(省一套注册服务)
<dubbo:consumer group ="dev"/>
<dubbo:provider group ="dev"/>
只要 group 按开发组和测试组对应,同一个注册中心里的两套服务就互不干扰
7. 多版本
服务端提供接口的实现升级时,可由 dubbo 的版本号操作进行过渡。如果上线上测试新版本接口有缺陷,为了不影响业务,要迅速切回原版本接口,最大程度减少损失。
服务方:
<dubbo:service interface="com.xxx.XxxServices" ref="xxxService" protocol="hessian" version="1.0"/>
<dubbo:service interface="com.xxx.XxxServices" ref="xxxService2" protocol="hessian" version="2.0"/>
消费方:
<dubbo:reference id="xxxService1.0"
interface="com.xxx.XxxServices" protocol="hessian" version="2.0"/>
8. 只订阅/只注册
只订阅
场景:我们在本地开发的时候,不能把自己机器的未开发好的服务注册到开发环境,但是又需要使 用注册中心的其他服务
服务提供者配置禁止注册 register=“false”
<dubbo:registry protocol="zookeeper" register="false"/>
只注册
比如开发环境为了省机器,没有部署某个服务,如短信/邮件功能。但整个系统又必须要调用它。此时我们可以借用一下测试环境的此服务(不能影响测试环境原本的服务闭环)。将测试环境的短信/邮件服务也向开发环境注册一份,只注册(其依赖的服务必须还是测试环境的)
服务提供者配置禁止订阅 subscribe=“false”
<dubbo:registry protocol="zookeeper" subscribe="false"/>
9. 异步调用
官网地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/async-call/
理解起来比较容易,主要要理解CompletableFuture,如果不理解,就直接把它理解为Future
其他异步调用方式:https://mp.weixin.qq.com/s/U3eyBUy6HBVy-xRw3LGbRQ
Dubbo 的异步调用是非阻塞的 NIO 调用,一个线程可同时并发调用多个远程服务,每个服务的调用都是非阻塞的,线程立即返回。就是对 java 中 Futrue 模式的扩展支持
如上图,userThread 发出调用后,IOThread 会立即返回,并在 RPC 上下文 RpcContext 中设置 Future。userThread 后续可以从 RpcContext 中取得此 Future, 然后 wait 这个 Future 其它的事情都由 IOThread 完成。
总之,userThread 发出调用后 IOThread 会立刻返回,而不是等调用在服务端 执行完代码、返回结果后返回。用户返回后可以去做点其它事情,比如调用 另外一个服务,然后回头等待前一个调用完成。从上图可以看出,异步调用 完全是 Consumer 端的行为。
配置:
<dubbo:reference id="xxxService" interface="com.xxx.XxxService">
<dubbo:method name="doSomething" async="true" />
dubbo:reference>
async=true 表示异步调用,可以看到配置发生在 Consumer 端,能精确到方法。
方法异步调用后,Consumer 端的代码写法:
xxxService.doSomething(xxx);
Future<XXX> xxxFuture = RpcContext.getContext().getFuture();
Foo foo = fooFuture.get();
配置是否等待 IOThread 发送完 Request 后再返回:
- sent=“true”,等待请求发送出去后再返回,如果发送失败直接抛出异常。
- sent=“false”,将调用交给IOThread后立即返回。实际这个时候请求进
入到 IOThread 的队列,排除等着被发送出去。
<dubbo:method name="xxx" async="true" sent="true" />
如果对返回结果没有兴趣:
<dubbo:method name="xxx" async="true" return="false" />
10. 事件通知
对于一次远程方法调用,有 oninvoke、onreturn、onthrow 三个事件,分别为调用之前、返回之后, 抛出异常三个事件。
在 Consumer 端,可以为三个事件指定事件处理方法。
首先,需要在 SpringIOC 容器中,创建一个实现了回调接口的 Bean, 假设 id=callback
interface Callback {
public void onreturn(Person msg, Integer id);
public void onthrow(Throwable ex, Integer id);
}
方法中,第一个参数是远程方法的返回值,其它是方法的参数。
然后在 Dubbo 中配置:
<dubbo:reference interface="com.xxx.XxxService" >
<dubbo:method name="doSomeThing" async="true" onreturn = "callback.onreturn" onthrow="callback.onthrow" />
dubbo:reference>
配置中 async 与 onreturn、onthrow 是成对配置,组合不同,功能也不同:
- 异步回调模式: async=true onreturn=“xxx”
- 同步回调模式: async=false onreturn=“xxx”
- 异步无回调 : async=true
- 同步无回调 : async=false
11. 参数回调
官网地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/callback-parameter/
官网上的Demo其实太复杂,可以看课上的Demo更为简单。
首先,如果当前服务支持参数回调,意思就是:对于某个服务接口中的某个方法,如果想支持消费者在调用这个方法时能设置回调逻辑,那么该方法就需要提供一个入参用来表示回调逻辑。
因为Dubbo协议是基于长连接的,所以消费端在两次调用同一个方法时想指定不同的回调逻辑,那么就需要在调用时在指定一定key进行区分。
12. 本地伪装-- 服务降级
官网地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/local-mock/
本地伪装就是Mock,Dubbo中Mock的功能相对于本地存根更简单一点,Mock其实就是Dubbo中的服务容错的解决方案。
13. 本地存根
官网地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/local-stub/
本地存根,名字很抽象,但实际上不难理解,本地存根就是一段逻辑,这段逻辑是在服务消费端执行的,这段逻辑一般都是由服务提供者提供,服务提供者可以利用这种机制在服务消费者远程调用服务提供者之前或之后再做一些其他事情,比如结果缓存,请求参数验证等等。
14. 集群容错
官网地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/fault-tolerent-strategy/
集群容错表示:服务消费者在调用某个服务时,这个服务有多个服务提供者,在经过负载均衡后选出其中一个服务提供者之后进行调用,但调用报错后,Dubbo所采取的后续处理策略。
15. 服务降级
官网地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/service-downgrade/
服务降级表示:服务消费者在调用某个服务提供者时,如果该服务提供者报错了,所采取的措施。
集群容错和服务降级的区别在于:
- 集群容错是整个集群范围内的容错
- 服务降级是单个服务提供者的自身容错
16. Provider 端应尽量配置的属性
Dubbo 的属性配置优先度上,遵循如下顺序: reference属性 》 service属性 》 consumer属性
其中 reference 和 consumer 是消费端配置,service 是服务端配置
而对于服务调用的超时时间、重试次数等属性,服务的提供方比消费方更了解服务性能,因此我们应该在 Provider 端尽量多配置 Consumer 端属性, 让其漫游到消费端发挥作用。
Provider 端尽量多配置 Consumer 端的属性,也让 Provider 的实现者一开始就思考 Provider 端的 服务特点和服务质量等问题。
建议在 Provider 端配置的 Consumer 端属性有:
- timeout:方法调用的超时时间
- retries:失败重试次数
- loadbalance:负载均衡算法,缺省是随机 random。
- actives:消费者端的最大并发调用限制,即当 Consumer 对一个服务的并发调用到上限后,新调用会阻塞直到超时,在方法上配置 dubbo:method 则针对该方法进行并发限制,在接口上配置 dubbo:service,则针对该服务进行并发限制
<dubbo:service interface="com.xxx.xxxService" timeout="300" retries="2" loadbalance="random" actives="0">
<dubbo:method name="xxx" timeout="10000" retries="9" loadbalance="random" actives="5" />
dubbo:service>
建议在 Provider 端配置的 Provider 端属性有:
- threads: 服务线程池大小
- executes: 一个服务提供者并行执行请求上限,即当 Provider 对一个服务的并发调用达到上限后,新调用会阻塞,此时 Consumer 可能会超时。 在方法上配置 dubbo:method 则针对该方法进行并发限制,在接口上配置 dubbo:service,则针对该服务进行并发限制
<dubbo:protocol threads="200" />
<dubbo:service interface="com.xxx.xxxService" version="1.0.0" ref="xxxService" executes="200" >
<dubbo:method name="xxx" executes="50" />
dubbo:service>
17. 泛化调用
官网地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/generic-reference/
泛化调用可以用来做服务测试。
在Dubbo中,如果某个服务想要支持泛化调用,就可以将该服务的generic属性设置为true,那对于服务消费者来说,就可以不用依赖该服务的接口,直接利用GenericService接口来进行服务调用。
18. 服务拆分最佳实现
分包
建议将服务接口、服务模型、服务异常等均放在 API 包中,因为服务模型和异常也是 API 的一部分,这 样做也符合分包原则:重用发布等价原则(REP:复用的粒度即是发布的粒度,我们所重用的任何东西必须 同时被发布和跟踪),共同重用原则(CRP:如果你重用了一个组件中的一个类,那么就要重用包中的所有类)。
粒度
服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事 务问题,Dubbo 暂未提供分布式事务支持。
不建议使用过于抽象的通用接口,如:Map query(Map),这样的接口没有明确语义,会给后期维护带来不便。
版本
每个接口都应定义版本号,为后续不兼容升级提供可能,如:
<dubbo:service interface= "com.xxx.XxxService" version = "1.0" />
建议使用两位版本号,因为第三位版本号通常表示兼容升级,只有不兼容时才需要变更服务版本。
当不兼容时,先升级一半提供者为新版本,再将消费者全部升为新版本,然后将剩下的一半提供者升为新版本。
异常
建议使用异常汇报错误,而不是返回错误码,异常信息能携带更多信息,并且语义更友好。
19. Dubbo中的REST
官网地址:http://dubbo.apache.org/zh/docs/v2.7/user/rest/
注意Dubbo的REST也是Dubbo所支持的一种协议。
当我们用Dubbo提供了一个服务后,如果消费者没有使用Dubbo也想调用服务,那么这个时候我们就可以让我们的服务支持REST协议,这样消费者就可以通过REST形式调用我们的服务了。
注意:如果某个服务只有REST协议可用,那么该服务必须用@Path注解定义访问路径
20. Dubbo 控制台部署
github地址:https://github.com/apache/dubbo-admin
- 在 dubbo-admin-server 子项目的属性文件中,设置 zk 地址及登陆帐户/密码
- 编译
mvn clean package
- 启动
cd dubbo-admin-distribution/target && java -jar dubbo-admin-0.1.jar
- 访问
http://localhost:8080
- 条件路由的使用示例: 查询服务列表后,对目标服务添加路由
动态配置
官网地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/config-rule/
注意动态配置修改的是服务参数,并不能修改服务的协议、IP、PORT、VERSION、GROUP,因为这5个信息是服务的标识信息,是服务的身份证号,是不能修改的。
服务路由
官网地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/routing-rule/
什么是蓝绿发布、灰度发布: https://zhuanlan.zhihu.com/p/42671353