Dubbo的服务延迟暴露
如果我们的服务启动过程中需要预热事件(再启动一段时间后性能才能到达最佳状态)比如初始化缓存,等待相关资源就位等,可以使用deplay进行延迟暴露
-
如上所示:我们只需要在服务的提供方的<dubbo:service />标签中添加delay属性,单位毫秒
-
若值为正数,则表示延迟暴露多少毫秒,在指定时间后再发布服务,
-
若值为-1,则表示在spring初始化完成后暴露服务
Dubbo的多注册中心
很多时候一个项目会有多个注册中心
同一个服务注册到多个注册中心_[一对多]
同一个服务可以注册到多个不同地域的注册中心,为多个不同地域的服务提供服务
修改服务提供者的配置文件,多个注册中心之间使用逗号分割,如下:
当然第二个集群是假的,知道牛啃南瓜怎么下嘴就行?当然你也可以使用ZK单机模式演示
不同的服务注册到不同的注册中心_[一对一]
一个项目中,不同的服务可以注册不同的注册中心:如下
同一个服务引用自不同的注册中心_[多对一]
同一个消费者需要调用两个注册中心的服务,而被调用的服务的接口名,版本号,分组等是相同的,不同中心的这个相同名称的服务CURD的是不同的数据库,即服务名相同,但是实现是不同的,修改服务消费者如下:
Dubbo的多协议支持
服务暴露协议
在我们前面的Demo中,服务提供者和服务的消费者是通过zookeepeer连接协议连接上Zookeeper注册中心的
为什么服务的提供者和消费者连接上Zookeeper,消费者就可以消费服务了呢?
-
zookeeper协议:是提供者/消费者连接注册中心的连接协议,并不是提供者和消费者之间的连接协议
-
当消费者连接上注册中心后,在消费服务之前,首先需要连接上这个服务的提供者,虽然服务的消费者可以通过注册中心获取到服务提供者,但提供者对于消费者来说确实透明的,消费者并不知道真正的服务提供者是谁,不过无论服务的提供者是谁,消费者都需要连接上服务的提供者才可以获取到真正的服务,而这个连接也是需要专门的链接协议的,这个协议被称为服务的暴露协议
-
在我们之前的Demo中并没有看到服务暴露协议的相关配置,项目也是可以运行,因为Dubbo采用了默认的暴露协议,Dubbo服务暴露协议
-
Dubbo服务暴露协议,适用于小数据量大并发的服务调用,以及服务消费者主机数远远大于服务提供者主机的情况,服务提供少,需求多,单个主机应对高并发。
-
了解内容:除了Dubbo服务暴露协议,Dubbo框架还支持另外七种服务暴露协议,Hessian协议,Http协议,RMI协议,WebService协议,THrift协议,Memcached协议,Redis协议,在实际中使用最多的就是Dubbo服务暴露协议
服务暴露协议用法
下面我们以Dubbo服务暴露协议作为列子来说明服务暴露协议的用法
-
在服务的提供者的Spring配置文件中注册服务暴露协议,
-
然后在暴露服务时具体指定所使用的已经被注册的暴露协议
二、同一服务支持多种协议(修改服务提供者的配置文件)
三、不同服务使用不同的协议(修改服务提供者的配置文件)
牛啃南瓜知道怎么啃就行,这里我就没做过多的演示
Dubbo的高级设置以及使用建议
在Provider上尽量多的配置Consumer端的属性
使得Provider实现着一开始就考虑到Provider的服务特点、服务质量等问题,因为作为服务的提供者比服务的消费者更加清楚服务的性能参数,如调用的超时时间,合理的重试次数等,在Provider配置后,Consumer不配置则会默认使用Provider端的配置值,如果Consumer没有配置,Provider也没有配置,就会使用Consumer端的全局设置,这对于Provider而言是不可控的,也是不合理的
粒度到可以针对某一个服务也可以针对服务的同时针对某一个方法(hello方法)
-
timeout:远程服务调用超时的时限
-
retries:失败重试次数,默认为2
-
loadbalance:负载均衡算法,默认是随机random,还可以选择轮询(roundrobin)、最不活跃优先(leastactive)等
-
actives:消费者最大并发调用限制,达到上限后,新的调用会被阻塞直到超时,0表示不限制
Provider端配置合理的Provider端属性
threads:用于指定服务的线程池大小
executes:一个服务并行执行的请求上限,超过上限,新请求肯定被阻塞,可能阻塞到超时,该属性在<dubbo:method/>则是针对指定的方法,配置在<dubbo:service />上则是针对整个服务
常用性能调优参数(来自网络)
参数名 | 作用范围 | 默认值 | 说明 | 备注 |
threads | provider | 200 | 业务处理线程池大小 | |
iothreads | provider | CPU+1 | io线程池大小 | |
queues | provider | 0 | 线程池队列大小,当线程池满时,排队等待执行的队列大小, 建议不要设置,当线程程池时应立即失败, 重试其它服务提供机器,而不是排队,除非有特殊需求 | |
connections | consumer | 0 | 对每个提供者的最大连接数, rmi、http、hessian等短连接协议表示限制连接数, Dubbo等长连接协表示建立的长连接个数 | Dubbo协议默认共享一个长连接 |
actives | consumer | 0 | 每服务消费者每服务每方法最大并发调用数 | 0表示不限制 |
acceptes | provider | 0 | 服务提供方最大可接受连接数 | 0表示不限制 |
executes | provider | 0 | 服务提供者每服务每方法最大可并行执行请求数 | 0表示不限制 |