1. 程式人生 > >dubbo學習之路

dubbo學習之路

學習Dubbo

剛剛學習了Thrift,趁熱打鐵繼續學習下Dubbo,也是先從認識開始,由於有了昨天對RPC遠端呼叫的基礎,理解起來還是比較快速的,看了其他各位大神的教程自己也嘗試寫了個Demo,雖然不懂原理上的東西,至少會用了。記錄下自己學習Dubbo的過程

Dubbo是什麼

Dubbo是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案。Dubbo包括三個核心部分:遠端通訊、叢集容錯、自動發現(都是文件上總結的,其實原理是什麼我也不懂)

Dubbo可以做什麼

Dubbo可以實現透明化的遠端方法呼叫,就像呼叫本地方法一樣呼叫遠端方法,只需簡單配置,沒有任何API侵入。
服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於介面名查詢服務提供者的IP地址,並且能夠平滑新增或刪除服務提供者。

Dubbo的節點角色

    Provider: 暴露服務的服務提供方。
    Consumer: 呼叫遠端服務的服務使用方。
    Registry: 服務註冊與發現的註冊中心。
    Monitor: 統計服務的呼叫次調和呼叫時間的監控中心。
    Container: 服務執行容器。  

Dubbo的啟動過程

看了許多文件,自己也嘗試理解了下Dubbo的工作過程
Dubbo主要分為服務提供方和服務使用方,介面對兩者透明,其中,介面實現對服務使用方隱藏。服務使用方只需要根據自己的需要從註冊機上找到服務提供方註冊的服務使用即可
1、服務提供方啟動,向註冊中心註冊IP地址以及埠號
2、服務提供方向註冊中心訂閱註冊服務
3、服務使用方啟動,根據介面協議向註冊中心訂閱服務提供方註冊的服務,註冊中心會將存貨的服務告訴服務使用方,並且,當有註冊的服務發生變化時,通知服務使用方
4、服務使用方根據需要,從拿到的可用服務中選擇呼叫的服務,發起呼叫

第一個demo的建立過程

先貼出我的Demo專案結構

服務提供方(伺服器)

伺服器專案程式碼

服務使用方(客戶端)

客戶端專案程式碼

建立服務提供方

專案為maven專案,pom.xml檔案太長,作為附件上傳

建立服務提供方的介面

IHelloString.java
package com.demo.service;

    public interface IHelloString {
            /**
             * 實現將傳入的字串逆向輸出
             * @param str
             * @return
            */
public String reverseString(String str); }

建立介面的實現

HelloStringImpl.java
package com.demo.service.impl;

import com.demo.service.IHelloString;

public class HelloStringImpl implements IHelloString {

        public String reverseString(String str) {
            StringBuffer sb=new StringBuffer();
            for (int i = str.length()-1; i >=0; i--) {
                sb.append(str.charAt(i));
            }
            String res=sb.toString();
            return res;
        }

}

建立主程式

Main.java
package com.demo.app;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
        public static void main(String[] args) throws Exception {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
            new String[] { "applicationProvider.xml" });
            context.start();
            System.out.println("按任意鍵退出");
            System.in.read();
        }
}

配置檔案部分

applicationProvider.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-world" />

<!-- 使用zookeeper註冊,需要在本地配置zookeeper,目前不會,採用下面的 -->
<!-- 
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<dubbo:protocol name="dubbo" port="20880" />  -->

<!-- 這裡使用multicast廣播註冊中心暴露服務地址 -->
<dubbo:registry address="multicast://224.0.0.1:9090" />

<!-- 和本地服務一樣實現遠端服務 -->
<bean id="stringService" class="com.demo.service.impl.HelloStringImpl" />

<!-- 在這裡宣告需要暴露的服務介面 -->
<dubbo:service interface="com.demo.service.IHelloString " ref="stringService" executes="10" />

</beans>

建立服務使用方(客戶端)

建立客戶端物件

Consumer.java
package com.demo.consumer;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.demo.service.IHelloString;
import com.demo.service.IProcessData;

public class Consumer {

    public void reverseString(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
        new String[] { "applicationConsumer.xml" });
        context.start();
        IHelloString stringService = (IHelloString) context.getBean("stringService");         
        System.out.println(stringService.reverseString("hello world"));     
    }
}

建立測試程式

AppTest.java
package com.demo.test;

import com.demo.consumer.Consumer;

public class AppTest {
    public static void main(String[] args) {
        Consumer consumer = new Consumer();
        consumer.reverseString();
    }
}

客戶端的配置檔案

applicationConsumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://code.alibabatech.com/schema/dubbo 

http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">

    <!-- 服務使用方應用名,用於計算依賴關係,不是匹配條件,不要和提供方一樣,以免造成不必要的麻煩  -->  
    <dubbo:application name="consumer-of-helloworld-app" />

    <!-- 不使用zookeeper註冊,因為暫時不會 -->
    <!-- <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> -->
    <!-- 使用multicast廣播註冊中心暴露服務地址,這裡額地址要與提供方一樣 -->
    <dubbo:registry address="multicast://224.0.0.1:9090" />
    <dubbo:consumer timeout="5" />
    <!-- 生成遠端服務代理,和本地bean一樣使用stringService -->
    <dubbo:reference id="stringService" interface="cn.zto.service.IHelloString" />
</beans>

首先執行Main.java,然後執行AppTest.java,看到客戶端控制檯輸出結果則表示構建的Demo成功

中途遇到的問題

遇到解析不了XML檔案的錯誤SAXException
解決方案:
1、在maven的本地倉庫下找到
maven->com->alibaba->dubbo->2.5.3->dubbo-2.5.3.jar (具體的看自己的本地倉庫) 解壓它獲得dubbo.xsd檔案
2、然後開啟Eclipse:1. Window->Preferences->XML->XML Catalog->User Specified Entries視窗中,選擇Add 按紐
3、location為.xsd檔案所在位置,根據自己的實際情況看
4、修改key值和配置檔案的http://code.alibabatech.com/schema/dubbo/dubbo.xsd 相同

附上客戶端和伺服器端的pom.xml檔案

伺服器端的pom.xml

pom.xml
<?xml version="1.0" ?>
<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.dubbo</groupId>
    <artifactId>dubbo-Service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>dubbo-Service</name>
    <url>http:</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.18.1-GA</version>
            </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.15</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>jms</artifactId>
                    <groupId>javax.jms</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>mail</artifactId>
                    <groupId>javax.mail</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>        
            <groupId>org.springframework</groupId>
            <artifactId>spring</artifactId>
            <version>2.5.6.SEC03</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.6</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.5</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.4</version>
        </dependency>
    </dependencies>
</project>

客戶端的pom.xml檔案

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>demo.dubbo.consume</groupId>
    <artifactId>dubbo-Consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-Consumer</name>
    <url>http:</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.18.1-GA</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.15</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>jms</artifactId>
                    <groupId>javax.jms</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>mail</artifactId>
                    <groupId>javax.mail</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring</artifactId>
            <version>2.5.6.SEC03</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.6</version>
            </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>com.github.adyliu</groupId>
            <artifactId>zkclient</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.5</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>com.dubbo</groupId>
            <artifactId>dubbo-Service</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>