官方網址: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 |
服務運行容器 |
調用關係說明
- 服務容器負責啓動,加載,運行服務提供者。
- 服務提供者在啓動時,向註冊中心註冊自己提供的服務。
- 服務消費者在啓動時,向註冊中心訂閱自己所需的服務。
- 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
- 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
- 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
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服務器的防火牆,不然急死你。
待續......