Java知识分享
热爱技术,分享技术

Dubbo服务mock与服务降级

1. 本地服务Mock

服务消费者本地服务mock主要用来做本地测试用,当服务提供端服务不可用时,使用本地mock服务可以模拟远端提供者让消费者测试自己的功能,而不需要发起远程调用。

要实现mock功能,首先需要消费者先实现服务接口的mock实现类,在Demo中我们对接口cn.hackcloud.demo.dubbo.rpc.IUserService进行模拟,其mock实现类为cn.hackcloud.demo.dubbo.rpc.UserServiceMock。需要注意的是,mock实现类必须符合“接口包名.类名Mock格式”,否则启动时会抛出“throw new IllegalStateException(“No default constructor from mock class”+mockClass.getName(),e)”异常。

package cn.hackcloud.demo.dubbo.rpc;

import cn.hackcloud.demo.dubbo.bean.UserAddress;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;

public class IUserServiceMock implements IUserService {
    @Override
    public List<UserAddress> sync(String userId) {
        UserAddress userAddress = new UserAddress();
        userAddress.setUserId("mock");
        return Arrays.asList(userAddress);
    }

    @Override
    public List<UserAddress> async(String userId) {
        return null;
    }

    @Override
    public CompletableFuture<List<UserAddress>> async2(String userId) {
        return null;
    }
}

上面代码中的mock实现类简单,我们使用sync方法来测试mock,使他随便返回一条userId为mock的数据。

下面使用代码如下:

/**
* dubbo mock调用
*/
public static void mock() {
ReferenceConfig<IUserService> reference = referenceConfig();
//设置启动时不检查服务提供者是否可用
reference.setCheck(false);
//设置mock调用
reference.setMock("true");
IUserService userService = reference.get();
print(userService.sync("1"));
}

上面代码中使用setCheck=true启动时不检查提供者是否可用,然后setMock=true方式开启mock功能。接着执行该类,并且保证mock实现类的class文件位于classpath下。运行后会输出 userId=mock的示例。说明dubbo mock生效。

注意:在执行mock服务实现mock方法前,会先发起远程调用,当远程调用失败时,才会降级执行mock功能。

2. dubbo服务降级

dubbo提供了一些服务降级措施,当服务提供者某一个服务出错时,可以手动对消费者的调用进行降级,这样服务消费端避免了再去调用出错的服务,一面加重服务提供着的负担。

RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=configurators&dynamic=false&application=foo&mock=force:return+null"));
  • mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
  • 还可以改为 mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。

3. dubbo隐式参数传递

可以通过 RpcContext 上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递。 

dubbo隐式参数传递
dubbo隐式参数传递

在服务消费方端设置隐式参数

setAttachment 设置的 KV 对,在完成下面一次远程调用会被清空,即多次远程调用要多次设置。

RpcContext.getContext().setAttachment("index", "1"); // 隐式传参,后面的远程调用都会隐式将这些参数发送到服务器端,类似cookie,用于框架集成,不建议常规业务使用
xxxService.xxx(); // 远程调用

在服务提供方端获取隐式参数

public class XxxServiceImpl implements XxxService {
 
    public void xxx() {
        // 获取客户端隐式传入的参数,用于框架集成,不建议常规业务使用
        String index = RpcContext.getContext().getAttachment("index"); 
    }
}

注意:path, group, version, dubbo, token, timeout 几个 key 是保留字段,请使用其它值。

打赏
本站所有资源均来源于网络,仅供学习使用,请支持正版!Java技术开源 » Dubbo服务mock与服务降级

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册