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")