深入理解dubbo的注册中心与元数据

1、Dubbo 概述

Apache开发的2.7.X新增了元数据中心和配置中心这两个功能。元数据信息包括服务接口,及接口的方法信息。这些信息将被用于服务mock,服务测试。

核心参数

  • 注册中心:zk\Nacos地址与端口【多个】
  • 协议:dubbo\hession,服务暴露端口
  • 服务:服务名、version[升级]、group[一个接口有多个实现]

2.7 版本后: 元数据中心和配置中心

在这里插入图片描述

元数据

  • 元数据: 服务分组、服务版本、服务名、方法列表、方法参数列表、超时时间等;

在这里插入图片描述

  • 生产者状态
    在这里插入图片描述

在这里插入图片描述

  • 消费者
    在这里插入图片描述

在这里插入图片描述

注册信息

  • 注册信息: 服务分组、服务版本、服务名、地址列表等,这些信息将会存储在注册中心中;
    在这里插入图片描述

配置数据

在这里插入图片描述

2、为什么要分离注册中心
  • 变化频繁度
    注册信息和元数据耦合在一起会导致注册中心数据量的膨胀,进而增大注册中心的网络开销,直接造成了服务地址推送慢等负面影响。服务上下线会随时发生,变化的其实是注册信息,元数据是相对不变的。

  • 数据量
    由于元数据包含了服务的方法列表以及参数列表,这部分数据会导致元数据要比注册信息大很多。注册信息被设计得精简会直接直接影响到服务推送的 SLA。

  • 数据交互/存储模型
    注册中心采用的是 PubSub 模型,这属于大家的共识,所以注册中心组件的选型一般都会要求其有 notify 的机制。而元数据中心并没有 notify 的诉求,一般只需要组件能够提供 key-value 的存储结构即可。

在这里插入图片描述

3、Rpc 的mock调用
  • 方案1:本地伪装
    本地伪装通常用于服务降级,例如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败。
<dubbo:reference 
id="demoService" interface="com.alibaba.dubbo.demo.DemoService"           
version="1.0.0" mock="com.alibaba.dubbo.demo.consumer.mock.DemoServiceMock"/>



public class DemoServiceMock implements DemoService {
    public String sayHello(String name) {
        return "mock-value";
    }
}

原服务抛出异常后,触发本地mock进行服务降级,使用force模式强制调用mock平台上的服务,但是一来会覆盖原先的本地mock,不符合无侵入原则。

3、回声测试

回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。所有服务自动实现EchoService接口,只需将任意服务引用强制转型为EchoService 即可使用;

EchoService echoService = (EchoService) demoService;
echoService.$echo("hello");
4、 泛化调用

泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用Map表示,通常用于框架集成,例如:实现一个通用的服务测试框架,可通过GenericService调用所有服务实现。


		// 引⽤远程服务, 该实例⾥⾯封装了所有与注册中⼼及服务提供⽅连接,请缓存
        ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
        // 弱类型接⼝名
        reference.setInterface("com.alibaba.dubbo.demo.DemoService");
        reference.setVersion("1.0.0");
        // 声明为泛化接⼝
        reference.setGeneric(true);
        // ⽤com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用⽤
        GenericService genericService = reference.get();
        // 基本类型以及Date,List,Map等不需要转换,直接调⽤
        Object result = genericService.$invoke("sayYes", new String[] 
        {"java.lang.String"}, new Object[] {"afei"});
        System.out.println("result --> "+result);

        // ⽤Map表示POJO参数,如果返回值为POJO也将自动转成Map
        Map<String, Object> teacher = new HashMap<String, Object>();
        teacher.put("id", "1");
        teacher.put("name", "admin");
        teacher.put("age", "18");
        teacher.put("level", "3");
        teacher.put("remark", "测试");
        // 如果返回POJO将自动转成Map
        result = genericService.$invoke("justTest", new String[]
                {"com.alibaba.dubbo.demo.bean.HighTeacher"}, new Object[]{teacher});
        System.out.println("result --> "+result);
5、补充【直连模式】
  • 本地Rpc调用时配置url直连模式
@Reference(url = "dubbo://localhost:20880?group=dubbo&version=1.0.0&timeout=3000")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值