https://blog.csdn.net/moonpure/article/details/52842115
线程模型
事件处理线程说明
|
- Dispatcher
- all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。
- direct 所有消息都不派发到线程池,全部在IO线程上直接执行。
- message 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在IO线程上执行。
- execution 只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在IO线程上执行。
- connection 在IO线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。
- ThreadPool
- fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
- cached 缓存线程池,空闲一分钟自动删除,需要时重建。
- limited 可伸缩线程池,但池中的线程数只会增长不会收缩。(为避免收缩时突然来了大流量引起的性能问题)。
配置如:
< dubbo:protocol name = "dubbo" dispatcher = "all" threadpool = "fixed" threads = "100" /> |
配置标签
<dubbo:provider/>
<dubbo:protocol/>
例:
<!-- 当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值 -->
<dubbo:provider timeout="10000" threadpool="fixed" threads="100" accepts="1000" />
<dubbo:protocol/>
服务提供者协议配置:
配置类:com.alibaba.dubbo.config.ProtocolConfig
说明:如果需要支持多协议,可以声明多个<dubbo:protocol>标签,并在<dubbo:service>中通过protocol属性指定使用的协议。
标签 | 属性 | 对应URL参数 | 类型 | 是否必填 | 缺省值 | 作用 | 描述 | 兼容性 |
---|---|---|---|---|---|---|---|---|
<dubbo:protocol> | id | string | 可选 | dubbo | 配置关联 | 协议BeanId,可以在<dubbo:service protocol="">中引用此ID,如果ID不填,缺省和name属性值一样,重复则在name后加序号。 | 2.0.5以上版本 | |
<dubbo:protocol> | name | <protocol> | string | 必填 | dubbo | 性能调优 | 协议名称 | 2.0.5以上版本 |
<dubbo:protocol> | port | <port> | int | 可选 | dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80 如果配置为-1 或者 没有配置port,则会分配一个没有被占用的端口。Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控。 |
服务发现 | 服务端口 | 2.0.5以上版本 |
<dubbo:protocol> | host | <host> | string | 可选 | 自动查找本机IP | 服务发现 | -服务主机名,多网卡选择或指定VIP及域名时使用,为空则自动查找本机IP,-建议不要配置,让Dubbo自动获取本机IP | 2.0.5以上版本 |
<dubbo:protocol> | threadpool | threadpool | string | 可选 | fixed | 性能调优 | 线程池类型,可选:fixed/cached | 2.0.5以上版本 |
<dubbo:protocol> | threads | threads | int | 可选 | 100 | 性能调优 | 服务线程池大小(固定大小) | 2.0.5以上版本 |
<dubbo:protocol> | iothreads | threads | int | 可选 | cpu个数+1 | 性能调优 | io线程池大小(固定大小) | 2.0.5以上版本 |
<dubbo:protocol> | accepts | accepts | int | 可选 | 0 | 性能调优 | 服务提供方最大可接受连接数 | 2.0.5以上版本 |
<dubbo:protocol> | payload | payload | int | 可选 | 88388608(=8M) | 性能调优 | 请求及响应数据包大小限制,单位:字节 | 2.0.5以上版本 |
<dubbo:protocol> | codec | codec | string | 可选 | dubbo | 性能调优 | 协议编码方式 | 2.0.5以上版本 |
<dubbo:protocol> | serialization | serialization | string | 可选 | dubbo协议缺省为hessian2,rmi协议缺省为java,http协议缺省为json | 性能调优 | 协议序列化方式,当协议支持多种序列化方式时使用,比如:dubbo协议的dubbo,hessian2,java,compactedjava,以及http协议的json等 | 2.0.5以上版本 |
<dubbo:protocol> | accesslog | accesslog | string/boolean | 可选 | 服务治理 | 设为true,将向logger中输出访问日志,也可填写访问日志文件路径,直接把访问日志输出到指定文件 | 2.0.5以上版本 | |
<dubbo:protocol> | path | <path> | string | 可选 | 服务发现 | 提供者上下文路径,为服务path的前缀 | 2.0.5以上版本 | |
<dubbo:protocol> | transporter | transporter | string | 可选 | dubbo协议缺省为netty | 性能调优 | 协议的服务端和客户端实现类型,比如:dubbo协议的mina,netty等,可以分拆为server和client配置 | 2.0.5以上版本 |
<dubbo:protocol> | server | server | string | 可选 | dubbo协议缺省为netty,http协议缺省为servlet | 性能调优 | 协议的服务器端实现类型,比如:dubbo协议的mina,netty等,http协议的jetty,servlet等 | 2.0.5以上版本 |
<dubbo:protocol> | client | client | string | 可选 | dubbo协议缺省为netty | 性能调优 | 协议的客户端实现类型,比如:dubbo协议的mina,netty等 | 2.0.5以上版本 |
<dubbo:protocol> | dispatcher | dispatcher | string | 可选 | dubbo协议缺省为all | 性能调优 | 协议的消息派发方式,用于指定线程模型,比如:dubbo协议的all, direct, message, execution, connection等 | 2.1.0以上版本 |
<dubbo:protocol> | queues | queues | int | 可选 | 0 | 性能调优 | 线程池队列大小,当线程池满时,排队等待执行的队列大小,建议不要设置,当线程程池时应立即失败,重试其它服务提供机器,而不是排队,除非有特殊需求。 | 2.0.5以上版本 |
<dubbo:protocol> | charset | charset | string | 可选 | UTF-8 | 性能调优 | 序列化编码 | 2.0.5以上版本 |
<dubbo:protocol> | buffer | buffer | int | 可选 | 8192 | 性能调优 | 网络读写缓冲区大小 | 2.0.5以上版本 |
<dubbo:protocol> | heartbeat | heartbeat | int | 可选 | 0 | 性能调优 | 心跳间隔,对于长连接,当物理层断开时,比如拔网线,TCP的FIN消息来不及发送,对方收不到断开事件,此时需要心跳来帮助检查连接是否已断开 | 2.0.10以上版本 |
<dubbo:protocol> | telnet | telnet | string | 可选 | 服务治理 | 所支持的telnet命令,多个命令用逗号分隔 | 2.0.5以上版本 | |
<dubbo:protocol> | register | register | boolean | 可选 | true | 服务治理 | 该协议的服务是否注册到注册中心 | 2.0.8以上版本 |
<dubbo:protocol> | contextpath | contextpath | String | 可选 | 缺省为空串 | 服务治理 | 2.0.6以上版本 |
Linux 用户线程数限制导致的 Java.lang.OutOfMemoryError: unable to create new native thread异常
系统默认最大的线程数为1024个
[root@edu-provider-01 ~]# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 1024
root soft nproc unlimited
[root@edu-provider-01 ~]# vi /etc/security/limits.d/90-nproc.conf
调整时要注意:
1、 尽量不要使用 root 用户来部署应用程序,避免资源耗尽后无法登录操作系统。
因为root用户默认没有限制线程数,如果线程过多,会使资源占用很多,导致不能关机,只能硬关机
2、 普通用户的线程数限制值要看可用物理内存容量来配置
[root@edu-provider-01 ~]# cat /proc/meminfo |grep MemTotal
MemTotal: 2941144 kB
[root@edu-provider-01 ~]# echo "2941144/128"|bc
22977
[root@edu-provider-01 ~]# ulimit -u
1024
[1]+ Stopped vi /etc/security/limits.d/90-nproc.conf
[root@edu-provider-01 ~]# vi /etc/security/limits.d/90-nproc.conf
[root@edu-provider-01 ~]# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 12000
root soft nproc unlimited
[root@edu-provider-01 ~]#
计算方式:
default_nproc = total_memory/128K;
$ cat /proc/meminfo |grep MemTotal
$ echo "2941144/128"|bc
$ ulimit -u
ulimit -a # 显示目前资源限制的设定
ulimit -u # 用户最多可开启的程序数目
重启,使之生效:# reboot
只订阅
问题 为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。 |
解决方案 可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。 |
禁用注册配置:
< dubbo:registry address = "10.20.153.10:9090" register = "false" /> |
或者:
< dubbo:registry address = "10.20.153.10:9090?register=false" /> |
只订阅配置测试
在注册中心查看只订阅的服务是否注册上?
注意点:
1、“只订阅”指的是需要做开发调试的服务提供者,只向注册中心订阅其所依赖的服务,但
不向注册中心注册其本身可以提供的服务。
2、“只订阅”需要结合“直连提供者”配置来进行调用测试。(正在开发的本地服务只订阅,本地消费端
直连正在开发的本地服务进行调试)
只注册
问题 如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务,所以需要将服务同时注册到两个注册中心,但却不能让此服务同时依赖两个注册中心的其它服务。 |
解决方案 可以让服务提供者方,只注册服务到另一注册中心,而不从另一注册中心订阅服务。 |
禁用订阅配置:
< dubbo:registry id = "hzRegistry" address = "10.20.153.10:9090" /> < dubbo:registry id = "qdRegistry" address = "10.20.141.150:9090" subscribe = "false" /> |
或者:
< dubbo:registry id = "hzRegistry" address = "10.20.153.10:9090" /> < dubbo:registry id = "qdRegistry" address = "10.20.141.150:9090?subscribe=false" /> |