- 前情回顾:
1、集群容错:
a、<dubbo:service cluster=“failover” retries=/> 提供方配置,当调用一个服务失败之后,切换到另外一个服务,retries可以设置重试次数,适用于幂等操作。
b、failFast 当调用服务失败后,不再调用其他服务,适用于非幂等操作。
c、failsafe 调用失败之后忽略。
2、负载均衡:loadbalance=“random,roundrobin,leastactive”.
3、缓存配置 cache=“lur/theadlocal”
4、异步调用。RpcContext.getContext.getFutrue().get();
2、本堂课内容:
a、dubbo常用标签。
b、工作中使用异步、事件触发、泛化调用、回声测试。
c、dubbo 初始化过程
Future模式学习
异步:(解决耗时)不方便管理
RpcContext.getContext.getFutrue().get();
回调:(在消费方配置,callBack类为spring容器中注入的bean 对象)回调对象接收的方法onOrderSubmit(arg1,arg2),arg1 为返回结果,arg2为调用方法的入参,正常:onReturn 异常时:onThrow
回声测试:(在项目开发完成后,上线测试是否所有的服务器已经启动完成)
原理:所有的rpc引用的代理对象,都实现了接口EchoService,所有dubbo bean 都可以转换成EchoService。
实现:定义dubbo bean 中的id ,EchoService echo = ctx.getBean(id); String ret = echo.$echo(“ok”); ret为测试结果返回,由此来判断reference是否就绪。
Dubbo的泛化调用:(向上抽象,没有mall-support接口的支持,A项目打算调用B项目的接口描述,想要完成rpc调用)
思路:利用反射,不知道class内部,知道class路径。
实现: 在消费者中引用
<dubbo:reference id= "otherService" interface=""com.enjoy.OtherService" generic=true/>
GenericService gen = (GenricService) ctx.getBean("otherService");
Object ret = gen.invoke("methodName",new String[]{"java.lang.String"},new Object[]{"name"});
//第一个参数为方法名称,第二个为入参参数,第三个为参数对象。
ctx的获取
public class TestController implements ApplicationContextAware{
private ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ctx = applicationContext;
}
}
RPC调度服务调度过程:
服务端暴露(中转对象):为服务创建一个中转对象(能接触网络请求信息/调用本地方法)
服务端引入(代理对象):在消费者端建立一个代理对象,专职来发送接口信息给中转对象
doExport中,会遍历所有的协议进行提供方的暴露。