目标:了解2.7的新特性,以及版本升级的引导。
我们知道Dubbo在2011年开源,停止更新了一段时间。在2017 年 9 月 7 日,Dubbo 悄悄的在 GitHub 发布了 2.5.4 版本。随后,版本发布的非常迅速,Dubbo项目被重启了,经过大半年的更新,在2018年2月15日,Dubbo 获得了 14 张赞成票,在无弃权和反对票的情况下,正式通过投票,顺利成为 Apache 基金会孵化项目。现在的Dubbo社区非常活跃,版本进度也非常的快。
从上图就可以看出dubbo现在的活跃度。
现在dubbo项目有以下几个分支:
关注dubbo社区的朋友应该也知道在2019.3.23在南京举办了Meetup,其中有一个专题就是讲2.7新特性介绍。我就在分享者的基础上讲解一下自己的理解。
在所需的最小JDK版本从以前的1.6变成了1.8。
com.alibaba.dubbo - > org.apache.dubbo
我们知道dubbo协议本身支持三种发送请求方式:
异步发送:也就是当我发送调用后,我不阻塞等待结果,直接返回,将返回的future保存到上下文,方便后期使用。在异步发送中有两种方式分别是
2.6.x版本的异步方式提供了一些异步能力,包括Consumer端异步调用、参数回调、事件通知等。但当前的异步方式存在以下问题:
具体的可以参考该文章 dubbo源码解析(二十四)远程调用——dubbo协议 中的源码分析来理解其中存在的问题。
那么在2.7.x版本,由于JDK版本升级到了1.8,引入了JDK1.8 中的CompletableFuture接口,CompletableFuture支持 future 和 callback 两种调用方式。关于CompletableFuture怎么被运用到dubbo中我会在后续的文章介绍。引入该接口后,做了以下优化:
public interface AsyncService {
CompletableFuture<String> sayHello(String name);
}
public interface GreetingsService {
String sayHi(String name);
}
@AsyncFor(GreetingsService.class)
public interface GrettingServiceAsync extends GreetingsService {
CompletableFuture<String> sayHiAsync(String name);
}
RpcContext.startAsync() public interface AsyncService {
String sayHello(String name);
}
public class AsyncServiceImpl implements AsyncService {
public String sayHello(String name) {
final AsyncContext asyncContext = RpcContext.startAsync();
new Thread(() -> {
asyncContext.write("Hello " + name + ", response from provider.");
}).start();
return null;
}
}
具体的实现原理我在后续文章中结合源码来讲解, 注意 :这些改动都仅仅支持dubbo协议。
我们知道2.7以前的版本只有注册中心,注册中心的URL有数十个key/value的键值对,包含了一个服务所有的元数据。在越来越多的功能被增加,元数据也变得异常庞大,就出现了下面的问题:
针对以上问题,在2.7中,将URL中的元数据划分了三个部分:
改造后,分别形成三大中心:
Dubbo 提供了具有一定扩展性的路由规则,其中具有代表性的是条件路由和脚本路由。2.6.x及以下版本存在的问题:
在2.7.x版本中,对路由规则做了增强:
丰富的路由规则。
配置中心(v2.7.0)在Dubbo中承担两个职责:
dubbo.properties
配置的操作可以查看官方文档,由于现在dubbo支持多种配置方式,所以这里需要强调的是配置覆盖的优先级,从上至下优先级依此降低:
新增了Protobuf序列化支持。
其他的bug修复以及一些小细节优化请查看github上的Issues或者PR。
升级2.7.0的引导请查看以下链接: http://dubbo.apache.org/zh-cn...
该文章讲解了dubbo2.7的新特性,现在2.7.1已经发布,有兴趣的可以去看看2.7.1新增了什么。下一篇我就先从源码的角度来讲讲这个异步化的改造。