在[url]微服务学习(3)-基于Dubbo+Zookeeper+Spring的系统搭建[/b] 中介绍了一个简单的服务提供者和服务消费者,并且只有一个服务注册中心和一个服务接口。所有相关参考也只是使用了默认的。本章节我们进一步共同深入学习一下dubbo更多的配置,包括多注册中心、多接口实现、复制均衡等参数的配置。
[b]1)多注册中心配置,假如有一个主注册138和一个备用注册中心139[/b]
[b]2)一个接口有多种实现,可以用group区分[/b]
生产者配置
消费者
4)dubbo调用服务的负载均衡,最后一种比较适合短时间内大量参数一样的请求
Random LoadBalance
随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
RoundRobin LoadBalance
轮循,按公约后的权重设置轮循比率。
存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
ConsistentHash LoadBalance
一致性Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
算法参见:http://en.wikipedia.org/wiki/Consistent_hashing。
缺省只对第一个参数Hash,如果要修改,请配置
缺省用160份虚拟节点,如果要修改,请配置
配置如:
或:
5)事件处理线程说明
如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度。
但如果事件处理逻辑较慢,或者需要发起新的IO请求,比如需要查询数据库,则必须派发到线程池,否则IO线程阻塞,将导致不能接收其它请求。
如果用IO线程处理事件,又在事件处理过程中发起新的IO请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。
Dispatcher
all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。
direct 所有消息都不派发到线程池,全部在IO线程上直接执行。
message 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在IO线程上执行。
execution 只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在IO线程上执行。
connection 在IO线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。
ThreadPool
fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
cached 缓存线程池,空闲一分钟自动删除,需要时重建。
limited 可伸缩线程池,但池中的线程数只会增长不会收缩。(为避免收缩时突然来了大流量引起的性能问题)。
配置如:
6)dubbo常用配置:
[b]服务提供者参数:[/b]
dubbo:service> version version string 可选 0.0.0 服务发现 服务版本,建议使用两位数字版本,如:1.0,通常在接口不兼容时版本号才需要升级
group group string 可选 服务发现 服务分组,当一个接口有多个实现,可以用分组区分
//主要因为dubbo服务在spring2.X初始化所有类之前被暴露出去,导致被请求锁死了singletonObjects、beanDefinitionMap
delay delay int 可选 0 性能调优 延迟注册服务时间(毫秒) ,设为-1时,表示延迟到Spring容器初始化完成时暴露服务
timeout timeout int 可选 1000 性能调优 远程服务调用超时时间(毫秒)
retries retries int 可选 2 性能调优 远程服务调用重试次数,不包括第一次调用,不需要重试请设为0
//这里应该还有个一致性Hash的方式,文档介绍有,但是配置文档没有。
loadbalance loadbalance string 可选 random 性能调优 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用
token token string/boolean 可选 false 服务治理 令牌验证,为空表示不开启,如果为true,表示随机生成动态令牌,否则使用静态令牌,令牌的作用是防止消费者绕过注册中心直接访问,保证注册中心的授权功能有效,如果使用点对点调用,需关闭令牌功能
registry string 可选 缺省向所有registry注册 配置关联 向指定注册中心注册,在多个注册中心时使用,值为的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A
provider string 可选 缺使用第一个provider配置 配置关联 指定provider,值为的id属性
dynamic dynamic boolean 可选 true 服务治理 服务是否动态注册,如果设为false,注册后将显示后disable状态,需人工启用,并且服务提供者停止时,也不会自动取消册,需人工禁用。
cluster cluster string 可选 failover 性能调优 集群方式,可选:failover/failfast/failsafe/failback/forking
register register boolean 可选 true 服务治理 该协议的服务是否注册到注册中心
owner owner string 可选 服务治理 服务负责人,用于服务治理,请填写负责人公司邮箱前缀
[b]消费者参数:[/b]
version version string 可选 服务发现 服务版本,与服务提供者的版本一致
group group string 可选 服务发现 服务分组,当一个接口有多个实现,可以用分组区分,必需和服务提供方一致
timeout timeout long 可选 缺省使用的timeout 性能调优 服务方法调用超时时间(毫秒)
retries retries int 可选 缺省使用的retries 性能调优 远程服务调用重试次数,不包括第一次调用,不需要重试请设为0
loadbalance loadbalance string 可选 缺省使用的loadbalance 性能调优 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用
check check boolean 可选 缺省使用的check 服务治理 启动时检查提供者是否存在,true报错,false忽略
url string 可选 服务治理 点对点直连服务提供者地址,将绕过注册中心
cache cache string/boolean 可选 服务治理 以调用参数为key,缓存返回结果,可选:lru, threadlocal, jcache等
validation validation boolean 可选 服务治理 是否启用JSR303标准注解验证,如果启用,将对方法参数上的注解进行校验
registry string 可选 缺省将从所有注册中心获服务列表后合并结果 配置关联 从指定注册中心注册获取服务列表,在多个注册中心时使用,值为的id属性,多个注册中心ID用逗号分隔
owner owner string 可选 服务治理 调用服务负责人,用于服务治理,请填写负责人公司邮箱前缀
[b]协议配置[/b]
id string 可选 dubbo 配置关联 协议BeanId,可以在中引用此ID,如果ID不填,缺省和name属性值一样,重复则在name后加序号
name string 必填 dubbo 性能调优 协议名称
port int 可选 dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80
如果配置为-1 或者 没有配置port,则会分配一个没有被占用的端口。Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控。 服务发现 服务端口
threadpool threadpool string 可选 fixed 性能调优 线程池类型,可选:fixed/cached
heartbeat heartbeat int 可选 0 性能调优 心跳间隔,对于长连接,当物理层断开时,比如拔网线,TCP的FIN消息来不及发送,对方收不到断开事件,此时需要心跳来帮助检查连接是否已断开
register register boolean 可选 true 服务治理 该协议的服务是否注册到注册中心
[b]注册器[/b]
id string 可选 配置关联 注册中心引用BeanId,可以在或中引用此ID
address string 必填 服务发现 注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port,不同集群的注册中心,请配置多个标签
protocol string 可选 dubbo 服务发现 注同中心地址协议,支持dubbo, http, local三种协议,分别表示,dubbo地址,http地址,本地注册中心
port int 可选 9090 服务发现 注册中心缺省端口,当address没有带端口时使用此端口做为缺省值
username string 可选 服务治理 登录注册中心用户名,如果注册中心不需要验证可不填
password string 可选 服务治理 登录注册中心密码,如果注册中心不需要验证可不填
timeout registry.timeout int 可选 5000 性能调优 注册中心请求超时时间(毫秒)
check check boolean 可选 true 服务治理 注册中心不存在时,是否报错
register register boolean 可选 true 服务治理 是否向此注册中心注册服务,如果设为false,将只订阅,不注册
subscribe subscribe boolean 可选 true 服务治理 是否向此注册中心订阅服务,如果设为false,将只注册,不订阅
[b]7)dubbo的令牌验证[/b]
dubbo通过token令牌防止用户绕过注册中心直连,然后在注册中心管理授权,dubbo提供了黑白名单,控制服务所允许的调用方。
参考资料:
[url]http://blog.csdn.net/abcde474524573/article/details/53026110[/url]
[url]http://blog.csdn.net/candyzh/article/details/52404196[/url]
[url]http://blog.csdn.net/lazytojava/article/details/53488111[/url]