dubbo入门学习

Posted biehongli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo入门学习相关的知识,希望对你有一定的参考价值。

官方网址:http://dubbo.apache.org/zh-cn/index.html

学习可以参考官网中文文档:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

1、Apache Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

1 如果项目表现层、服务层是不同的项目,可以使用dubbo实现两个系统之间的通信。服务层和表现层相互通信,使用dubbo中间件,让表现层调用服务层。工程之间的相互通信可以使用dubbo,,可以统一管理服务,系统之间的调用。
2 如何实现远程通信。
3   1、Webservice,效率不高,基于soap协议,项目中不推荐使用。
4   2、使用restful形式的服务,http+json,很多项目中应用。如果服务太多,服务之间的调用关系混乱,需要治疗服务。
5   3、dubbo,使用rpc协议进行远程调用,直接使用socket通信,传输效率高,并且可以统计出系统之间的调用关系,调用次数。缺点,由于是java开发,只能是两个java项目进行调度。

2、dubbo架构。术语来自官网。可以直接查看官网。

技术图片

节点角色说明
节点角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行容器

 

调用关系说明
  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。

3、注册中心(推荐zookeeper,也可以使用redis的呢)
  注册中心负责服务地址得注册与查找,相当于目录服务,服务提供者和消费者只在启动得时候与注册中心交互,注册中心不转发请求,压力较小,使用dubbo2.3.3以上版本,建议使用zookeeper注册中心。zookeeper是一个树形的目录服务,支持变更推送,适合作为dubbo服务的注册中心,工业强度高,可以用于生产环境,推荐使用。

4、安装zookeeper,必须首先安装jdk,这里安装jdk1.7版本。首先将安装包上传到机器上面哦。

[root@localhost jdk1.7.0_55]# tar -zxvf jdk-7u55-linux-i586.tar.gz -C /home/hadoop/soft

[root@localhost ~]# vim /etc/profile

1 export JAVA_HOME=/home/hadoop/soft/jdk1.7.0_55
2 export PATH=$PATH:$JAVA_HOME/bin

技术图片
[root@localhost ~]# source /etc/profile

[root@localhost ~]# java

[root@localhost ~]# javac

[root@localhost ~]# java -version

5、开始安装zookeeper,首先将安装包上传到机器上面哦。

解压缩操作哦。

[root@localhost package]# tar -zxvf zookeeper-3.4.6.tar.gz -C /home/hadoop/soft/

技术图片

技术图片

然后配置一下zookeeper,就可以启动zookeeper了。

首先创建一个data文件夹。

技术图片

技术图片

技术图片

配置完成了,就可以启动zookeeper。进行验证是否可以正常启动。

1 [root@localhost bin]# ./zkServer.sh start
2 JMX enabled by default
3 Using config: /home/hadoop/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
4 Starting zookeeper ... STARTED
5 [root@localhost bin]# ./zkServer.sh status
6 JMX enabled by default
7 Using config: /home/hadoop/soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
8 Mode: standalone
9 [root@localhost bin]#

技术图片

[root@localhost bin]# ./zkServer.sh start    启动
[root@localhost bin]# ./zkServer.sh status    查看启动状态
[root@localhost bin]# ./zkServer.sh stop    关闭

6、zookeeper安装成功以后,就可以操作,服务如何发布,客户端如何引用服务。

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何api侵入,只需要用spring加载dubbo的配置即可,dubbo基于spring的schema扩展进行加载。
远程服务。在本地服务的基础上,只需要简单的配置,即可以完成远程话。
将传统写的xml配置文件中的bean注入以及bean的依赖注入的配置拆分成两份,将服务定义部分放在服务提供方remote-provider.xml,将服务引用部分放在服务消费方remote-consumer.xml配置文件中。并在提供方增加暴漏服务配置<dubbo:service>,在消费方增加引用服务配置<dubbo:reference>。官网截图:
技术图片

 7、发布dubbo服务。定义一个接口。

 1 package com.taotao.service;
 2 
 3 import com.taotao.pojo.TbItem;
 4 
 5 /**
 6  * 
 7  * @ClassName: ItemService.java
 8  * @author: biehl
 9  * @since: 2019年8月2日 下午3:32:36
10  * @Copyright: ©2019 biehl 版权所有
11  * @version: 0.0.1
12  * @Description:商品接口类
13  * 
14  */
15 public interface ItemService 
16 
17     /**
18      * 根据itemId查询出商品信息
19      * 
20      * @param itemId
21      * @return
22      */
23     public TbItem getItemById(long itemId);
24     
25 

