前言
這篇文章主要從搭建Dubbo程序開發(fā)所需環(huán)境森逮、編寫Dubbo服務器和客戶端稠茂、構建并運行我的第一款Dubbo應用程序三個方面來記錄Dubbo學習的第二篇文章。
配置開發(fā)環(huán)境
要編譯和運行本片文章相關代碼叮盘,會使用JDK和Maven這兩個工具课舍,其他工具都是輔助性的。
下載并安裝JDK
首先檢查系統(tǒng)是否已經安裝好了JDK谐宙,在終端輸入命令:
java -version
終端打印如下信息烫葬,則可以會略JDK安裝(已成功安裝):
否則,可以用在 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
中下載最新的JDK8.注意:下載時候需要針對自己的操作系統(tǒng)去下載。
windowns平臺下需要做一些手動配置搭综,可以參考 windows開發(fā)環(huán)境搭建手冊
下載并安裝IDE
下面是當前比較流行的IDE工具下載地址垢箕,可以免費獲取這些工具:
(1)Intellij IDEA : www.jetbrains.com
(2)Eclipse:www.eclipse.org
(3)NetBeans:www.netbeans.org
(4)visual Studio Code:www.visualstudio.micresoft.com
這里推薦Intellij IDEA,因為IDEA的功能非常齊全兑巾。
下載并配置Maven
可以在 http://maven.apache.org/
中下載Maven舰讹。和配置JDK一樣簡單,首先下載的Maven解壓縮到任意目錄闪朱,我們稱為【安裝目錄】,在【安裝目錄】中包含類似apache-maven-x.x.x 的文件夾钻洒。
然后我們可以參考一下操作進行環(huán)境變量的配置:
Mac/Linux系統(tǒng):
(1)將環(huán)境變量M2_HOME 指向【安裝目錄】/apache-maven-x.x.x奋姿。
(2)將$M2_HOME/bin添加到可執(zhí)行路徑,方便在中斷執(zhí)行Maven命令素标。
Windows系統(tǒng):
(1)將環(huán)境變量M2_HOME指向【安裝目錄】/apache-maven-x.x.x称诗。
(2)將%M2_HOME%\bin添加到可執(zhí)行路徑,方便在終端執(zhí)行Maven命令头遭。
比如我的是解壓到/usr/local下:
maven環(huán)境變量配置:
中斷輸入 mvn -v
驗證maven是否安裝配置正常寓免,正常情況打印如下信息:
下載并配置Zookeeper
盡管Zookeeper不是必需的,但是在生產環(huán)境中已經大量使用Zookeeper作為Dubbo注冊中心计维。為了深入理解Dubbo袜香,這里給出配置單機Zookeeper的步驟,方便本地啟動Dubbo鲫惶。在 http://mirrors.shu.cn/apache/zookeeper/
中下載最新的版本蜈首。
以3.5.6版本為例:
(1)加壓縮apache-zookeeper-3.5.6.tar.gz 文件到任意目錄(這里我還是選用/usr/local下)。
(2)將環(huán)境變量ZOOKEEPER_HOME指定【安裝目錄】/apache-zookeeper-3.5.6
(3)將${ZOOKEEPER_HOME}/bin 添加到可執(zhí)行路徑欠母,方便在終端執(zhí)行ZK命令欢策。
在【安裝目錄】\apache-zookeeper-3.5.6\conf 中復制一份zoo_sample.cfg 并重命名為zoo.cfg, 然后在終端執(zhí)行 zkServer.sh start
即可,默認會監(jiān)聽 2181 端口赏淌。
解壓目錄:
Zookeeper環(huán)境變量配置:
啟動Zookeeper:
使用IDEA調試Dubbo源碼
1. 下載源碼
這里下載最新版本的2.7.4.1踩寇,首先登陸并訪問GitHub https://github.com/apache/dubbo
, 可選擇git或者Zip包任一下載方式:
使用Git的話,先選擇指定目錄六水,執(zhí)行Git clone命令俺孙,等待工程下載完畢即可:
git clone https://github.com/apache/dubbo.git
2.導入工程
將工程導入IDE,導入后結構如下:
下面對幾個核心模塊做進一步說明缩擂,可以對比我的上一篇文章Dubbo學習(一):什么是Dubbo
中的Dubbo分層一起理解下:
3.安裝dubbo admin
方法1鼠冕、解壓后,根目錄里存在dubbo-admin胯盯,進入 mvn package -Dmaven.test.skip=true
安裝完后懈费,生成target目錄,進入這個目錄博脑,找到dubbo-admin這個目錄憎乙,把這個目錄全部copy到tomcat的目錄webapps下的ROOT下面(刪除tomcat webapps目錄下ROOT原有內容)
方法2票罐、解壓后,根目錄里存在dubbo-admin泞边,進入 mvn install -Dmaven.test.skip=true
安裝完后该押,生成target目錄,進入這個目錄阵谚,找到dubbo-admin.war蚕礼,把這個war包copy到tomcat的目錄webapps下的ROOT下面(刪除tomcat webapps目錄下ROOT原有內容),然后使用jar xvf dubbo-admin.war解壓war包梢什,把解壓后的內容全部放到ROOT目錄下
啟動tomcat奠蹬,就可以看到dubbo-admin的界面,默認帳號密碼root/root
啟動tomcat方法:進入目錄/home/admin/apache-tomcat-8.5.24/bin嗡午,然后執(zhí)行
./startup.sh
4.代碼調試
如果只是想進行一個簡單的Dubbo調用演示囤躁,那么我們可以使用dubbo-demo模塊,該模塊可以演示一個完整的消費者調用服務提供者的過程荔睹。
首先需要啟動dubbo-demo-provider,然后啟動dubbo-demo-consumer,直接運行對應模塊的main方法即可狸演。由于Demo使用的是廣播模式,所以需要先啟動Provider僻他。此時Consumer不斷的調用Provider的com.alibaba.dubbo.demo.DemoService#sayHello,這里剛安裝了Zookeeper宵距,所以我想順便測試一下ZK是否連接正常,我將dubbo-provider和dubbo-consumer的配置修改為發(fā)布訂閱的方式中姜,配置我的ZK地址消玄。
Consumer消費控制臺打印結果如下:
同時我的Dubbo Admin可以看到這個新注冊的服務信息:
實現我的第一個Dubbo程序
Dubbo實現的方式有多種:基于XML配置、基于注解方式丢胚、基于API實現翩瓜。
這里我將以XML實現為例演示,其他方式實現原理一樣的携龟,感興趣可以去了解下兔跌,示例很簡單:服務器會接收到客戶端發(fā)來的消息,然后將消息不做任何處理返回給客戶端峡蟋。
所有的Dubbo服務接口都可以直接通過配置對外暴露坟桅,但用戶不需要額外編寫服務暴露的代碼,因為這些都被Dubbo框架隱藏了蕊蝗,用于減低框架的使用門檻仅乓,我們只需要專注一下內容:
(1)關注業(yè)務場景,編寫面向接口的業(yè)務代碼
(2)少量的啟動配置蓬戚,比如配置中心和暴露的協(xié)議等
說明:為了便于演示和理解夸楣,這里我使用SpringBoot分別搭建兩個應用dubbo-provider與dubbo-consumer來演示這個服務注冊與發(fā)現的流程,也能加深對Dubbo的理解。spring boot應用快速搭建及配置可參考我的這篇文章: SPRINGBOOT基礎豫喧、亮點及輕松搭建SPRINGBOOT項目
基于XML實現
Dubbo框架時面向接口的RPC調用框架石洗,需要提供一個新的接口來作為服務暴露的使用,該接口會響應傳入的消息紧显。
首先需要引入dubbo讲衫、zookeeper相關依賴到Spring Boot的pom.xml:
<!--dubbo 依賴 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- zookeeper client依賴 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
修改配置application.properties:
spring.application.name=dubbo-provider
server.port=8088
zookeeper.hosts=zookeeper://遠程或者本地ZK地址:2181
比如,首先我需要在dubbo-provider項目中聲明并暴露一個MessageXMLService.java的接口:
接口定義:
package com.dubbo.dubboprovider.service;
/**
* @Author: 王琦 <QQ.Eamil>1124602935@qq.com</QQ.Eamil>
* @Date: 2019-11-1 0001 0:28
* @Description: 無描述信息
*/
public interface MessageXMLService {
String message(String msg);
}
實現類:
package com.dubbo.dubboprovider.service.impl;
import com.dubbo.dubboprovider.service.MessageXMLService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @Author: 王琦 <QQ.Eamil>1124602935@qq.com</QQ.Eamil>
* @Date: 2019-11-1 0001 0:28
* @Description: 無描述信息
*/
public class MessageXMLServiceImpl implements MessageXMLService {
private static final Logger LOGGER = LoggerFactory.getLogger(MessageXMLServiceImpl.class);
@Override
public String message(String msg) {
LOGGER.info("dubbo provider receive message: {}", msg);
return msg+": 嘻嘻嘻";
}
}
resource下創(chuàng)建一個spring文件夾,在spring文件夾下創(chuàng)建dubbo-provider.xml,內容:
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 服務提供方應用名稱孵班,方便于依賴跟蹤 -->
<dubbo:application name="dubbo-provider"/>
<!-- 使用遠程的Zookeeper作為注冊中心 -->
<dubbo:registry address="${zookeeper.hosts}"/>
<!-- 只用Dubbo協(xié)議并且指定監(jiān)聽20880端口 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 通過XML方式吧實現配置為Bean涉兽, 讓Spring托管和實例化 -->
<bean id="messageXMLService" class="com.dubbo.dubboprovider.service.MessageXMLServiceImpl"/>
<!-- 聲明要暴露的服務 -->
<!-- 聲明要暴露的服務 -->
<dubbo:service interface="com.dubbo.dubboprovider.service.MessageXMLService" ref="messageXMLService" version="0.0.1"/>
</beans>
修改springBoot啟動類,引入XML配置:
package com.dubbo.dubboprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
// 引入配置
@ImportResource("classpath:spring/dubbo-provider.xml")
@SpringBootApplication
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
dubbo-consumer:
- 同樣需要引入上面的dubbo有zookeeper依賴篙程,同時需要引入provider client的jar依賴花椭。
2.編寫一個Controller,依賴MessageXMLService:
@RestController
@RequestMapping("/api")
public class ConsumerController {
@Autowired
MessageXMLService messageXMLService;
@GetMapping("/send/{msg}")
public String send(@PathVariable String msg){
return messageXMLService.message(msg);
}
}
3.配置dubbo-consumer.xml:
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 服務提供方應用名稱房午,方便于依賴跟蹤 -->
<dubbo:application name="dubbo-provider"/>
<!-- 使用遠程的Zookeeper作為注冊中心 -->
<dubbo:registry address="${zookeeper.hosts}"/>
<!-- 只用Dubbo協(xié)議并且指定監(jiān)聽20880端口 -->
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:reference id="messageXMLService" interface="com.dubbo.dubboprovider.service.MessageXMLService"
version="0.0.1" timeout="5000" check="false"/>
</beans>
測試結果:
總結
這篇文章主要從搭建Dubbo程序開發(fā)所需環(huán)境、Dubbo Admin搭建丹允,編寫Dubbo服務器和客戶端郭厌、構建并運行我的第一款基于XML配置實現的dubbo服務。
更多個人博客雕蔽,歡迎訪問我的個人博客網:Tec博客