Dubbo初體驗:遠程服務調用和管控臺的搭建

hellodubbo_logo

Dubbo是一個阿里巴巴的分佈式服務框架。雖然在很久以前阿里停止更新了,但是還是有很多公司在使用它。Dubbo致力於提供高性能和透明化的RPC遠程服務調用方案以及SOA服務治理方案。通過他我們可以非常容易地通過Dubbo來構建分佈式服務。哦,對了。好像最近阿里又開始更新了。

Dubbo的架構

hellodubbo_1
調用關係說明:

  • 服務容器負責啓動,加載,運行服務提供者。
  • 服務提供者在啓動時,向註冊中心註冊自己提供的服務。
  • 服務消費者在啓動時,向註冊中心訂閱自己所需的服務。
  • 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
  • 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
  • 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。


    這張圖和這段話你可能已經見過無數次了,但是我還是把它從官網複製了過來。原因就是這張圖能很簡潔的說麼Dubbo的調用關係。如果你還沒有使用過Dubbo,那這張圖可以很快幫你理順調用關係。

Hello Dubbo

我們在使用過程中一般是採用XML配置,原因就是簡單方便。在使用之前我們需要搭建Dubbo的註冊中心。官方推薦的註冊中心是zookeeper。如果你還沒有搭建好zookeeper,那麼可以看看我之前寫的小白從頭到腳搭建zookeeper集羣的過程
1.Dubbo依賴
如果你使用的是Maven項目,在使用Dubbo的地方加入下面的依賴即可:

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>dubbo</artifactId>
	<exclusions>
		<exclusion>
			<groupId>org.springframework</groupId>
			<artifactId>spring</artifactId>
		</exclusion>
		<exclusion>
			<groupId>org.jboss.netty</groupId>
			<artifactId>netty</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>org.apache.zookeeper</groupId>
	<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
	<groupId>com.github.sgroschupf</groupId>
	<artifactId>zkclient</artifactId>
</dependency>

2.生產者
首先展示生產者的接口,很簡單的兩個方法。

public interface SampleService {

	String sayHello(String name);
	
}

生產者的實現類:

public class SampleServiceImpl implements SampleService {
	
	public String sayHello(String name) {
		return "Hello " + name;
	}

}

User類的話就是name、age、sex三個屬性。

接下來就是生產者的Spring配置:

<?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
        ">

	<!-- 具體的實現bean -->
	<bean id="sampleService" class="top.catalinali.sample.provider.impl.SampleServiceImpl" />

	<!-- 提供方應用信息,用於計算依賴關係 -->
	<dubbo:application name="sample-provider" />

	<!-- 使用zookeeper註冊中心暴露服務地址 -->
	<dubbo:registry address="zookeeper://192.168.71.121:2181?backup=192.168.71.122:2181,192.168.71.123:2181" />

	<!-- 用dubbo協議在20880端口暴露服務 -->
	<dubbo:protocol name="dubbo" port="20880" />

	<!-- 聲明需要暴露的服務接口  寫操作可以設置retries=0 避免重複調用SOA服務 -->
	<dubbo:service retries="0" interface="top.catalinali.sample.provider.SampleService" ref="sampleService" />

</beans>

3.消費者
首先消費者需要一個跟生產一模一樣的接口類

public interface SampleService {

	String sayHello(String name);

}

消費者配置

<?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="sample-consumer" />

	<dubbo:registry address="zookeeper://192.168.71.121:2181?backup=192.168.71.122:2181,192.168.71.123:2181" />

	<!-- 生成遠程服務代理,可以像使用本地bean一樣使用demoService 檢查級聯依賴關係 默認爲true 當有依賴服務的時候,需要根據需求進行設置 -->
	<dubbo:reference id="sampleService" check="false"
		interface="top.catalinali.sample.provider.SampleService" />

</beans>

Dubbo啓動

首先我們先啓動生產者啓動:

public class Provider {

	public static void main(String[] args) throws Exception {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "sample-provider.xml" });
		context.start(); 
		System.in.read(); // 爲保證服務一直開着,利用輸入流的阻塞來模擬
	}
}

啓動消費者

public class Consumer {

	public static void main(String[] args) throws Exception {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "sample-consumer.xml" });
		context.start();
			
		SampleService sampleService = (SampleService) context.getBean("sampleService");
		String hello = sampleService.sayHello("tom");
		System.out.println(hello);
		
		System.in.read();
	}

}

結果
hellodubbo_2
項目結構圖
hellodubbo_3

Dubbo的管控臺

Dubbo管控臺搭建其實很容易,我們只需要一個在linux上的tomcat跑Dubbo即可,需要的環境:

  • apache-tomcat-7.0.29.tar.gz
  • dubbo-admin-2.5.4.war

1.安裝tomcat
使用tar -zxvf apache-tomcat-7.0.29.tar.gz解壓tar包
2.解壓dubbo的war包
使用unzip dubbo-admin-2.5.3.war -d dubbo-admin解壓dubbo-admin-2.5.4.war到tomcat目錄下的webapps下。如果提示無unzip命令,使用yum安裝yum install -y unzip zip此命令
注意:
如果zookeeper註冊中心不在此服務器上,則需要打開dubbo-admin/WEB-INF/dubbo.properties文件,將紅框改註冊中心的ip地址。
hellodubbo_5
3.運行tomcat
①進入tomcat下的bin目錄下,執行./startup.sh腳本。
②使用tail -f ../logs/catalina.out查看日誌。
hellodubbo_6
③進入*http://192.168.71.121:8080/dubbo-admin/*就可以看到管控臺了(IP地址改成你的服務器ip)
hellodubbo_7
也可以看到我們剛纔所運行的服務
hellodubbo_8


本文作者: catalinaLi
本文鏈接: http://catalinali.top/2017/helloDubbo/
版權聲明: 原創文章,有問題請評論中留言。非商業轉載請註明作者及出處。

發佈了34 篇原創文章 · 獲贊 14 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章