github测试Demo项目地址:https://github.com/HopeAndStart/spring-dubbp.git
一:概述
继上篇文章讲解如何进行服务发布与消费之后本文将讲解服务发布协议配置项<dubbo:protocol>与注册中心配置项<dubbo:registry>。声明一点就是Dubbo支持多种通信协议,同时也支持多种服务注册中心。所以本文仅仅是讲解这两个标签的配置,具体每种协议发布或者是注册中心使用后面有文章进行介绍
二:服务协议 dubbo:protocol
服务协议配置中最核心的当属name属性指定协议类型,当然配置关联的id属性、port属性以及性能调优的threadpool线程池、serialization序列化方式等也比较重要
2.1 重要基础配置
属性 | 作用 | 默认值 | 描述 |
---|---|---|---|
id | 指定id,供service、reference使用 | 默认service、reference使用所有配置协议 | <dubbo:servicer>与<dubbo:reference>中都有protocol配置属性,分别代表服务发布通信协议与指定消费通信协议类型。其中属性值默认为所有<dubbo:protocol>配置通信协议,如果指定则可以在属性值中填入<dubbo:protocol>配置项id属性值,以", "隔开 |
name | 指定协议名称 | 必填项 | 用以指定协议配置协议类型,比如dubbo代表Dubbo协议、http代表Http协议、rest代表Rest风格协议等 |
port | 发布端口 | dubbo默认20880、rmi默认1099、http和hessian默认80,-1则自动分配未占用端口 | Dubbo消费服务除了在注册中心进行消费外,reference还能通过url属性进行直连消费,这时候的port就是必须的在url中指定的 |
register | 是否发布 | true | service中可以通过register指定是否发布服务,protocol中也可以指定该类型协议服务是否发布 |
accesslog | 访问日志输出 | 可以配置boolean类型标识开启关闭,也可以配置日志文件路径,直接将访问日志输出到日志文件中 | |
server | 协议的服务器端实现 | dubbo协议缺省为netty,http协议缺省为servlet | 例如在配置Rest协议的时候使用tomcat、jetty等 |
2.2 性能调优配置
属性 | 作用 | 默认值 | 描述 |
---|---|---|---|
threadpool | 指定线程池类型 | fixed | 可选类型有默认fixed加载时创建线程不会删除一直持有,以及cached空闲一分钟后删除线程,需要时再创建 |
threads | 线程池固定大小 | 200 | 了解线程池组成的同学应该知道这个配置的含义,不知道的自己去学线程池 |
queues | 线程池队列大小 | 0 | 核心线程占用完时会在线程池队列等待,官网建议不进行配置,直接不等待失败后重试其它服务机器 |
iothreads | IO线程池大小 | CPU + 1 | Dubbo有两个线程池,上面说的threadspool是一个,剩下的就是这个IO线程池。可以通过dispatcher分配请求处理 |
payload | 服务响应数据包大小 | 8M | 不同协议有不同特点,这个属性可以限制不同场景服务下的数据传输容量 |
serialization | 协议序列化方式 | dubbo协议缺省为hessian2,rmi协议缺省为java,http协议缺省为json | 后面会有章节讲协议序列化 |
dispatcher | 协议消息派发方式 | dubbo协议缺省为all | 具体分派方式如下无序列表所示 |
charset | 序列化编码 | UTF-8 | 没有啥特殊要求吧,个人理解在国内而言 |
all
:所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等direct
: 所有消息都不派发到线程池,全部在 IO 线程上直接执行message
: 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在 IO 线程上执行execution
:只有请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在 IO 线程上执行connection
:在 IO 线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池
2.3 个人想法
协议这块的配置除了id、name、port常规配置外。比较常用的调优就俩方面,线程池相关的threadpoool、threads、iothreads、dispatcher以及协议序列化方式serialization。其余的配置个人理解基本不会太常规使用,可能我见识少,有这方面经验的朋友可以交流下
三:注册中心 dubbo:registry
Dubbo支持向多种以及多个注册中心发布服务,注册中心的配置就是用标签<dubbo:registry>进行配置
3.1 重要基础配置
属性 | 作用 | 默认值 | 描述 |
---|---|---|---|
id | 指定id,供service、reference使用 | 默认service、reference向所有注册中心发布服务 | <dubbo:servicer>与<dubbo:reference>中都有registry配置属性,分别代表服务发布注册中心与指定消费注册中心地址。其中属性值默认为所有<dubbo:registry>配置注册中心,如果指定则可以在属性值中填入<dubbo:registry>配置项id属性值,以", "隔开 |
address | 注册中心地址 | 如果一个配置项代表多个注册中心,需要使用","进行隔开,注册中心协议类型可以在属性中配置,当然也可以通过protocol属性配置 | |
protocol | 注册中心通信协议 | dubbo | zookeeper注册中心的zookeeper、Redis的redis等等 |
port | 注册中心缺省端口 | 9090 | 当配置address没有携带注册中心端口时使用本端口 |
username | 注册中心用户名 | 如果注册中心不需要验证则可以不写 | |
password | 注册中心密码 | 注册中心不需要验证不写 | |
file | 注册中心地址以及服务提供者列表缓存文件,当服务重启时将根据此文件重启。不同注册中心不能使用同一文件 | ||
check | 注册中心存在检查 | true | 当注册中心不存在时是否进行报错 |
register | 是否注册 | true | 设置为false将只订阅不注册 |
subscrible | 是否订阅 | true | 设置为false将只注册不订阅 |
group | 注册中心分组 | 向同一注册中心可以分组注册,不同分组之间的服务不能相互调用也不会相互影响 |
- 最核心的配置为address,其中的注册中心协议protocol可以设置,注册中心端口port可以设置
- id属性供给service与reference消费
- group可以对注册中心分组
- 注册中心验证采用username与password两个属性配置
- 当然如果想要限定只注册不订阅通过subscrible,只订阅不注册可以同属register