阿里巴巴分散式服務框架dubbo學習筆記
Dubbo是什麼?
Dubbo是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務框架,如果沒有分散式的需求,其實是不需要用的,只有在分散式的時候,才有dubbo這樣的分散式服務框架的需求,並且本質上是個服務呼叫的東東,說白了就是個遠端服務呼叫的分散式框架
其核心部分包含:
- 遠端通訊: 提供對多種基於長連線的NIO框架抽象封裝,包括多種執行緒模型,序列化,以及“請求-響應”模式的資訊交換方式。
- 叢集容錯: 提供基於介面方法的透明遠端過程呼叫,包括多協議支援,以及軟負載均衡,失敗容錯,地址路由,動態配置等叢集支援。
- 自動發現: 基於註冊中心目錄服務,使服務消費方能動態的查詢服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
Dubbo能做什麼?
- 透明化的遠端方法呼叫,就像呼叫本地方法一樣呼叫遠端方法,只需簡單配置,沒有任何API侵入。
軟負載均衡及容錯機制,可在內網替代F5等硬體負載均衡器,降低成本,減少單點。
服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於介面名查詢服務提供者的IP地址,並且能夠平滑新增或刪除服務提供者。
Dubbo採用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring載入Dubbo的配置即可,Dubbo基於Spring的Schema擴充套件進行載入。
Dubbo架構圖如下
Provider: 暴露服務的服務提供方。
Consumer: 呼叫遠端服務的服務消費方。
Registry: 服務註冊與發現的註冊中心。
Monitor: 統計服務的呼叫次調和呼叫時間的監控中心。
Container: 服務執行容器。
呼叫關係說明:
服務容器負責啟動,載入,執行服務提供者。
服務提供者在啟動時,向註冊中心註冊自己提供的服務。
服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。
服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。
服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心。
首先執行zookeeper,IP地址為172.24.51.28,埠為2181.
服務提供者Provider目錄結構如下:
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String username;
private String password;
//...
}
//API介面
public interface UserService {
public User getUser();
}
//API介面實現類
public class UserServiceImpl implements UserService {
@Override
public User getUser() {
System.out.println("UserServiceImpl.getUser() invoked...");
User user = new User();
user.setId(10);
user.setUsername("admin");
user.setPassword("123456");
System.out.println("Return:" + user);
return user;
}
}
public class Provider {
private static final Log logger = LogFactory.getLog(Provider.class);
public static void main(String[] args) {
try {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:provider.xml");
context.start();
} catch (Exception e) {
logger.error("== Provider context start error:",e);
}
synchronized (Provider.class) {
while (true) {
try {
Provider.class.wait();
} catch (InterruptedException e) {
logger.error("== synchronized error:",e);
}
}
}
}
/*
* Dubbo服務的執行方式
1.使用Servlet容易執行(Tomcat Jetty等) 不可取
缺點:增加複雜性(埠、管理) 浪費資源(記憶體)
2.自建Main方法類來執行(Spring容器) 不建議(本地除錯可用)
缺點:Dubbo本身提供的高階特性沒用上,自己編寫的啟動類可能有缺陷
3.使用Dubbo框架提供的Main方法類來執行(Spring容器) 建議使用
優點:框架本身提供(com.alibaba.dubbo.container.Main)
可實現優雅關機(ShutdownHook)
注意點:spring-context.xml <import resource="classpath:spring/spring-xxx.xml"/>
*/
}
配置檔案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">
<!-- 提供方應用資訊,用於計算依賴關係 -->
<dubbo:application name="demo-provider" />
<!-- 使用zookeeper註冊中心暴露服務地址 -->
<dubbo:registry protocol="zookeeper" address="172.24.51.28:2181" />
<!-- 用dubbo協議在20880埠暴露服務 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 使用者服務介面 -->
<dubbo:service interface="com.demo.service.UserService" ref="userService" />
<bean id="userService" class="com.demo.service.impl.UserServiceImpl"/>
</beans>
執行Provider即可在zookeeper註冊中心註冊服務,在dubbo-admin中可以檢視服務。
服務者詳情如下:
服務消費者Consumer目錄結構如下:
//User UserService均從jar包中引入
public class Consumer {
public static void main(String[] args) throws InterruptedException {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:consumer.xml");
UserService userService = (UserService)applicationContext.getBean("userService");
User user = userService.getUser();
System.out.println(user);
Thread.sleep(100000);
}
}
配置檔案consumer.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="demo-consumer"/>
<!--zookeeper註冊中心 -->
<dubbo:registry protocol="zookeeper" address="172.24.51.28:2181" />
<!--使用multicast廣播註冊中心暴露的服務地址 -->
<!--<dubbo:registryaddress="multicast://10.57.41.19:1234" /> -->
<!-- 生成遠端服務代理,可以和本地bean一樣使用demoService-->
<dubbo:reference id="userService" interface="com.demo.service.UserService" />
</beans>
Consumer中設定了100s的休眠,執行Consumer即可在zookeeper註冊中心獲取註冊的服務,在dubbo-admin中可以檢視消費者情況。
消費者詳情如下:
當執行新的Provider例項時,會在dubbo-admin中看到新新增的服務者。執行新的Consumer例項時也可以在dubbo-admin中看到新的消費者。
附GIT地址:
附dubbo-admin安裝方式
安裝Dubbo管理控制檯
Dubbo管控臺可以對註冊到zookeeper註冊中心的服務或服務消費者進行管理,但管控臺是否正常對Dubbo服務沒有影響,管控臺也不需要高可用,因此可以單節點部署。
IP: 172.24.51.28
部署容器:apache-tomcat-7.0.57
埠:8080
下載最新版的Tomcat7:
$wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57.tar.gz
解壓:
$ tar -zxvf apache-tomcat-7.0.57.tar.gz $ mv apache-tomcat-7.0.57 dubbo-admin-tomcat
移除/home/umgsai/dubbo-admin-tomcat/webapps目錄下的所有檔案:
$ rm -rf *
上傳Dubbo管理控制檯程式dubbo-admin-2.5.3.war
到/home/wusc/dubbo-admin-tomcat/webapps解壓並把目錄命名為ROOT:
$ unzip dubbo-admin-2.5.3.war -d ROOT
把dubbo-admin-2.5.3.war移到/home/wusc/tools目錄備份
$ mv dubbo-admin-2.5.3.war /home/umgsai/tools配置dubbo.properties:
$ vi ROOT/WEB-INF/dubbo.properties
dubbo.registry.address=zookeeper://172.24.51.28:2181 dubbo.admin.root.password=root dubbo.admin.guest.password=guest
(以上密碼在正式上生產前要修改)
防火牆開啟8080埠,用root使用者修改/etc/sysconfig/iptables,
vi /etc/sysconfig/iptables
增加:
dubbo-admin-tomcat:8080 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
重啟防火牆:
service iptables restart啟動Tomat7
$ /home/wusc/dubbo-admin-tomcat/bin/startup.sh
檢視tomcat日誌:
tail –f tomcat/logs/catalina.out
瀏覽http://172.24.51.28:8080/
預設賬號密碼都是root配置部署了Dubbo管控臺的Tomcat開機啟動:
在虛擬主機中編輯/etc/rc.local檔案,加入:su - wusc -c '/home/wusc/dubbo-admin-tomcat/bin/startup.sh'