1. 程式人生 > >分散式系統_程序間通訊_dubbo使用入門

分散式系統_程序間通訊_dubbo使用入門

Dubbo簡介

DUBBO是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,是阿里巴巴SOA服務化治理方案的核心框架,每天為2,000+個服務提供3,000,000,000+次訪問量支援,並被廣泛應用於阿里巴巴集團的各成員站點。

Dubbo RPC框架不同於一般的RPC框架的地方在於,Dubbo RPC的目的在於實現SOA服務的治理和服務管理。其通過服務註冊中心來發現服務,並通過服務中心來分發服務來實現服務的負載均衡,通過服務發現來解耦服務,使得整個服務能力可以高效地進行擴充套件。

Dubbo使用入門

本章節結合Spring Boot 1.3.12.RELEASE和Dubbo來講解,Dubbo的使用說明。Dubbo RPC的基本結構中包括了,服務提供者和服務消費者。下面分別從服務提供者和服務消費者來說明。

dubbo-provider

基本的程式碼結構說明

dubbo-provider
    src 
      main
        com.egoo
            service
                Demo.java
                DemoImpl.java
            Application.java
      resources
        dubbo
            provider.xml

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.egoo</groupId> <artifactId
>
dubbo-provider</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.7</java.version> <dubbo.version>2.4.10</dubbo.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <!-- RPC --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>1.3.2.RELEASE</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.3.2.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <fork>true</fork> <meminitial>512m</meminitial> <maxmem>1048m</maxmem> </configuration> </plugin> </plugins> </build> </project>

應用配置
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: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="DemoProvider"  />

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

    <!-- 用dubbo協議在20880埠暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <bean id="demoImpl" class="com.egoo.service.DemoImpl" />

    <!-- service -->
    <!--將介面暴露給服務中心-->
    <dubbo:service interface="com.egoo.service.Demo" version="1.0.0" ref="demoImpl"  id="demo" />

</beans>

建立對應的服務

服務介面
package com.egoo.service;

/**
 * Created by fiboliu on 16-5-3.
 */
public interface Demo {

    String greeting(String message);
}
服務實現
package com.egoo.service;

/**
 * Created by fiboliu on 16-5-3.
 */
public class DemoImpl implements Demo {

    public String greeting(String message) {

        return message;
    }
}

Application.java //main function

package com.egoo;

import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ImportResource;

import java.io.IOException;

/**
 * Created by fiboliu on 16-5-3.
 */
@ImportResource({"classpath:dubbo/provider.xml"})
public class Application {

    public static void main(String args[]) {

        SpringApplication.run(Application.class, args);

        try {

            System.out.println("啟動成功,按任意鍵關閉");
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

dubbo-consumer

基本的程式碼結構說明

dubbo-consumer
    src 
      main
        com.egoo
            service
                Demo.java
            Application.java
      resources
        dubbo.properties
        dubbo
            consumer.xml

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.egoo</groupId>
    <artifactId>dubbo-consumer</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.7</java.version>
        <dubbo.version>2.4.10</dubbo.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>

        <!-- RPC -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>1.3.2.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.3.2.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <fork>true</fork>
                    <meminitial>512m</meminitial>
                    <maxmem>1048m</maxmem>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

resources檔案
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="DemoConsumer"  />

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

    <!-- 用dubbo協議在20880埠暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <dubbo:reference id="demo" interface="com.egoo.service.Demo" version="1.0.0" />

</beans>

dubbo.properties

##
# Copyright 1999-2011 Alibaba Group.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##
dubbo.container=log4j,spring
dubbo.application.name=consumer
dubbo.application.owner=egoo
dubbo.registry.address=multicast://224.5.6.7:1234
#dubbo.registry.address=zookeeper://127.0.0.1:2181
#dubbo.registry.address=redis://127.0.0.1:6379
#dubbo.registry.address=dubbo://127.0.0.1:9090
#dubbo.monitor.protocol=registry
dubbo.log4j.file=logs/dubbo-demo-consumer.log
dubbo.log4j.level=WARN

介面檔案(保證和provider介面檔案一致)

package com.egoo.service;

/**
 * Created by fiboliu on 16-5-3.
 */
public interface Demo {

    String greeting(String message);
}

Application.java

package com.egoo;

import com.egoo.service.Demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ImportResource;

/**
 * Created by fiboliu on 16-5-3.
 */
@SpringBootApplication
@ImportResource({"classpath:dubbo/consumer.xml"})
public class Application {

    public static void main(String args[]) {
        ApplicationContext context = SpringApplication.run(Application.class, args);
        Demo demo = (Demo) context.getBean("demo");
        System.out.println(demo.greeting("hello world!!"));
    }

}