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,日志輸出: