今天开始,一起研究Dubbo,从最基本的Hello World开始,经过源码一步步学习架构。
本文将以以下问题展开:
- Dubbo是啥?
- RPC 是啥意思?
- 注册中心和配置中心作用是啥?
以上问题看完文章后相信大家就可以清楚,若有疑问,关注博主公众号:六点A君,回复标题获取最新答案><
Dubbo
Dubbo 是一款高性能Java RPC 框架,由阿里巴巴捐给Apache ,经过长时间孵化,Dubbo正式毕业。称为Apache 家庭的顶级项目。
在国内有众多公司使用Dubbo。当然中途有一段事件阿里巴巴并没有对其维护,但是国内很多公司都基于Dubbo 进行功能扩展。例如当当基于dubbo2.x扩展版本dubbox。
RPC 即为 Remote Procedure Call :远程调用。
由这个名字,可以衍生出服务提供者(Provider),服务消费者(Consumer)。当然Provider和 Consumer不在同一台机器,所以用什么来知道Provder的状态呢?如果这个Provder宕机了,而Consumer不知道,而仍然调用,那么当然会报错。
如果就以一个简单的例子,实现起来就很简单。
所以此处引入了注册中心(Register Center),通过注册中心,Consumer就能知道,哪些Provder是存活,反过来说,注册中心会与Provder维持一个消息,可以是心跳,从而知道Provder的状态。
下面引用Dubbo 官网一张图来说明这个基本架构:
最后,如果需要管理Consumer以及Provder,即引入了Monitor。
Hello Dubbo
经过上面一段话的简单介绍,相信大家已经对RPC,以及Dubbo有了一个大概的轮廓,下面就开始来一个简单的Hello world来进入Dubbo的世界。
下面以Api调用的例子来走进Dubbo的世界,这里使用API方式介绍Dubbo的使用,由于Spring 的IOC将Bean统一管理起来,提升了效率,而Spring Boot 约定大于配置方式,我认为其实对普通开发者了解内部机制并没有任何帮助。当然换一句话说,这就是进步,就像Java Web不可能永远停留在JSP阶段一样。
Register Center
本文例子以Zookeeper作为注册中心,所以首先要启动Zookeeper,具体可以参考:ZooKeeper伪集群搭建
Pom
首先给出Pom文件,目前Dubbo 最新版本是2.7.3
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.3</version>
<type>pom</type>
</dependency>
Provider
接下来是服务提供者,在服务提供者中,需要对外暴露 API,从而让Consumer可以调用到服务。
public class ProviderApplication {
public static void main(String[] args) throws IOException {
// 服务配置
ServiceConfig<HelloService> service = new ServiceConfig<>();
// 设置服务名
service.setApplication(new ApplicationConfig("dubbo-provider"));
// 设置注册中心
service.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
// 设置服务对应接口
service.setInterface(HelloService.class);
// 设置服务对应实现
service.setRef(new HelloServiceImpl());
// 暴露服务
service.export();
System.out.println("first-dubbo-provider is running.");
System.in.read();
}
}
而此时,需要一个接口HelloService,以及一个实现这个接口的实现类HelloServiceImpl,从而当程序启动时,会将该HelloServiceImpl以HelloService服务形式暴露出来。
public interface HelloService {
String hello(String name);
}
public class HelloServiceImpl implements HelloService {
@Override
public String hello(String name) {
return "hello" + name;
}
}
Consumer
当服务提供者暴露了服务之后,服务消费者可以通过订阅注册中心,从而获取提供者,从而调用服务。
下面看看Consumer的服务:
public class ConsumerApplication {
public static void main(String[] args) {
// 声明引用配置
ReferenceConfig<HelloService> reference = new ReferenceConfig<>();
// 设置应用名字
reference.setApplication(new ApplicationConfig("dubbo-consumer"));
// 设置注册中心,从而可以监听服务
reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
// 设置服务名,即服务提供者锁暴露的名字
reference.setInterface(HelloService.class);
// 获取一个代理实例
HelloService service = reference.get();
// 调用实例,执行方法
String message = service.hello("dubbo I am anla7856");
System.out.println(message);
}
}
最终在Consumer将会输出:hellodubbo I am anla7856
第一个例子Dubbo就结束了。
什么?就结束了?如果我要用Dubbo,要这么复杂?我调用10000个实例,我要写10000个这样的获取过程??
当然不是,别激动,博主当然不会这样坑大家,Dubbo 提供了 注解,xml 方式来暴露以及管理服务,所以不用每次调用都这样写。
后文中博主会全部交公滴。
具体本文小例子,可以从 pureapi 获取。
预告
下一篇文章,将从第这个API开始,一步一步看Dubbo在这个过程中做了啥事
参考:
关注博主公众号: 六点A君。
哈哈哈,Dubbo小吃街不迷路: