1. 程式人生 > 其它 >Dubbo框架學習筆記

Dubbo框架學習筆記

Dubbo介紹

Dubbo是什麼?

Dubbo 是阿里巴巴公司開源的一個高效能優秀的服務框架,使得應用可通過高效能的 RPC 實現服務的輸出和輸入功能,可以和 Spring 框架無縫整合。
Dubbo是一款高效能、輕量級的開源 Java RPC 框架,它提供了三大核心能力:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現。

RPC是什麼

RPC(Remote Procedure Call)是指遠端過程呼叫,是一種程序間通訊方式,它是一種技術的思想,而不是規範。即允許伺服器A通過網路呼叫伺服器B上的過程或函式

Dubbo架構

Dubbo架構圖(Dubbo官方提供)如下:

節點角色說明:

節點 角色名稱
服務提供者(Provider) 暴露服務的服務提供方
服務消費者(Consumer) 呼叫遠端服務的服務消費方
註冊中心(Registry) 服務註冊與發現的註冊中心
監控中心(Monitor) 統計服務的呼叫次數和呼叫時間的監控中心
容器(Container) 服務執行容器

虛線都是非同步訪問,實線都是同步訪問 藍色虛線:在啟動時完成的功能 紅色虛線(實線)都是程式執行過程中執行的功能

呼叫關係說明

  1. 服務容器負責啟動,載入,執行服務提供者
  2. 服務提供者在啟動時,向註冊中心註冊自己提供的服務
  3. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務
  4. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者
  5. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫
  6. 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心

服務註冊中心Zookeeper

通過前面的Dubbo架構圖可以看到,Registry(服務註冊中心)在其中起著至關重要的作用。Dubbo官
方推薦使用Zookeeper作為服務註冊中心。

Zookeeper的介紹

Zookeeper 是一個分散式的,開放原始碼的分散式應用程式協調服務,是 Google 的 Chubby 一個開源的實現,是 Hadoop 和 Hbase 的重要元件。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、名字服務、分散式同步、組服務等。

Linux 安裝 Zookeeper

下載地址:http://archive.apache.org/dist/zookeeper/
安裝步驟:

  • 第一步:安裝 jdk(略)
  • 第二步:把 Zookeeper 的壓縮包(zookeeper-3.4.6.tar.gz)上傳到 linux 系統
  • 第三步:解壓縮壓縮包 tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local/
  • 第四步:進入zookeeper-3.4.6目錄,建立data目錄 mkdir data
  • 第五步:進入conf目錄 ,把 zoo_sample.cfg 改名為 zoo.cfg
cd conf
mv zoo_sample.cfg zoo.cfg
  • 第六步:開啟zoo.cfg檔案, 修改data屬性:dataDir=/usr/local/zookeeper 3.4.6/data

Dubbo快速入門

服務提供方開發

  1. 建立maven工程(打包方式為war)dubbo_provider,在 pom.xml 檔案中匯入如下座標
 <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring.version>5.0.5.RELEASE</spring.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- dubbo相關 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.7</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.1.GA</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定埠 -->
                    <port>8081</port>
                    <!-- 請求路徑 -->
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
  1. 配置 web.xml 檔案
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:dubbo-provider.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>
  1. 建立服務介面
public interface TestService {
    String hello(String name);
}
  1. 建立服務實現類
@Service
public class TestServiceImpl implements TestService {
    @Override
    public String hello(String name) {
        return "Hello," + name;
    }
}

注意:服務實現類上使用的Service註解是Dubbo提供的,用於對外發布服務

  1. 在 src/main/resources 下建立 dubbo-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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 當前應用名稱,用於註冊中心計算應用間依賴關係,注意:消費者和提供者應用名不要一樣 -->
    <dubbo:application name="dubbo_provider" />
    <!-- 連線服務註冊中心zookeeper ip為zookeeper所在伺服器的ip地址-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <!-- 掃描指定包,加入@Service註解的類會被髮布為服務 -->
    <dubbo:annotation package="com.fgba.service.impl" />
    <!-- 註冊 協議和port -->
    <dubbo:protocol name="dubbo" port="20880" />
</beans>
  1. 啟動服務

    tomcat7:run

服務消費方開發

  1. 建立 maven 工程(打包方式為 war)dubbo_consumer,pom.xml 配置和上面服務提供者相同,只需要將 Tomcat 外掛的埠號改為8082即可

  2. 配置web.xml檔案

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

   <servlet>
       <servlet-name>springmvc</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!-- 指定載入的配置檔案 ,通過引數contextConfigLocation載入 -->
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:dubbo-consumer.xml</param-value>
       </init-param>
   </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

  1. 將服務提供者工程中的 TestService 介面複製到當前工程

  2. 編寫 Controller

@Controller
@RequestMapping("/test")
public class TestController {
    @Reference
    private TestService testService;

    @RequestMapping("/hello")
    @ResponseBody
    public String getName(String name){
        //遠端呼叫
        String result = testService.hello(name);
        System.out.println(result);
        return result;
    }
}

注意:Controller中注入TestService使用的是Dubbo提供的@Reference註解

  1. 在 src/main/resources 下建立 dubbo-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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 當前應用名稱,用於註冊中心計算應用間依賴關係,注意:消費者和提供者應用名不要一樣 -->
    <dubbo:application name="dubbo-consumer" />
    <!-- 連線服務註冊中心zookeeper ip為zookeeper所在伺服器的ip地址-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <!-- 掃描的方式暴露介面 -->
    <dubbo:annotation package="com.fgba.controller" />
    <!--  掃描@Controller註解  -->
    <context:component-scan base-package="com.fgba.controller" />

</beans>
  1. 執行測試

    tomcat7:run 啟動

    在瀏覽器輸入http://localhost:8082/test/hello?name=Jack,檢視瀏覽器輸出結果

Dubbo管理控制檯

我們在開發時,需要知道Zookeeper註冊中心都註冊了哪些服務,有哪些消費者來消費這些服務。我們 可以通過部署一個管理中心來實現。其實管理中心就是一個web應用,部署到tomcat即可

安裝步驟

  1. 將 dubbo-admin-2.6.0.war 檔案複製到 tomcat 的 webapps 目錄下

  2. 啟動 tomcat,此 war 檔案會自動解壓

  3. 修改 WEB-INF 下的 dubbo.properties 檔案,注意 dubbo.registry.address 對應的值需要對應當前使用的 Zookeeper 的 ip 地址和埠號

    dubbo.registry.address=zookeeper://localhost:2181
    dubbo.admin.root.password=root
    dubbo.admin.guest.password=guest 
    
  4. 重啟tomcat

使用步驟

  1. 訪問 http://localhost:8080/dubbo-admin-2.6.0/ ,輸入使用者名稱(root)和密碼(root)
  1. 啟動服務提供者工程和服務消費者工程,可以在檢視到對應的資訊

總結

Dubbo 是一個服務框架,其作用是將不同伺服器上的服務進行整合,所以一般應用於分散式環境下。它在分散式環境下通過網路完成各個模組之間的呼叫,通過註冊中心來管理服務提供方和服務消費方。