Dubbo 基礎教程


原文地址:Dubbo 基礎教程
博客地址:http://www.extlight.com

一、前言

當服務越來越多時,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需要增加一個調度中心基於訪問壓力實時管理集群容量,提供集群利用率。其中,用於提高機器利用率的資源調度和治理中心是關鍵。

二、Dubbo 簡介

2.1 概念

Dubbo 是阿里巴巴開源項目的一個分布式服務框架。其致力於提供高性能和透明化的 RPC 遠程調用方案,以及 SOA 服務治理方案。

2.2 原理

dubbo 原理圖

調用關系說明:

1) 服務容器啟動、加載和運行服務提供者;
2) 服務提供者在啟動時,向注冊中心注冊自己提供的服務;
3) 服務消費者在啟動時,向注冊中心訂閱自己所需的服務;
4) 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更給消費者;
5) 服務消費者從地址列表中,基於軟負載均衡算法選一台服務提供者進行調用,如果調用失敗再選另一台;
6) 服務消費者和服務提供者在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心。

節點角色說明

節點 角色說明
Container 服務運行容器
Provider 暴露服務的服務提供者
Consumer 調用遠程服務的服務消費者
Registry 服務注冊與發現的注冊中心
Monitor 統計服務的調用此處和調用時間的監控中心

三、快速入門

Dubbo 采用全 Spring 配置方式,透明化接入應用,對應用沒有任何 API 入侵,只需用 Spring 加載 Dubbo 配置即可。

3.1 安裝注冊中心

官方推薦使用 Zookeeper 作為注冊中心,因此本次測試使用 Zookeeper,將其放置在 ip 為 192.168.2.14 的虛擬機上。

# 解壓和轉移目錄
tar -zxvf zookeeper-3.4.8.tar.gz -C /usr/
cd /usr
mv zookeeper-3.4.8 zookeeper

# 設置配置文件
cd /usr/zookeeper/conf
cp zoo_sample.cfg zoo.cfg

# 啟動 zookeeper
/usr/zookeeper/bin/zkServer.sh start

# 查看 zookeeper 運行狀態,如果出現 Mode: standalone 說明運行成功
/usr/zookeeper/bin/zkServer.sh status

3.2 服務提供者

創建一個 Maven 項目(名為 dubbo-service 的 web 項目)。

pom.xml 配置:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.light</groupId>
  <artifactId>dubbo-service</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <dependencies>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-core</artifactId>
  		<version>4.3.10.RELEASE</version>
  	</dependency>
  	<dependency>
	    <groupId>com.alibaba</groupId>
	    <artifactId>dubbo</artifactId>
	    <version>2.6.0</version>
	</dependency>
	<dependency>
		<groupId>com.101tec</groupId>
		<artifactId>zkclient</artifactId>
		<version>0.9</version>
	</dependency>
  </dependencies>
</project>

web.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">

	<display-name>dubbo-service</display-name>
	
	<!-- spring容器 start -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext-dubbo.xml</param-value>
	</context-param>
	<!-- spring容器 end -->
	
</web-app>

接口:

public interface HelloService {

	String sayHello(String name);
}

實現類:

public class HelloServiceImpl implements HelloService {

	@Override
	public String sayHello(String name) {
		return "Hello," + name;
	}

}

applicationContext-dubbo.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="hello-demo"/>
       
    <dubbo:registry address="zookeeper://192.168.2.14:2181"/>
    
    <dubbo:protocol name="dubbo" port="20880"/>
    
    <dubbo:service interface="com.light.dubbo.service.HelloService" ref="helloService"/>
    
    <bean id="helloService" class="com.light.dubbo.service.impl.HelloServiceImpl"/>
    
</beans>

3.3 服務消費者

創建一個 Maven 項目(名為 dubbo-consumer 的 web 項目)。