定义实现接口的实现类。

 1 package com.taotao.service.impl;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Service;
 5 import org.springframework.util.StringUtils;
 6 
 7 import com.taotao.mapper.TbItemMapper;
 8 import com.taotao.pojo.TbItem;
 9 import com.taotao.service.ItemService;
10 
11 /**
12  * 
13  * @ClassName: ItemServiceImpl.java
14  * @author: biehl
15  * @since: 2019年8月2日 下午3:51:24
16  * @Copyright: ©2019 biehl 版权所有
17  * @version: 0.0.1
18  * @Description: 商品实现类
19  */
20 @Service
21 public class ItemServiceImpl implements ItemService 
22 
23     @Autowired
24     private TbItemMapper tbItemMapper;
25 
26     @Override
27     public TbItem getItemById(long itemId) 
28         TbItem tbItem = new TbItem();
29         if (!StringUtils.isEmpty(itemId)) 
30             tbItem = tbItemMapper.selectByPrimaryKey(itemId);
31         
32         // 返回信息以后就可以发布服务
33         return tbItem;
34     
35 
36 

 配置提供dubbo的服务。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:context="http://www.springframework.org/schema/context"
 4     xmlns:p="http://www.springframework.org/schema/p"
 5     xmlns:aop="http://www.springframework.org/schema/aop"
 6     xmlns:tx="http://www.springframework.org/schema/tx"
 7     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
 8     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 9     xsi:schemaLocation="http://www.springframework.org/schema/beans 
10     http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
11     http://www.springframework.org/schema/context 
12     http://www.springframework.org/schema/context/spring-context-4.2.xsd
13     http://www.springframework.org/schema/aop 
14     http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
15     http://www.springframework.org/schema/tx 
16     http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
17     http://code.alibabatech.com/schema/dubbo 
18     http://code.alibabatech.com/schema/dubbo/dubbo.xsd
19     http://www.springframework.org/schema/util 
20     http://www.springframework.org/schema/util/spring-util-4.2.xsd">
21 
22     <!-- 1、配置包扫描器,扫描所有带@Service注解的类,將創建的對象放到Spring容器中 -->
23     <!-- 也可以将子包扫描进去 -->
24     <!-- 将扫描com.taotao.service、com.taotao.service.impl -->
25     <context:component-scan
26         base-package="com.taotao.service"></context:component-scan>
27 
28     <!-- 配置spring的事务,单独提取出来 -->
29 
30     <!-- 发布dubbo服务 -->
31     <!-- 提供方应用信息,用于计算依赖关系 -->
32     <dubbo:application name="taotao-manager" />
33     <!-- 注册中心的地址 -->
34     <dubbo:registry protocol="zookeeper" address="192.168.110.140:2181" />
35     <!-- 用dubbo协议在20880端口暴露服务 -->
36     <dubbo:protocol name="dubbo" port="20880" />
37     <!-- 声明需要暴露的服务接口 -->
38     <!-- ref="itemServiceImpl"就是扫描service的时候,注入到容器的bean -->
39     <dubbo:service interface="com.taotao.service.ItemService" ref="itemServiceImpl" timeout="300000" />
40     <!-- <dubbo:service interface="com.taotao.service.ItemCatService" ref="itemCatServiceImpl" timeout="300000" /> -->
41 
42     
43     
44     
45     
46 
47 </beans>    

如图所示:

技术图片

8、在表现层引用dubbo的服务。提供方和引用方都需要引入dubbo的jar包哦。

 1 <!-- dubbo相关 -->
 2 <dependency>
 3     <groupId>com.alibaba</groupId>
 4     <artifactId>dubbo</artifactId>
 5     <!-- 排除spring的2.5.6版本,netty3.2.5版本,避免冲突 -->
 6     <exclusions>
 7         <exclusion>
 8             <groupId>org.springframework</groupId>
 9             <artifactId>spring</artifactId>
10         </exclusion>
11         <exclusion>
12             <groupId>org.jboss.netty</groupId>
13             <artifactId>netty</artifactId>
14         </exclusion>
15     </exclusions>
16 </dependency>
17 <dependency>
18     <groupId>org.apache.zookeeper</groupId>
19     <artifactId>zookeeper</artifactId>
20 </dependency>
21 <dependency>
22     <groupId>com.github.sgroschupf</groupId>
23     <artifactId>zkclient</artifactId>
24 </dependency>

