Dubbo高可用之重試機制


Dubbo 服務在嘗試調用一次之后,如出現非業務異常(服務突然不可用、超時等),Dubbo 默認會進行額外的最多2次重試。

重試次數支持兩種自定義配置:1、通過注解/xml進行固定配置;2、通過上下文進行運行時動態配置。

1、通過注解/xml進行固定配置

<dubbo:consumer retries="2"></dubbo:consumer>

2、通過RpcContext進行運行時動態配置,優先級高於注解/xml進行的固定配置(兩者都配置的情況下,以RpcContext配置為准)

// dubbo服務調用前,通過RpcContext動態設置本次調用的重試次數
RpcContext rpcContext = RpcContext.getContext();
rpcContext.setAttachment("retries", 5);

3、代碼示例

1)dubbo-samples-xml-provider

dubbo-provider.xml

<!--為服務的所有方法設置超時時間-->
<!-- <dubbo:service interface="com.harvey.samples.client.OrderService" ref="orderServiceImpl"
                   protocol="dubbo" group="one" timeout="5000"/>-->

<!--具體為某個方法設置超時時間-->
<dubbo:service interface="com.harvey.samples.client.OrderService" ref="orderServiceImpl"
               protocol="dubbo" group="one">
    <dubbo:method name="getOrderInfo" timeout="5000"/>
</dubbo:service>

OrderServiceImpl.java

private AtomicLong atomicLong = new AtomicLong();
@Override
public Order getOrderInfo(long orderId) throws InterruptedException {
    System.out.println("調用第" + atomicLong.incrementAndGet() + "次");
    RpcContext rpcContext = RpcContext.getContext();
    System.out.println("當前調用的服務端口:" + rpcContext.getLocalPort() + ", 獲取訂單:" + orderId);
    //休眠,主要是讓服務提供者的超時時間生效,超時觸發了消費者的重試機制
    TimeUnit.SECONDS.sleep(6);
    return orderMap.get(orderId);
}

2)dubbo-consumer.xml

<dubbo:reference id="orderService" interface="com.harvey.samples.client.OrderService" 
                 protocol="dubbo" group="one" retries="2"/>

ConsumerStarter.java

public class ConsumerStarter {

    public static void main(String[] args) throws IOException, InterruptedException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"spring/dubbo-consumer.xml"});
        context.start();
        System.out.println("consumer start.....");
        //dubbo
        OrderService orderService1 = context.getBean("orderService", OrderService.class);
        System.out.println("接口:getOrderInfo");
        System.out.println("SUCCESS: got getOrderInfo " + orderService1.getOrderInfo(10L));
    }
}

3)先啟動服務提供者ProviderStarter,在啟動消費者ConsumerStarter,日志輸出:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM