Dubbo是什么?
Dubbo是一個分布式服務框架,致力于提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地松耦合)。從服務模型的角度來看,Dubbo采用的是一種非常簡單的模型,要么是提供方提供服務,要么是消費方消費服務,所以基于這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。
Dubbo能做什么?
透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
服務自動注冊與發(fā)現(xiàn),不再需要寫死服務提供方地址,注冊中心基于接口名查詢服務提供者的IP地址,并且能夠平滑添加或刪除服務提供者。
Dubbo架構
節(jié)點角色說明:
· **Provider: **暴露服務的服務提供方。
· **Consumer: **調用遠程服務的服務消費方。
· **Registry: **服務注冊與發(fā)現(xiàn)的注冊中心。
· **Monitor: **統(tǒng)計服務的調用次調和調用時間的監(jiān)控中心。
· **Container: **服務運行容器。
調用關系說明:
- 服務容器負責啟動,加載,運行服務提供者。
- 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
- 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
- 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者。
- 服務消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
- 服務消費者和提供者,在內存中累計調用次數(shù)和調用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。
Dubbo提供了很多協(xié)議,Dubbo協(xié)議、RMI協(xié)議、Hessian協(xié)議,Dubbo源代碼有各種協(xié)議的實現(xiàn),我們之前沒用Dubbo之前時,大部分都用Hessian來使用我們服務的暴露和調用,利用HessianProxyFactory調用遠程接口。
Dubbo與Zookeeper、SpringMVC整合使用
安裝Zookeeper
文檔:http://idealmine.iteye.com/blog/2307762
或:http://www.lxweimin.com/p/0ba61bf7149f
Zookeeper作為Dubbo服務的注冊中心,Dubbo原先基于數(shù)據(jù)庫的注冊中心,沒采用Zookeeper,Zookeeper一個分布式的服務框架,是樹型的目錄服務的數(shù)據(jù)存儲,能做到集群管理數(shù)據(jù) ,這里能很好的作為Dubbo服務的注冊中心,Dubbo能與Zookeeper做到集群部署,當提供者出現(xiàn)斷電等異常停機時,Zookeeper注冊中心能自動刪除提供者信息,當提供者重啟時,能自動恢復注冊數(shù)據(jù)-
配置dubbo-admin的管理頁面
(1)下載dubbo-admin-2.x.war,或到github下載源碼自己編譯生成war,部署在tomcat的webapps/ROOT下
(2)然后到webapps/ROOT/WEB-INF下,有一個dubbo.properties文件,里面指向Zookeeper ,使用的是Zookeeper 的注冊中心
properties.png
(3) 然后啟動tomcat服務,用戶名和密碼:root,并訪問服務,顯示登陸頁面,說明dubbo-admin部署成功
index.png
注:啟動失敗報錯create bean失敗,有可能是jdk版本與(war的編譯環(huán)境jdk版本)不一致造成 -
SpringMVC與Dubbo的整合
項目結構如下
code.png
說明:
(1)dubbo-demo-api項目加入了一個服務接口
package com.ideal.dubbo;
/**
* @author ideal
* @since 16/6/28.
*/
public interface DemoService {
String sayHello(String name);
}
(2)dubbo-demo-provider:服務提供者,pom依賴api
在服務提供方實現(xiàn)接口:
package com.ideal.dubbo.provider;
import com.ideal.dubbo.DemoService;
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "Hello " + name;
}
}
用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-4.1.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 具體的實現(xiàn)bean -->
<bean id="demoService" class="com.ideal.dubbo.provider.DemoServiceImpl"/>
<!-- 提供方應用信息,用于計算依賴關系 -->
<dubbo:application name="ideal-dubbo-demo-provider"/>
<!-- 使用multicast廣播注冊中心暴露服務地址 -->
<!--<dubbo:registry address="multicast://224.5.6.7:1234"/>-->
<!-- 使用zookeeper注冊中心暴露服務地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 用dubbo協(xié)議在20880端口暴露服務 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 聲明需要暴露的服務接口 -->
<dubbo:service interface="com.ideal.dubbo.DemoService" ref="demoService"/>
</beans>
加載Spring配置啟動服務提供者:
package com.ideal.dubbo.provider;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author ideal
* @since 16/6/28.
*/
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"conf/app-conf.xml"});
context.start();
System.out.println("start");
System.in.read(); // 按任意鍵退出
}
}
(3)dubbo-demo-consumer:服務消費者,pom依賴api
用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-4.1.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供方應用信息,用于計算依賴關系 -->
<dubbo:application name="ideal-dubbo-demo-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.ideal.dubbo.DemoService"/>
</beans>
**(4)運行main方法啟動服務者與消費者,進入dubbo管理頁面