Dubbo入门程序

简单介绍:Dubbo主要解决分布式架构下的函数调用。

开发分层:

  1. Interface层:仅提供接口,且定义了服务对外提供的所有接口;
  2. Model层:一些必要的对象;
  3. Business层:业务实现层,实现interface接口;
1
2
3
4
5
6
graph LR
API接口--> 仓库
仓库 --> 生产者1
生产者1 -->服务中心
仓库 --> 消费者
服务中心 --> 消费者

开发步骤通俗讲有以下几步:

1.首先需要一个api的项目,提供所有微服务接口,打个jar包,扔进仓库;
2.生产者依赖该Jar包,实现接口,注册服务;
3.消费者依赖API的r包,同时在注册中心订阅服务,即可通过接口调用服务。

整个调用过程完全没有出现另一个微服务中的代码,当然一个微服务既可以充当消费者也可以充当生产者,也可以两者兼任。

开始开发:

该例子讲非常简单,仅仅充当入门参考,实际开发要复杂得多,望悉知。

1. dubbo-api

新建Maven项目,依赖要添加,新建一个接口。
目录结构如下图:
dubbo-api
好了,mvn install就完成了,整体十分简单,仅仅提供了一个接口。

2. dubbo-producer

首先需要依赖API的包!!!
生产者需要一个Dubbo的配置文件(Spring的配置文件),将服务注册进服务中心。
下述配置提供了两种Bean配置方案,配置式和注解式,复制粘贴是需要注意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<!--定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识-->
<dubbo:application name="demotest-provider" owner="programmer" organization="dubbox"/>
<!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />

<!--配置式-->
<dubbo:service interface="young.demo.dubbo.service.ApiDemoService" ref="demoService" protocol="dubbo" />
<!--具体实现该接口的 bean-->
<bean id="demoService" class="young.demo.dubbo.service.impl.ApiDemoServiceImpl"/>

<!-- 注解式 -->
<!-- 使用注解方式暴露接口 -->
<dubbo:annotation package="young.demo.dubbo.service" />
<!-- 加入spring注解扫描 -->
<context:component-scan base-package="young.demo.dubbo.service"/>
</beans>

有了配置文件后,生产者需要实现API中的的接口ApiDemoService,代码如下:
注意注解!!使用Dubbo的@Service。如果使用了配置式,就无需注解了。

1
2
3
4
5
6
7
8
9
10
11
12
//注解式方案需要两个注解,Spring的Component和Dubbo的Service,缺一不可!
@Component
@com.alibaba.dubbo.config.annotation.Service
public class ApiDemoServiceImpl implements ApiDemoService {
public List<String> getPermissions(Long id) {
List<String> demo = new ArrayList<String>();
demo.add(String.format("Permission_%d", id - 1));
demo.add(String.format("Permission_%d", id));
demo.add(String.format("Permission_%d", id + 1));
return demo;
}
}

3. dubbo-consumer

消费者就很简单了,需要依赖API的包!!!
之后提供一个配置文件,从服务中心获取。
同样的连年耕种配置方式:配置式和注解式,推荐使用注解式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<dubbo:application name="demotest-consumer" owner="programmer" organization="dubbox"/>
<!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->
<dubbo:registry address="zookeeper://localhost:2181"/>

<!--配置式-->
<!--使用 dubbo 协议调用定义好的 api.PermissionService 接口-->
<!--<dubbo:reference id="permissionService" interface="young.demo.dubbo.service.ApiDemoService"/>-->

<!--注解式-->
<!-- 使用注解方式暴露接口 -->
<dubbo:annotation package="young.demo.dubbo.consumer" />
<!-- 加入spring注解扫描 -->
<context:component-scan base-package="young.demo.dubbo.consumer"/>

</beans>

调用服务的测试代码如下:
注意:此处注入时使用的注解不再是Spring的Autowired,而是使用了Dubbo提供的**@Reference**

1
2
3
4
5
6
7
8
9
10
11
12
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:dubbo_consumer.xml")
public class Consumer {

@com.alibaba.dubbo.config.annotation.Reference
private ApiDemoService apiDemoService;

@Test
public void testConsumer(){
System.out.println("consumer start");
System.out.println(apiDemoService.getPermissions(1L));
}

至此一个简单的Dubbo入门程序就完成了。代码已上传至GitHub