Spring|Spring Cloud Alibaba(二)(注解实现 Dubbo 服务调用失败时的本地伪装)

【Spring|Spring Cloud Alibaba(二)(注解实现 Dubbo 服务调用失败时的本地伪装)】本文为 Spring Cloud Alibaba 系列 的第二篇文章,系列文章持续更新,点此 查看更多
前言 在上一篇博文中,笔者使用 Nacos + Dubbo 实现了远程服务调用,文章请见 《Spring Cloud Alibaba——使用 Nacos + Dubbo 实现的远程服务调用》
实际上,由于网络或是其他各种原因,服务提供方可能无法被消费方访问,此时消费方便会抛出如下异常信息:

org.apache.dubbo.rpc.RpcException: No provider available from registry localhost:9090 for service com.shawearn.spring.cloud.alibaba.api.HelloService on consumer 192.168.1.113 use dubbo version 2.7.6, please check status of providers(disabled, not registered or in blacklist). at org.apache.dubbo.registry.integration.RegistryDirectory.doList(RegistryDirectory.java:599) ~[dubbo-2.7.6.jar:2.7.6] ......

我们可以通过 try-catch 捕获 RpcException 并对异常进行处理,当然,也可以使用 Dubbo 自带的 本地伪装 功能。
本地伪装 通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败。
关于本地伪装的 xml 配置此处就不赘述了,读者可参见 Dubbo 官方文档,下面描述如何以注解的方式开启本地伪装功能。
本文代码基于 spring-cloud-alibaba-demo 下的 m01 模块代码,读者可自行下载并在自己机器上实验。
注意,本例只为使用方式的简单参考,并非最佳实践。
步骤一 在工程中提供 Mock 实现。
由于示例代码中远程服务通过 com.shawearn.spring.cloud.alibaba.api.HelloService 接口定义,因此在消费端(此处指 m01-nacos-dubbo-consumer)中编写 HelloService 实现类:
HelloMock.java
package com.shawearn.spring.cloud.alibaba.mock; import com.shawearn.spring.cloud.alibaba.api.HelloService; import com.shawearn.spring.cloud.alibaba.dto.UserInfoDto; public class HelloMock implements HelloService { @Override public String sayHello(UserInfoDto userInfo) { // 伪造容错数据,此方法只在出现 RpcException 时被执行; return "容错数据"; } }

步骤二 修改远程接口注入信息。
示例代码的远程接口是在 com.shawearn.spring.cloud.alibaba.controller.HelloController 中被注入的,需要在注入时指定 mock 实现类——HelloMock。
// 通过 mock 参数指定 mock 实现类绝对路径; @org.apache.dubbo.config.annotation.Reference(mock = "com.shawearn.spring.cloud.alibaba.mock.HelloMock") private HelloService helloService;

通过 Referencemock 参数指定 mock 实现类绝对路径;
实验 重新运行 m01-nacos-dubbo-consumer 消费者,注意不要启动 m01-nacos-dubbo-provider
项目启动后访问 http://localhost:8021/hello?name=Shawearn
返回结果:
{ "code":0, "msg":"请求成功", "result":"容错数据" }

可以看到当服务提供者无法被访问时,消费者自行调用了本地的 HelloMock

    推荐阅读