上三篇文章主要是解決了概念性的補充和學習,充分結合實戰來深入理解
入門實例解析
第一: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分佈式服務相關組件結構,如下圖所示:
總結
層層深入繼續努力吧,隨着項目的進行不斷的和大家分享……