背景( #) 隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)站應(yīng)用的規(guī)模不斷擴(kuò)大,常規(guī)的垂直應(yīng)用架構(gòu)已無(wú)法應(yīng)對(duì),分布式服務(wù)架構(gòu)以及流動(dòng)計(jì)算架構(gòu)勢(shì)在必行,亟需一個(gè)治理系統(tǒng)確保架構(gòu)有條不紊的演進(jìn)。
需求( #)
在大規(guī)模服務(wù)化之前,應(yīng)用可能只是通過(guò)RMI或Hessian等工具,簡(jiǎn)單的暴露和引用遠(yuǎn)程服務(wù),通過(guò)配置服務(wù)的URL地址進(jìn)行調(diào)用,通過(guò)F5等硬件進(jìn)行負(fù)載均衡。 (1) 當(dāng)服務(wù)越來(lái)越多時(shí),服務(wù)URL配置管理變得非常困難,F(xiàn)5硬件負(fù)載均衡器的單點(diǎn)壓力也越來(lái)越大。 此時(shí)需要一個(gè)服務(wù)注冊(cè)中心,動(dòng)態(tài)的注冊(cè)和發(fā)現(xiàn)服務(wù),使服務(wù)的位置透明。 并通過(guò)在消費(fèi)方獲取服務(wù)提供方地址列表,實(shí)現(xiàn)軟負(fù)載均衡和Failover,降低對(duì)F5硬件負(fù)載均衡器的依賴(lài),也能減少部分成本。 (2) 當(dāng)進(jìn)一步發(fā)展,服務(wù)間依賴(lài)關(guān)系變得錯(cuò)蹤復(fù)雜,甚至分不清哪個(gè)應(yīng)用要在哪個(gè)應(yīng)用之前啟動(dòng),架構(gòu)師都不能完整的描述應(yīng)用的架構(gòu)關(guān)系。 這時(shí),需要自動(dòng)畫(huà)出應(yīng)用間的依賴(lài)關(guān)系圖,以幫助架構(gòu)師理清理關(guān)系。 (3) 接著,服務(wù)的調(diào)用量越來(lái)越大,服務(wù)的容量問(wèn)題就暴露出來(lái),這個(gè)服務(wù)需要多少機(jī)器支撐?什么時(shí)候該加機(jī)器? 為了解決這些問(wèn)題,第一步,要將服務(wù)現(xiàn)在每天的調(diào)用量,響應(yīng)時(shí)間,都統(tǒng)計(jì)出來(lái),作為容量規(guī)劃的參考指標(biāo)。 其次,要可以動(dòng)態(tài)調(diào)整權(quán)重,在線(xiàn)上,將某臺(tái)機(jī)器的權(quán)重一直加大,并在加大的過(guò)程中記錄響應(yīng)時(shí)間的變化,直到響應(yīng)時(shí)間到達(dá)閥值,記錄此時(shí)的訪(fǎng)問(wèn)量,再以此訪(fǎng)問(wèn)量乘以機(jī)器數(shù)反推總?cè)萘俊?/p> 以上是Dubbo最基本的幾個(gè)需求,更多服務(wù)治理問(wèn)題參見(jiàn): http://code./blog/experience_1402/service-governance-process.html 架構(gòu)( #)
節(jié)點(diǎn)角色說(shuō)明:
調(diào)用關(guān)系說(shuō)明:
(1) 連通性:
(2) 健狀性:
(3) 伸縮性:
(4) 升級(jí)性:
安裝一、本地服務(wù)
1、定義服務(wù)接口: (該接口需單獨(dú)打包,在服務(wù)提供方和消費(fèi)方共享)
public interface CustomerService { public String getName(); }2、在服務(wù)提供方實(shí)現(xiàn)接口:(對(duì)服務(wù)消費(fèi)方隱藏實(shí)現(xiàn)) public class CustomerServiceImpl implements CustomerService{ @Override public String getName() { System.out.print("我打印"); return "打印結(jié)果"; } }3、然后引入dubbo的幾個(gè)包 dubbo-2.5.3.jar
log4j.jar
netty-3.5.7.Final.jar
slf4j.jar
slf4j-log4j.jar
zkclient.jar
zookeeper.jar
4、用Spring配置聲明暴露服務(wù):
新建applicationProvider.xml,配置內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www./schema/beans" xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:dubbo="http://code./schema/dubbo" xsi:schemaLocation="http://www./schema/beans http://www./schema/beans/spring-beans.xsd http://code./schema/dubbo http://code./schema/dubbo/dubbo.xsd "> <!-- 具體的實(shí)現(xiàn)bean --> <bean id="demoService" class="com.jinbin.service.customer.CustomerServiceImpl" /> <!-- 提供方應(yīng)用信息,用于計(jì)算依賴(lài)關(guān)系 --> <dubbo:application name="xixi_provider" /> <!-- 使用multicast廣播注冊(cè)中心暴露服務(wù)地址 <dubbo:registry address="multicast://localhost:1234" />--> <!-- 使用zookeeper注冊(cè)中心暴露服務(wù)地址 --> <dubbo:registry address="zookeeper://192.168.1.3:2181" /> <!-- 用dubbo協(xié)議在20880端口暴露服務(wù) --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 聲明需要暴露的服務(wù)接口 --> <dubbo:service interface="com.jinbin.service.customer.CustomerService" ref="demoService" /> </beans> 我這里暴露服務(wù)器的地址交由zookeeper來(lái)管理的,使用者首先先要安裝zookeeper應(yīng)用才能使用此功能,相關(guān)安裝步驟請(qǐng)參看相關(guān)博文
5、加載Spring配置,并調(diào)用遠(yuǎn)程服務(wù):(也可以使用IoC注入)
public class DubooProvider { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( new String[]{"applicationProvider.xml"}); context.start(); System.out.println("Press any key to exit."); try { System.in.read(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 并且啟動(dòng),使其進(jìn)入啟動(dòng)狀態(tài)。 以上為服務(wù)器提供者的完整步驟,功能接口都已經(jīng)寫(xiě)好,下面我們就開(kāi)始怎么遠(yuǎn)程調(diào)用
二、服務(wù)消費(fèi)者
1、新建個(gè)配置文件applicationConsumer.xml,內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www./schema/beans" xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:dubbo="http://code./schema/dubbo" xsi:schemaLocation="http://www./schema/beans http://www./schema/beans/spring-beans.xsd http://code./schema/dubbo http://code./schema/dubbo/dubbo.xsd "> <!-- 消費(fèi)方應(yīng)用名,用于計(jì)算依賴(lài)關(guān)系,不是匹配條件,不要與提供方一樣 --> <dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用multicast廣播注冊(cè)中心暴露發(fā)現(xiàn)服務(wù)地址 --> <dubbo:registry protocol="zookeeper" address="zookeeper://192.168.1.3:2181" /> <!-- 生成遠(yuǎn)程服務(wù)代理,可以和本地bean一樣使用demoService --> <dubbo:reference id="demoService" interface="com.jinbin.service.customer.CustomerService" /> </beans> 為了在web中使用,我們?cè)趙eb.xml中配置在spring啟動(dòng)讀取過(guò)程中
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/application.xml /WEB-INF/applicationConsumer.xml</param-value> </context-param> 2、接口調(diào)用 調(diào)用過(guò)程很簡(jiǎn)單,先把接口文件打成jar包,然后在此工程中進(jìn)行引用
在springmvc調(diào)用程序如下:
@Autowired CustomerService demoService ; @RequestMapping(value="duboo1") public void duboo1(){ demoService.getName(); } 即可執(zhí)行成功 三、dubbo-admin的使用
下載dubbo-admin-2.5.3.war
將其放到tomcat下面,配置dubbo.properties,
dubbo.properties
啟動(dòng):
打開(kāi),直接訪(fǎng)問(wèn)首頁(yè)如下:
服務(wù)提供者頁(yè)面
服務(wù)消費(fèi)者頁(yè)面
服務(wù)應(yīng)用頁(yè)面
添加路由規(guī)則頁(yè)面
添加動(dòng)態(tài)配置頁(yè)面
作者:songjinbin 發(fā)表于2014-5-18 20:14:31 原文鏈接
閱讀:53 評(píng)論:0 查看評(píng)論
|
|