阿里巴巴分布式服務框架dubbo學習筆記


Dubbo是什么?

Dubbo是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務框架,如果沒有分布式的需求,其實是不需要用的,只有在分布式的時候,才有dubbo這樣的分布式服務框架的需求,並且本質上是個服務調用的東東,說白了就是個遠程服務調用的分布式框架
其核心部分包含:

  1. 遠程通訊: 提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及“請求-響應”模式的信息交換方式。
  2. 集群容錯: 提供基於接口方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集群支持。
  3. 自動發現: 基於注冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
Dubbo能做什么?
  1. 透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。

  2. 軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。

  3. 服務自動注冊與發現,不再需要寫死服務提供方地址,注冊中心基於接口名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。

Dubbo采用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring加載Dubbo的配置即可,Dubbo基於Spring的Schema擴展進行加載。

Dubbo架構圖如下

  • Provider: 暴露服務的服務提供方。

  • Consumer: 調用遠程服務的服務消費方。

  • Registry: 服務注冊與發現的注冊中心。

  • Monitor: 統計服務的調用次調和調用時間的監控中心。

  • Container: 服務運行容器。

調用關系說明:
  1. 服務容器負責啟動,加載,運行服務提供者。

  2. 服務提供者在啟動時,向注冊中心注冊自己提供的服務。

  3. 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。

  4. 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更數據給消費者。

  5. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。

  6. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心。


首先運行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地址:
  1. Demo-provider Git地址
  2. Demo-consumer Git地址

附dubbo-admin安裝方式

安裝Dubbo管理控制台

Dubbo管控台可以對注冊到zookeeper注冊中心的服務或服務消費者進行管理,但管控台是否正常對Dubbo服務沒有影響,管控台也不需要高可用,因此可以單節點部署。

IP: 172.24.51.28
部署容器:apache-tomcat-7.0.57
端口:8080

  1. 下載最新版的Tomcat7:
$wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57.tar.gz
  1. 解壓:
$ tar -zxvf apache-tomcat-7.0.57.tar.gz
$ mv apache-tomcat-7.0.57 dubbo-admin-tomcat
  1. 移除/home/umgsai/dubbo-admin-tomcat/webapps目錄下的所有文件:
$ rm -rf *
  1. 上傳Dubbo管理控制台程序dubbo-admin-2.5.3.war
    到/home/wusc/dubbo-admin-tomcat/webapps

  2. 解壓並把目錄命名為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

  3. 配置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

(以上密碼在正式上生產前要修改)

  1. 防火牆開啟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

  1. 啟動Tomat7
$ /home/wusc/dubbo-admin-tomcat/bin/startup.sh

查看tomcat日志:

tail –f tomcat/logs/catalina.out
  1. 瀏覽http://172.24.51.28:8080/
    默認賬號密碼都是root

  2. 配置部署了Dubbo管控台的Tomcat開機啟動:
    在虛擬主機中編輯/etc/rc.local文件,加入:

su - wusc -c '/home/wusc/dubbo-admin-tomcat/bin/startup.sh'

參考:http://www.cnblogs.com/xujiming/p/5449065.html

http://www.biaodianfu.com/dubbo.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM