Dubbo的运行机制
Dubbo 2.7 新特性
1.Repackage[^1]
2. 元数据
3.JDK8[^jdk]
4.动态配置
5.异步支持[^3]
6.路由支持
对于以上6点的解释:
- 包名的变化:org.apache.dubbo
- JDK8 Function的支持通过default method实现,还支持CompletableFuture异步编程的实现,还有Optional类、Lamdba表达式、Function的支持。
2.6.x存在以下缺点:
Future无法自动返回,不支持Provider端异步
以下例子只是逻辑,无法运行
// Dubbo2.6.x 及以下版本异步支持
public interface FooService{String findFoo(String name);}
// 此调用会立即返回null
fooService.findFoo(fooId);
// 当结果返回后,会被通知和设置到此Future
Future<Foo> fooFuture = RpcContext.getContext().getFuture();
fooFuture.get();
2.7的支持:
通过Jdk8的新特性—CompletableFuture方式来支持异步。
// Dubbo 2.7 对异步支持
// 方式一:接口中直接定义CompletableFuture
public interface AsyncService{
CompletableFuture<String> sayHello(String name);
}
// 方式二:新接口@AsyncFor
public interface GreetingsService{
String sayHi(String name);
}
@AsyncFor(GreetingsService.class)
public interface GrettingServiceAsync extends GreetingsService{
CompletableFuture<String> sayHiAsync(String name);
}
具体如下:
*元数据的改造:
存在的问题:
问题
provider端会将URL信息写入ZK里面的某一个节点,consumer端也会将URL信息写入ZK里面的某一个节点。同时consumer端会订阅zk节点,如果节点一有变化,会推送到consumer端。这些过程的发生网络开销是非常大的。
如果ZK是个集群,Provider端是个集群,Consumer端是个集群,这样分发、拉取的数据量会非常大。
分析:
改造:
注意一下:
这个redis就是用来存储信息的,不会像consumer发送通知。当然可以使用其他数据库实现。只要实现对应的API。
- 动态配置中心
类似于Spring Cloud 有个Spring Cloud Client做个远程的动态配置中心。
1.第一种场景
2.第二种场景
- 路由规则
Dubbo原理图:
参考:Apache Dubbo 杭州站