Dubbo服務環境搭建以及Dubbo服務的提供者和消費者配置詳解
專案中引入了Dubbo,對外需要提供一個Dubbo的介面服務,編寫了一個demo,在此提供出來,供初學者引用。
主要包括:在spring專案中引入對dubbo的支援,編寫dubbo的provider和consumer,提供一個可測試的小demo。
目標:開發環境中新增對Dubbo的支援,編寫Dubbo服務的提供者和消費者。
環境:Spring4.0, Dubbo2.5.3, Zookeeper3.4.6,maven3.3.9
步驟:
- 獨立建立一個java maven專案,將所有的dubbo服務介面,這裡只是介面以及包含的介面方法放置其中。
類似如下的結構:
app包下放置的就是你自己定義的dubbo介面和介面方法,這裡我寫的一個介面如下:
package yourpackage.app;
/**
* 對外提供傳送簡訊的Dubbo服務
* @author kevin shi
*
*/
public interface ISendMessageService {
void sendMessage(int serialNo, String destAddr_cmcc, String messageContent);
}
我這裡寫了一個傳送短息的dubbo服務,可以呼叫這個介面傳送簡訊,可以把簡訊內容,傳送目標等等作為引數傳遞進來。單獨建立一個專案存放介面是為了開發provider和consumer的時候可以方便以jar包的形式呼叫,因為你的provider或者consumer也許是在單獨的專案中,而且也可能是不同的人編寫。
你可以將這個專案匯出jar包,並上傳到你的私服上供其他的專案開發者下載依賴引用。
- 編寫Dubbo服務的provider:
首先,在專案中加入對Dubbo服務的依賴支援:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>yourpackage.common</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
dubbo和spring融合的依賴引用,zookeeper和client都配置在這裡了,client也許不需要,但是我都配置上了,最後一個是對步驟1中編寫的dubbo-common專案的jar包依賴。
其次,編寫xml配置檔案,可以叫做spring-dubbo-provider.xml,配置你的Dubbo服務的provider,因為有了介面你還需要寫實現類實現這個介面服務提供給consumer:
<!-- 註冊dubbo服務的應用名稱。 -->
<dubbo:application name="dubbo_provider" />
<!-- 此處配置zookeeper註冊中心的服務地址 -->
<dubbo:registry address="zookeeper://10.11.12.13:1001" check="false"/>
<!-- Dubbo服務提供者的服務地址和埠號 -->
<dubbo:protocol host="127.0.0.1" name="dubbo" port="20891"></dubbo:protocol>
<!-- 此處配置服務提供者的介面實現類,yourpackage.ISendMessageService是Dubbo服務的介面路徑,sendMessageService是引用的介面實現類bean的名稱。 -->
<dubbo:service interface="yourpackage.ISendMessageService" ref="sendMessageService" timeout="1200000" />
最後,編寫Dubbo服務提供者的介面實現類:
package yourpackage.common.service.impl;
import org.springframework.stereotype.Service;
import yourpackage.ISendMessageService;
import yourpackage.common.utils.SMSUtil;
@Service("sendMessageService")
public class SendMessageServiceImpl implements ISendMessageService{
@Override
public void sendMessage(int serialNo, String destAddr_cmcc, String messageContent) {
SMSUtil.send(serialNo, destAddr_cmcc, messageContent);
}
}
- 編寫Dubbo服務consumer
首先,編寫xml配置檔案,可以叫做spring-dubbo-consumer.xml,(pom檔案中依賴的引用參考provider的配置),
消費端應該與服務提供端處於不同的專案中,在一個專案中只能提供一個,否則會報錯,但是可以配置多個介面。
<dubbo:application name="dubbo_consumer" />
<dubbo:registry protocol="zookeeper" address="zookeeper://10.11.12.13:1001" />
<dubbo:reference interface="yourpackage.ISendMessageService" id="sendMessageServiceConsumer" url="dubbo://127.0.0.1:20891" timeout="1200000" />
消費端的應用名稱應該與服務提供端的應用名稱不同,這裡是“dubbo_consumer”;
註冊的zookeeper地址名稱與服務提供端相同;
標籤配置的是dubbo服務介面名稱;宣告這個介面對應的引用beanID是“sendMessageServiceConsumer”,在消費端呼叫這個介面時可以直接獲取這個名字;url對應dubbo provider自己宣告的服務地址,也就是對應標籤的內容;
注意此處的timeout必須填寫,否則會造成客戶端連線很快過期而無法呼叫dubbo服務的情況。
其次,編寫consumer的呼叫程式碼(此處簡單呼叫):
package yourpackage.common.service;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import yourpackage.ISendMessageService;
public class SendMessageServiceConsumerImpl {
public static void handleSendMessage() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "spring-dubbo-consumer.xml" });
context.start();
ISendMessageService sendService = (ISendMessageService) context.getBean("sendMessageServiceConsumer"); //這裡對應配置檔案中宣告的beanId
sendService.sendMessage(12345, "2222222", "3333333");
}
public static void main(String[] args) {
SendMessageServiceConsumerImpl.handleSendMessage();
}
}
ok,一切就緒,我們可以在藉助tomcat啟動Dubbo服務的provider後,執行consumer的main函式,即可呼叫到provider的介面實現類,從而可以進行後續功能擴充套件和測試。
謝謝你能看到這裡,如有錯誤請批評指正,也可以給我留言談到其他問題。