服务消费者通过Mock指定服务超时后的策略:

1、配置文件:

server:
  port: 8001
dubbo:
  application:
    name: site-service-boot-provider
  registry:
    address: zookeeper://ubu:2181
  scan:
    base-packages: com.yas.serviceprovider
  #指定某一种协议
  protocol:
    name: dubbo
    port: 20882

 

2、提供方代码:

 1 package com.yas.serviceprovider.timeout;
 2 
 3 import com.yas.api.SiteService;
 4 import org.apache.dubbo.config.annotation.Service;
 5 //1.如果服务端设置了timeout,而客户端没有设置,表示客户端采用服务端一样的timeout
 6 //2.如果服务端的实际执行时间比设置的timeout要长,那么会打印超时日志,但服务会正常执行
 7 @Service(version = "timeout",timeout = 4000)
 8 public class TimeoutSiteServiceImpl implements SiteService {
 9     @Override
10     public String getName(String name) {
11         try {
12             Thread.sleep(5000);
13         } catch (InterruptedException e) {
14             e.printStackTrace();
15         }
16         return "timeout:"+name;
17     }
18 }

 

3、消费方代码:

 1 package com.yas.serviceconsumer.controller;
 2 
 3 import com.yas.api.SiteService;
 4 import org.apache.dubbo.config.annotation.Reference;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 import org.springframework.web.bind.annotation.RequestParam;
 7 import org.springframework.web.bind.annotation.RestController;
 8 
 9 @RestController
10 public class TimeoutController {
11     //客户端未设置timeout,服务端也未设置timeout,则默认为1000毫秒超时
12     //客户端未设置timeout,服务端设置了timeout,则客户端以服务端设置为准
13     //如果客户端timeout的时间到了,服务端还没有返回数据,则抛出异常
14     //如果客户端timeout到之前,已经从服务端获取了响应,则正常执行
15 
16 
17     //force策略:表示消费方不进行RPC请求,直接返回
18     //@Reference(version = "timeout",timeout = 2000,mock="force:return timeout")
19 
20     //fail策略:表示消费方发送RPC请求失败(超时)后,不抛出异常,而是返回指定值。
21     @Reference(version = "timeout",timeout = 2000,mock="fail:return timeout")
22     SiteService siteService;
23 
24     @RequestMapping("/timeout")
25     public String getName(@RequestParam("name") String name){
26         return siteService.getName(name);
27     }
28 }

 

4、测试:

使用postman请求地址:http://localhost:8000/timeout?name=zhangsan

经过大约5秒时间之后,正常获得响应:

 

 消费方没有报异常。

 

如果将消费方代码修改为:

@Reference(version = "timeout",timeout = 2000,mock="force:return timeout")

则postman会直接获得消费方的返回数据(rpc调用没有发起)。

posted on 2021-11-04 12:10  Sempron2800+  阅读(68)  评论(0编辑  收藏  举报