在 Apache Dubbo 中,当使用 @DubboReference
引用远程服务时,如果远程服务不可用(比如宕机、网络不通、服务未注册等),Dubbo 会根据你的配置采取不同的行为。
如果你没有做任何特殊配置,当远程服务不可用时:
RpcException
。@DubboReference(version = "1.0.0")
private HelloService helloService;
// 如果服务不可用,调用下面这行会抛出 RpcException
String result = helloService.sayHello("world");
为了增强系统的健壮性,建议你在服务不可用时返回一个“兜底数据”或“Mock 响应”。Dubbo 提供了两种主要机制:
mock
属性(推荐)@DubboReference(version = "1.0.0", mock = "force:return \"fallback data\"")
private HelloService helloService;
force:
表示强制返回该值,不管服务是否可用。@DubboReference(version = "1.0.0", mock = "com.example.HelloServiceMock")
private HelloService helloService;
你需要实现对应的接口类:
public class HelloServiceMock implements HelloService {
@Override
public String sayHello(String name) {
return "Mocked response when remote service is down";
}
}
注意:该类必须存在于客户端,并且与接口同名。
cluster="failover"
或其他集群策略(可选)你还可以通过设置负载均衡策略来控制调用失败后的重试逻辑:
@DubboReference(version = "1.0.0", cluster = "failover", retries = 2)
private HelloService helloService;
failover
:失败自动切换,重试其他节点(适合幂等操作)。failsafe
:失败安全,忽略异常,适合日志类服务。failfast
:快速失败,只调用一次。场景 | 推荐配置 |
---|---|
远程服务可能挂掉,需要容错 |
|
对性能要求高,允许失败 |
|
对可靠性要求高,允许重试 |
|
不想依赖远程服务做测试 |
|
mock = "force:..."
会完全跳过远程调用。mock = "return null"
或自定义类判断异常。application.yml
或 XML 配置中。dubbo:
consumer:
check: false
mock: force:return "service is down"
cluster: failover
retries: 2
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。