Dubbo框架應用之(四)--Dubbo基於Zookeeper實現分佈式實例

      上三篇文章主要是解決了概念性的補充和學習,充分結合實戰來深入理解  


入門實例解析

第一:provider-提供服務和相應的接口


創建DemoService接口

package com.unj.dubbotest.provider;

import java.util.List;

/**
 * 定義服務接口,該接口需要單獨打包,在服務提供方和消費方共享
 * 
 * @author lishehe-2015年6月22日
 *
 */
public interface DemoService {
	/*
	 * sayHello方法
	 */
	String sayHello(String name);

	/*
	 * 獲取用戶信息方法
	 */
	public List getUsers();

}


創建本接口的實現類

package com.unj.dubbotest.provider.impl;

import java.util.ArrayList;
import java.util.List;

import com.unj.dubbotest.provider.DemoService;
/*
 * 實現類DemoServiceImpl-李社河-2015年6月22日
 */
public class DemoServiceImpl implements DemoService {
	//聲明sayHello方法
	public String sayHello(String name) {
		return "Hello " + name;
	}
/**
 * 獲取用戶信息getUsers-李社河-2015年6月22日
 */
	public List getUsers() {
		List list = new ArrayList();
		User u1 = new User();
		//jack信息
		u1.setName("jack");
		u1.setAge(20);
		u1.setSex("m");
		
		//tom信息
		User u2 = new User();
		u2.setName("tom");
		u2.setAge(21);
		u2.setSex("m");

		//rose信息
		User u3 = new User();
		u3.setName("rose");
		u3.setAge(19);
		u3.setSex("w");

		list.add(u1);
		list.add(u2);
		list.add(u3);
		return list;//返回數據集合
	}
}

創建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
        ">
	<!-- 具體的實現bean,李社河 -->
	<bean id="demoService" class="com.unj.dubbotest.provider.impl.DemoServiceImpl" />

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

	<!-- 使用multicast廣播註冊中心暴露服務地址 <dubbo:registry address="multicast://224.5.6.7:1234" 
		/> -->

	<!-- 使用zookeeper註冊中心暴露服務地址 -->
	<dubbo:registry address="zookeeper://127.0.0.1:2181" />

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

	<!-- 聲明需要暴露的服務接口 -->
	<dubbo:service interface="com.unj.dubbotest.provider.DemoService"
		ref="demoService" />

</beans>


創建啓動類

public class Provider {

	public static void main(String[] args) throws Exception {
		//啓動spring容器,把服務器啓動之後註冊到Zookeeper
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "applicationContext.xml" });
		context.start();
		System.in.read(); // 爲保證服務一直開着,利用輸入流的阻塞來模擬
	}
}



創建dubboconsumer(消費者)

 注意 provider項目中的DemoService接口打包demo-service-api.jar放在class path中


創建consumer.xml配置文件


applicationContext.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="hehe_consumer" />

	<!-- 使用zookeeper註冊中心暴露服務地址 -->
	<!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
	<dubbo:registry address="zookeeper://127.0.0.1:2181" />

	<!-- 生成遠程服務代理,可以像使用本地bean一樣使用demoService -->
	<dubbo:reference id="demoService"
		interface="com.unj.dubbotest.provider.DemoService" />

</beans>


創建consumer啓動類

package com.alibaba.dubbo.demo.pp;

import java.util.List;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.unj.dubbotest.provider.DemoService;
/**
 * Consumer執行起始類
 * @author 李社河-2015年6月22日
 *
 */
public class Consumer {

	public static void main(String[] args) throws Exception {
		//初始化Consumer中的spring容器
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "applicationContext.xml" });
		context.start();
		// 獲取遠程服務代理
		DemoService demoService = (DemoService) context.getBean("demoService");
		//執行遠程方法
		String hello = demoService.sayHello("tom");
		//打印信息
		System.out.println(hello);

		//同樣執行遠程方法,打印相關信息
		List list = demoService.getUsers();
		if (list != null && list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				System.out.println(list.get(i));
			}
		}
		System.in.read();// 爲保證服務一直開着,利用輸入流的阻塞來模擬
	}

}

啓動好zookeeper、tomcat之後我們執行運行Provider.class、Consumer.class

成功調到遠程服務-----執行Consumer之後結果



我們在看管理後臺的信息

提供者


消費者



實例升級--Dubbo服務集羣容錯實踐

       手機應用是以聊天室爲基礎的,我們需要收集用戶的操作行爲,然後計算聊天室中在線人數,並實時在手機應用端顯示人數,整個系統的架構如圖所示:


   上圖中,主要包括了兩大主要流程:日誌收集並實時處理流程、調用讀取實時計算結果流程,我們使用基於Dubbo框架開發的服務來提供實時計算結果讀取聊天人數的功能。上圖中,實際上業務接口服務器集羣也可以基於Dubbo框架構建服務,就看我們想要構建什麼樣的系統來滿足我們的需要。

   如果不使用註冊中心,服務消費方也能夠直接調用服務提供方發佈的服務,這樣需要服務提供方將服務地址暴露給服務消費方,而且也無法使用監控中心的功能,這種方式成爲直連。

   如果我們使用註冊中心,服務提供方將服務發佈到註冊中心,而服務消費方可以通過註冊中心訂閱服務,接收服務提供方服務變更通知,這種方式可以隱藏服務提供方的細節,包括服務器地址等敏感信息,而服務消費方只能通過註冊中心來獲取到已註冊的提供方服務,而不能直接跨過註冊中心與服務提供方直接連接。這種方式的好處是還可以使用監控中心服務,能夠對服務的調用情況進行監控分析,還能使用Dubbo服務管理中心,方便管理服務,我們在這裏使用的是這種方式,也推薦使用這種方式。使用註冊中心的Dubbo分佈式服務相關組件結構,如下圖所示:



總結

        層層深入繼續努力吧,隨着項目的進行不斷的和大家分享……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章