【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;
通过
Reference
的 mock
参数指定 mock 实现类绝对路径;实验 重新运行
m01-nacos-dubbo-consumer
消费者,注意不要启动 m01-nacos-dubbo-provider
。项目启动后访问 http://localhost:8021/hello?name=Shawearn
返回结果:
{
"code":0,
"msg":"请求成功",
"result":"容错数据"
}
可以看到当服务提供者无法被访问时,消费者自行调用了本地的
HelloMock
。推荐阅读
- =======j2ee|spring用注解实现注入的@resource,@autowired,@inject区别
- jar|springboot项目打成jar包和war包,并部署(快速打包部署)
- 数据库|效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...
- java人生|35K 入职华为Java开发那天,我哭了(这 5 个月做的一切都值了)
- Java毕业设计项目实战篇|Java项目:在线嘿嘿网盘系统设计和实现(java+Springboot+ssm+mysql+maven)
- 微服务|微服务系列:服务发现与注册-----Eureka(面试突击!你想了解的Eureka都在这里.持续更新中......)
- 每日一书|每日一书丨终于有人把云原生讲明白了
- java|ApplicationListener和SpringApplicationRunListener的联系
- Spring|SpringSecurity--自定义登录页面、注销登录配置
- 性能|性能工具之 Jmeter 通过 SpringBoot 工程启动