1. dubbo:protocol
Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
<dubbo:protocol name=“dubbo” port=“9090” server=“netty” client=“netty” codec=“dubbo”
serialization=“hessian2” charset=“UTF-8” threadpool=“fixed” threads=“100” queues=“0” iothreads=“9” buffer=“8192” accepts=“1000” payload=“8388608” />
1.1 payload:默认,provider 和 consumer 传递消息的大小不超过 8M,检查 payload 的调用栈如下:
1.2 线程池相关
threadpool:可选(fixed/cached)
threads:实质是 corePoolSize 和 maximumPoolSize
queues:线程池队列大小
1.3
2. dubbo:reference
2.1 与人联调时,采用直连方式连接对方主机,会很方便。
url:dubbo provider 地址
<dubbo:reference id="hello" interface="com.zhang.HelloService" proxy="jdk" group="a" merger="true" check="true" retries="0" url="dubbo://127.0.0.1:20880"/>
比较下直连和 zk 作为注册中心的区别,
直连:
连接 zk 注册中心:
2.2 负载均衡
loadbanlance:random(默认),roundrobin,consistenthash,leastactive
2.3 失败方案
cluster:常用的有 failover,failfast。failover 失败重试,failfast 只发起一次调用,失败就报错。
mock 是 cluster 的 wrapper:
2.4 check 属性
正常情况下,一个进程既是 consumer,又是 provider,也许它启动时,对应的 provider 还没有,通过设置 check="false",该进程可以正常启动,但是不能调用远程服务。
只有在调用 appCtx.getBean 时,才会触发 consumer 的 reference,如果在<dubbo:reference>标签中设置 check="false",即使没有 provider,consumer 也能 ref 成功,appCtx.getBean 正常返回。而如果设置 check="true",则会抛出异常。
那么,check 所起的作用到底是啥?判断网络是否连接,以及是否可写。
// boolean com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker.isAvailable() public boolean isAvailable() { if (!super.isAvailable()) return false; for (ExchangeClient client : clients){ if (client.isConnected() && !client.hasAttribute(Constants.CHANNEL_ATTRIBUTE_READONLY_KEY)){ //cannot write == not Available ? return true ; } } return false; }