pom.xml 配置:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.light</groupId>
	<artifactId>dubbo-consumer</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.3.10.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.10.RELEASE</version>
		</dependency>
		<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-databind</artifactId>
		    <version>2.9.3</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.6.0</version>
		</dependency>
		<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.9</version>
		</dependency>
	</dependencies>
</project>

web.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">

	<display-name>dubbo-consumer</display-name>
	
	<!-- spring容器 start -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext-dubbo.xml</param-value>
	</context-param>
	<!-- spring容器 end -->
	
	<!-- springmvc容器 start -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	<!-- springmvc容器 end -->
	
</web-app>

將 dubbo-service 項目中的 HelloService 接口復制到該項目(dubbo-consumer)中。

控制層:

@Controller
public class HelloController {

	@Autowired
	private HelloService helloService;
	
	@RequestMapping("hello")
	@ResponseBody
	public String hello(String name) {
		return this.helloService.sayHello(name);
	}
}

applicationContext-dubbo.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="hello-demo"/>
       
    <dubbo:registry address="zookeeper://192.168.2.14:2181"/>
    
    <dubbo:protocol name="dubbo" port="20880"/>
    
    <dubbo:reference interface="com.light.dubbo.service.HelloService"/>
    
    
</beans>

springmvc.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
						http://www.springframework.org/schema/mvc
						http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
						http://www.springframework.org/schema/context  
       					http://www.springframework.org/schema/context/spring-context-4.0.xsd">
       					
      <!-- 只掃描含有@Controller注解的類 --> 					
      <context:component-scan base-package="com.light.dubbo.controller">
      	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
      </context:component-scan>
      
      <!-- 加載解析 @rquestMapping等注解的解析器 -->
      <mvc:annotation-driven/>
      
</beans>

先啟動服務提供者的項目(8080),再啟動服務消費者的項目(8081)。打開瀏覽器訪問http://localhost:8081/hello?name=jack,結果如下圖:

image

四、監控

4.1 獲取源碼

git clone --branch dubbo-2.6.0 https://github.com/alibaba/dubbo.git

下載完成后使用 IDE 工具引入其子項目 dubbo-sample\dubbo-monitor-sample 進行編譯和打包。打包后會在項目的 target 目錄下生成 dubbo-monitor-simple-2.6.0-assembly.tar.gz 壓縮文件。

4.2 修改配置

  1. 解壓 dubbo-monitor-simple-2.6.0-assembly.tar.gz 壓縮包,修改 dubbo-monitor-simple-2.6.0\conf\dubbo.properties:
dubbo.registry.address=zookeeper://192.168.2.14:2181
  1. 在服務提供者的配置文件中添加:
<!-- 注冊中心自動查找監控服務 -->
<dubbo:monitor protocol="registry"/>

最后啟動 dubbo-monitor-simple-2.6.0\bin\start.bat。打開瀏覽器訪問http://localhost:8080/,效果圖如下:

image

五、管理控制台

Dubbo 提供了一套在線管理服務的管理控制台,該管理控制台為阿里巴巴內部裁減版本,開源部分主要包含:路由規則、動態配置、服務降級、訪問控制、權重調整和負載均衡。

5.1 獲取運行項目

在第四節下載的 duboo 源碼中,通過 IDE 工具引入其子項目 dubbo-admin 進行編譯和打包。
打包后會在項目的 target 目錄下生成 dubbo-admin-2.6.0.war 壓縮文件。

5.2 修改配置

將 dubbo-admin-2.6.0.war 里邊的文件和文件夾復制粘貼到 tomcat 的 ROOT 目錄中並修改 webapps\ROOT\WEB-INF\dubbo.properties 文件內容:

dubbo.registry.address=zookeeper://192.168.2.14:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

其中,配置中設置 2 個用戶:root 和 guest。

最后啟動 tomcat 容器,打開瀏覽器訪問http://localhost:8080/,頁面要求輸入賬號和密碼,登錄后效果圖如下:

image

六、參考資料

Dubbo 官網


免責聲明!

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



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