1.0 簡述
官網: http://dubbo.apache.org/zh-cn/index.html
Dubbo是阿里巴巴的開源RPC組件,底層使用Hessian和Netty做的序列化和傳輸。因阿里巴巴的內部原因Dubbo停止更新了一段時間,錯失了一段大好的市場推廣機會,雖然后面重啟了開源維護計划,但是因這段時間其它的RPC組件的不斷更新和優化搶占了不少的市場,雖然后面阿里巴巴將Dubbo移交到了Apache開源軟件基金會,但是依然感覺后勁不足,阿里巴巴為了完善自己在開源領域的技術設想,逐漸的開源了一系列的組件來為自己在開源領域打氣,如Nacos等。值得肯定的是阿里巴巴在最近幾年間對外的人員輸出和在開源力度上的大力支持,感覺阿里系的開源組件逐漸受到了大眾的接收。當然這個也是SpringBoot和SpringCloud開源組件的一些弊端,總結一句話阿里巴巴開源的Dubbo不是為了和Spring系列的開源產品競爭,而是在打造一套符合國內技術特點的開源選擇方案。
2.0 Dubbo的基本情況
Dubbo是一個RPC,既然是RPC那就是分布式遠程的數據交互,分布式就涉及到了服務的發現和管理,在Dubbo中有這樣的幾個核心概念,分別是應用發現、服務注冊、服務調用。
應用發現:Dubbo提供了3種常見的注冊方式Redis、Zookeeper、Nacos,其中大家使用率最高的就是Zookeeper,這個其實也是歷史原因,因為當時官網上就提供了Zookeeper的注冊說明。當使用Dubbo的應用將服務注冊到了Zookeeper上面以后,其它服務既可以通過ZK發現已經注冊的服務提供者。
服務注冊: 在這個地方我覺得舉個例子來講比較的方便理解,在真是的應用中,例如賬戶服務的應用提供了一個AccountLoginService的實現,那么Dubbo就會獲取到這幾個屬性信息,1、當前接口所在的應用名稱;2當前接口的全限定名稱;3這個接口對應的ID(類似AccountLoginService)的一個別名,這個ID必須唯一。這些信息是怎么來的呢,其實很簡單,通過包掃描獲取到的,Dubbo提供了基於注解和配置XML的方式來顯式的聲明服務。
服務調用: 服務調用上,Dubbo為了簡化調用方式,也做了類似服務注冊的這樣的工作,也提供了基於注解和顯式XML配置的方式來發現服務並調用,服務調用就涉及到了數據的交換,在通過對Dubbo的源碼上的分析,Dubbo集成的Hessian序列化功能就是做的這個事情,它將數據對象(一切皆對象)序列化為字節碼的碼流,通過在ZK上發現了應用上找到對應的服務提供者,然后反序列化(ZK上不只是存儲了注冊的應用名稱,還有當前應用提供的服務,使用KV的形式存儲的)。這樣就傳遞了數據。
注意:原則上服務提供者提供的服務的ID是唯一的,但是真實 應用場景中,ID重復的情況時有發生,Dubbo通過應用名稱+ID的雙重判斷來避免這一情況的發生,但是我們在編碼過程中應盡力避免ID重復的情況。另外,DUbbo傳輸的數據對象必須是有序列化的對象。
3.0 物料准備
1) Maven的依賴
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
2) JDK
Jdk1.8
3) Zookeeper/NacosServer
安裝好Zookeeper或者NacosServer(Ali系的服務發現和治理工具這里面功能很多)
注意:使用NacosServer的用戶需要引入依賴:
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
4.0 整合前的說明
因為網上Dubbo和Zookeeper的整合方式已經很完善了,這里就不過多的渲染,主要說和Nacos的整合。另外考慮到在大多數的情況下企業中的項目結構是這樣的:
dubbo-demo-parent //頂級的POM項目 dubbo-demo-framework-core //模塊依賴 dubbo-demo-service-app1 //真實的應用1 dubbo-demo-service-app2 //真實的應用2
所以我們這次整合主要說一下這樣的一個項目結構下我們怎么做的一次配置多個應用都可以使用,又可以按照自己的應用特點去定制一些參數。
5.0 整合
5.1.0 SpringBoot項目上的通用整合方式
5.1.1 依賴說明
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
5.1.2 配置說明
在application.yml中的服務提供者的配置一般是這樣的
server: port: 8090 dubbo: application: name: shop-boot-console registry: address: nacos://nacos.didispace.com:80 protocol: name: dubbo port: 20881 scan: base-packages: com.shop.console.service.impl
消費者:
server: port: 9099 spring: mvc: date-format: yyyy-MM-dd jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 dubbo: application: name: shop-boot-portal #生產者專有 protocol: name: dubbo port: 20881 #生產者專有 scan: base-packages: com.shop.portal registry: # address: zookeeper://127.0.0.1:2181 address: nacos://nacos.didispace.com:80 consumer: timeout: 5000
5.1.3 使用服務
使用服務就需要聲明服務,所以申明是這樣的:
/** * <p/> * <li>Description: TODO</li> * <li>@author: ChengXiang.Li</li> * <li>Date: 2020/4/14 14:55</li> */ @Service public class SysLoginServiceImpl implements SysLoginService { /** * <li>Description: 管理系統登錄接口 </li> * * @param loginDTO 登錄入參包裝實體 * @return RestfulDTO */ @Override public RestfulDTO login(SysLoginDTO loginDTO) { return null; } /** * <li>Description: 退出登錄 </li> */ @Override public void logout() { }
需要注意的是這個@Service注解不是Spring的而是Dubbo框架給我們提供的。
啟用Dubbo應用的時候一般是在SpringBoot應用的入口類上加@EnableDubbo注解,服務提供者和消費者都需要加的。
消費服務:
@RestController public class SysLoginController { /** * <li>loginService :Dubbo框架的遠程調用-SysLoginService </li> */ @Reference private SysLoginService loginService; /** * <li>Description: 管理系統登錄接口 </li> * * @param loginDTO 登錄接口的入參 * @return RestfulDTO */ @PostMapping(value = "/login") public RestfulDTO login(@RequestBody SysLoginDTO loginDTO) { return loginService.login(loginDTO); } }
@Reference注解也是Dubbo框架為我們提供的。
5.1.4 總結
這個結果就不說了,一個很簡單的Dubbo和SpringBoot的集成,優點是簡單,真的簡單,相對以前的XML的配置方式確實簡單了不少,但是缺點也是非常明顯的,在企業中各個應用服務的配置是基本一致的,也就是說沒有做到一次配置多處使用的目的(程序員都懶),那么有人就會說我們可以使用
配置服務啊。例如SpringCloud的config等,把這些配置全部管理起來就可以實現一次配置多處使用。當然這個方式肯定可行,因為在很多公司都是這樣使用的,但是這不是我們需要說的重點,在很多的中小公司,服務器的硬件資源是很金貴的,可能很多的公司都沒有自己的一站式配置服務。因為沒有
資源,在沒有資源的情況下我們要做一次配置多處服務,這個就是我們想說的事情了。程序員是萬能的。
5.2.0 基於XML的配置集成方式
基於XML的配置方式我們不說,建議以下幾篇文章,寫的都不差。
5.3.0 一次配置多處使用集成方式
5.3.1 物料准備
1) Maven 依賴
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
2) NacosServer服務
附上Dubbo官網上的與Nacos集成說明地址 http://dubbo.apache.org/zh-cn/docs/user/references/registry/nacos.html
NacosServer下載地址:https://github.com/alibaba/nacos/releases
下載完成以后直接解壓然后進入bin目錄點擊startup.cmd運行即可(依賴JDK環境,1.8最好)
5.3.2 新增依賴項目模塊
xxx-xxx-framework-rpc模塊
新增
這樣的幾個注解。
@DubboRegistry注解與下圖配置項等價

代碼:
@Documented @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface DubboRegistry { /** * <li>Description: Dubbo注冊類型,默認注冊到Zookeeper上。現在提供兩種注冊方式(Zookeeper,Nacos) </li> * * @return RegistryType */ RegistryType type() default RegistryType.ZOOKEEPER; /** * <li>Description: 默認的注冊地址 </li> * * @return String */ String address() default "zookeeper://127.0.0.1:2181"; /** * <li>Description: 通訊協議 </li> * * @return String */ String protocol() default "dubbo"; /** * <li>Description: 通訊端口 </li> * * @return int */ int protocolPort() default 21810; }
@EnableDubboApplication注解,主要是為了標注當前應用使用了Dubbo,與下圖這段等價

代碼:
@Documented @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface EnableDubboApplication { String name() default ""; /** * <li>Description: 基礎掃描包 </li> * * @return String */ String scanPackage() default ""; /** * <li>Description: 服務接口的基類 </li> * * @return String */ String parentClass() default ""; /** * <li>Description: 默認的當前聲明應用的全局服務超時時間,5秒 </li> * * @return int */ int timeOut() default 5000; }