配置一下引用方的配置。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4     xmlns:p="http://www.springframework.org/schema/p"
 5     xmlns:context="http://www.springframework.org/schema/context"
 6     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
 7     xmlns:mvc="http://www.springframework.org/schema/mvc"
 8     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 9         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
10         http://www.springframework.org/schema/mvc 
11         http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
12         http://code.alibabatech.com/schema/dubbo 
13         http://code.alibabatech.com/schema/dubbo/dubbo.xsd
14         http://www.springframework.org/schema/context 
15         http://www.springframework.org/schema/context/spring-context-4.2.xsd">
16 
17     <!-- 1、加载属性文件 -->
18     <!-- <context:property-placeholder location="classpath:resource/resource.properties"/> -->
19     
20     <!-- 2、配置注解驱动 -->
21     <mvc:annotation-driven />
22     
23     <!-- 3、视图解析器 -->
24     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
25         <property name="prefix" value="/WEB-INF/jsp/" />
26         <property name="suffix" value=".jsp" />
27     </bean>
28     
29     <!-- 4、配置包扫描器,扫描@Controller注解的类 -->
30     <context:component-scan base-package="com.taotao.controller"/>
31     
32     <!-- 5、配置资源映射 -->
33     <mvc:resources location="/css/" mapping="/css/**"/>
34     <mvc:resources location="/js/" mapping="/js/**"/>
35     
36     <!-- 6、多媒体解析器 -->
37     <!-- 配置文件上传解析器 -->
38     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
39         <!-- 设定默认编码 -->
40         <property name="defaultEncoding" value="UTF-8"></property>
41         <!-- 设定文件上传的最大值5MB,5*1024*1024 -->
42         <property name="maxUploadSize" value="5242880"></property>
43     </bean>
44     
45     
46     <!-- 引用服务,也要在spring容器中,直接在这里引用即可 -->
47     <!-- 引用dubbo服务 -->
48     <!-- 名称不一样的哦 -->
49     <dubbo:application name="taotao-manager-web"/>
50     <dubbo:registry protocol="zookeeper" address="192.168.110.140:2181"/>    
51     <dubbo:reference interface="com.taotao.service.ItemService" id="itemService" />
52     <!-- <dubbo:reference interface="com.taotao.service.ItemCatService" id="itemCatService" />
53     <dubbo:reference interface="com.taotao.content.service.ContentCategoryService" id="contentCategoryService" />
54     <dubbo:reference interface="com.taotao.content.service.ContentService" id="contentService" />
55     <dubbo:reference interface="com.taotao.search.service.SearchItemService" id="searchItemService" /> -->
56     
57     
58     
59     
60 </beans>      
 1 package com.taotao.controller;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Controller;
 5 import org.springframework.web.bind.annotation.PathVariable;
 6 import org.springframework.web.bind.annotation.RequestMapping;
 7 import org.springframework.web.bind.annotation.ResponseBody;
 8 
 9 import com.taotao.pojo.TbItem;
10 import com.taotao.service.ItemService;
11 
12 /**
13  * 
14  * @ClassName: ItemController.java
15  * @author: biehl
16  * @since: 2019年8月2日 下午5:10:31
17  * @Copyright: ©2019 biehl 版权所有
18  * @version: 0.0.1
19  * @Description:商品信息的控制层逻辑
20  */
21 @Controller
22 public class ItemController 
23 
24     // itemService就是dubbo配置的id="itemService"
25     @Autowired
26     private ItemService itemService;
27 
28     @RequestMapping(value = "/item/itemId")
29     @ResponseBody
30     public TbItem getItemById(@PathVariable(value = "itemId") Long itemId) 
31         TbItem tbItem = new TbItem();
32         tbItem = itemService.getItemById(itemId);    
33         return tbItem;
34     
35 
36 

9、dubbo服务调用测试。记得关闭dubbo服务器的防火墙,不然急死你。

 

 

 

 

 

 

 

 

 

待续......

以上是关于dubbo入门学习的主要内容,如果未能解决你的问题,请参考以下文章

dubbo入门学习-----dubbo整合springboot

dubbo学习-入门

dubbo入门学习-----dubbo的高可用

Dubbo -- 系统学习 笔记 -- 入门

dubbo学习--简单的入门搭建实例

2018.11.9 Dubbo入门学习