服务消费者通过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调用没有发起)。