我们知道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协议本身支持三种发送请求方式:
2.6.x版本的异步方式提供了一些异步能力,包括Consumer端异步调用、参数回调、事件通知等。但当前的异步方式存在以下问题:
具体的可以参考该文章 dubbo源码解析(二十四)远程调用——dubbo协议 中的源码分析来理解其中存在的问题。
那么在2.7.x版本,由于JDK版本升级到了1.8,引入了JDK1.8 中的CompletableFuture接口,CompletableFuture支持 future 和 callback 两种调用方式。关于CompletableFuture怎么被运用到dubbo中我会在后续的文章介绍。引入该接口后,做了以下优化:
支持Provider端异步
支持直接定义返回CompletableFuture的服务接口。通过这种类型的接口,我们可以更自然的实现Consumer、Provider端的异步编程。
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的外部化存储)外部化配置目的之一是实现配置的集中式管理,这部分业界已经有很多成熟的专业配置系统如Apollo, Nacos等,Dubbo所做的主要是保证能配合这些系统正常工作。外部化配置和其他本地配置在内容和格式上并无区别,可以简单理解为 dubbo.properties
的外部化存储,配置中心更适合将一些公共配置如注册中心、元数据中心配置等抽取以便做集中管理
服务治理:服务治理规则的存储与通知。
配置的操作可以查看官方文档,由于现在dubbo支持多种配置方式,所以这里需要强调的是配置覆盖的优先级,从上至下优先级依此降低:
新增了Protobuf序列化支持。
其他的bug修复以及一些小细节优化请查看github上的Issues或者PR。