Dubbo_特性2

来源:互联网 发布:淘宝我的购物车打不开 编辑:程序博客网 时间:2024/06/10 10:25

一、启动服务检查

1、dubbo:renference 的属性check默认为true,即默认会检查服务的依赖服务是否启动,当在服务之前是循环依赖的时候,则需要设置为false;

2、dubbo:consumer 的check=false,则检查没有服务提供者则会报错

3、dubbo:register的check=false,则注册订阅失败则会报错


二、多协议支持

dubbo支持的协议有:dubbo、rmi、hessian、webservice、http、thrift

由于项目在改造的时候可能需要支持多个系统的协议,或者多种语言组成的项目,则需要服务本身支持所协议,

则只需要在服务中定义多个    <dubbo:protocal name="dubbo"  port="20880" server="jetty" />   <dubbo:protocal name="hessain"  port="20881" server="jetty" />

并在在服务<dubbo:service interface="com.gupao.vip.mic.dubbo.order.IOrderServices" ref="orderService"  /> 中添加 protocal="hessain" 指明支持的协议,

支持多个协议,中间使用逗号隔开即可。

当查看源码时候,发现只是使用多个协议,在循环中初始化暴露多个地址,当然可以在zookeeper的注册中心节点下清晰的看见。


三、多注册中心支持

比如有需求,不同的服务注册到不同的注册中心,可能完全隔离,只需要在<dubbo:registry protocal="zookeeper" address="192.168.1.1:2181,192.168.1.2:2181"/>

多个该配置中添加id属性进行区分即可。在dubbo:service 中显示指定 regiatry=“注册中心的ID”即可。


四、多版本支持

该功能可能在项目中会经常使用,比如,由于业务调整后接口逻辑等变化,在需要支持不同的版本调用不同版本的接口,则不需要要在同一个接口中

去完全兼容所以的版本,做很多的判断,后期会很难维护。

则需要在

<dubbo:service interface="com.gupao.vip.mic.dubbo.order.IOrderServices" ref="orderService"  version=“3.8.7” />   

<dubbo:service interface="com.gupao.vip.mic.dubbo.order.IOrderServices" ref="orderService2"  version=“4.0.0”  /> 中进行区别,

并且在调用端的接口调用中使用version属性进行说明即可。

同样在zookeeper注册中心中,可以看见他会为每一个版本生成一个url。


五、异步调用

这个也是经常会使用的场景(只有dubbo协议支持异步调用,并且是使用jdk的future实现),需要将客户端(客户端实现)的dubbo:renference 中添加async=“true”, 或在其中加入方法的子标签

<!--生成一个远程服务的调用代理-->    <dubbo:reference id="orderServices" interface="com.kevin.dubbo.order.IOrderServices">    <dubbo:method name="doOrder" async="true" />    </dubbo:reference>

@AutowiredIOrderServices orderServices;public void doTest(String str) {orderServices.doOrder(str);Future<Object> future = RpcContext.getContext().getFuture();System.out.println("阻塞中");Object obj = future.get(); //处于阻塞状态(obj可强转为对象)System.out.println(obj); }
如图:



六、主机绑定

首先会从服务提供者的<dubbo:protocol name="dubbo" port="20880" host="192.168.1.1" />  (只能绑定一个地址)中去拿,否则再从注册中心等去获取。

判断逻辑大致如下:

1、通过配置文件进行获取

2、通过sockket到到注册中心去拿

3、使用网络接口进行获取

if (NetUtils.isInvalidLocalHost(host)) {    anyhost = true;    try {        host = InetAddress.getLocalHost().getHostAddress();    } catch (UnknownHostException e) {        logger.warn(e.getMessage(), e);    }if (NetUtils.isInvalidLocalHost(host)) {    if (registryURLs != null && registryURLs.size() > 0) {        for (URL registryURL : registryURLs) {            try {                Socket socket = new Socket();                try {                    SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());                    socket.connect(addr, 1000);                    host = socket.getLocalAddress().getHostAddress();                    break;                } finally {                    try {                        socket.close();                    } catch (Throwable e) {}                }            } catch (Exception e) {                logger.warn(e.getMessage(), e);            }        }    }    if (NetUtils.isInvalidLocalHost(host)) {        host = NetUtils.getLocalHost();    }}


七、dubbo服务只订阅

服务本身很多时候即使调用方,也是服务提供方

场景:由于我们很多时候需要服务本身只是连接到服务中心,并能调用其他的服务,调试自己的服务等。就需要服务本身为只订阅。

实现:<dubbo:registry protocal="zookeeper" address="192.168.1.1:2181,192.168.1.2:2181" register="false" />


八、dubbo服务只注册

实现: <dubbo:registry protocal="zookeeper" address="192.168.1.1:2181,192.168.1.2:2181"  subscribe="false" />


九、负载均衡

常见的负载均衡都有:

1、random :按照默认设置的权重比例后的随机,默认为随机。

2、roundrobin:按照默认设置的权重比再进行轮询

3、leastactive:最少活跃次数

4、consistenthash:一致性哈希,相通的访问ip会落到同一节点上 

使用 :    <dubbo:service interface="..." loadbalance="roundrobin" />

十、链接超时

<dubbo:service interface="com.kevin.dubbo.order.IOrderServices" ref="orderService"  tineout=“2000” />

十一、集群容错

failover cluster:根据负载均衡机制,失败后重试其他服务,通过retries=“2” 设置重试次数,表示总次数为3次(默认已设置)

failfaster cluster:只发起一次操作,快速失败,(比如新增一条用户信息,非幂等请求)

failsafe cluster:失败安全,出现失败时直接忽略异常,常用场景为,日志记录

failback cluster:失败自动恢复,后台记录失败请求,定时重发

forking cluster:并行调用多个服务,只要有一个返回成功,则成功,用于只读情况。

使用:<dubbo:reference id="orderService" interface="com.kevin.dubbo.order.IOrderServices" cluster="failfaster" />


十二、配置的优先级

总体:客户端优于服务端

如下:




原创粉丝点击