1. 程式人生 > >[轉載,感覺寫的非常詳細]DUBBO配置方式詳解

[轉載,感覺寫的非常詳細]DUBBO配置方式詳解

原文連結:http://www.cnblogs.com/chanshuyi/p/5144288.html

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

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

根據 DUBBO 官方文件,配置 DUBBO 有 4 種方式,分別是:

1. XML 配置檔案方式

2. properties 配置檔案方式

3. annotation 配置方式

4. API 配置方式

這裡我們只介紹前兩種方式的配置。

1、XML 配置檔案方式

建立 DubboDemo 專案,並建立 interface 模組、provider 模組、consumer 模組,它們都是 DubboDemo 的子模組。其中 interface 模組存放所有的介面、provider 模組提供服務、consumer 消費服務。建立完成後的專案結構如下:

在 DubboDemo 模組 pom.xml 加入如下依賴,為所有模組提供 JUnit 和 LOG4J 依賴。

複製程式碼
<!-- **************************** Properties 配置 **************************** 
--> <properties> <junit.version>3.8.1</junit.version> </properties> <!-- **************************** /Properties 配置 **************************** --> <dependencies> <!-- **************************** JUnit 依賴 ****************************
--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- **************************** /JUnit 依賴 **************************** --> <!-- **************************** 日誌 依賴 **************************** --> <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.7.6</version> </dependency> <!-- **************************** /日誌 依賴 **************************** --> </dependencies>
複製程式碼

同時在 provider 模組和 consumer 模組的 resources 目錄里加入 log4j.properties 配置檔案:

複製程式碼
#Console Log
log4j.rootLogger=info, console, file

# Write to Console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=INFO
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss}(%F:%L): %m%n

#Write to File
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=${catalina.home}log/provider.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss}(%F:%L): %m%n
複製程式碼

在 interface 模組中建立介面 com.chanshuyi.service.IUserService:

複製程式碼
package com.chanshuyi.service;

/**
 * Created by chanshuyi on 2016/1/19.
 */
public interface IUserService {

    /**
     * 登入方法
     * @return 是否登入成功
     */
    public boolean login(String username, String password);
}
複製程式碼

interface 模組配置完畢。

在 provider 模組中引入 Spring、Dubbo、interface 模組依賴:

複製程式碼
<!-- **************************** Properties 配置 **************************** -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>3.8.1</junit.version>
        <springframework.version>4.1.6.RELEASE</springframework.version>
        <commonsLogging.version>1.2</commonsLogging.version>
    </properties>
    <!-- **************************** /Properties 配置 **************************** -->

    <dependencies>
        <!-- **************************** Spring 依賴 **************************** -->
        <!-- 新增Spring-core包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 新增spring-tx包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- Spring ORM 相關-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 新增spring-jdbc包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!--新增spring-web包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 新增spring-context包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>${commonsLogging.version}</version>
        </dependency>
        <!--新增aspectjweaver包 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.5</version>
        </dependency>
        <!-- **************************** /Spring 依賴 **************************** -->

        <!-- **************************** Dubbo 依賴 **************************** -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.3.3</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!-- **************************** /Dubbo 依賴 **************************** -->

        <!-- **************************** interface 依賴 **************************** -->
        <dependency>
            <groupId>com.chanshuyi.DubboDemo</groupId>
            <artifactId>interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- **************************** /interface 依賴 **************************** -->
    </dependencies>
複製程式碼

建立 com.chanshuyi.service.impl.UserServiceImpl 類,實現 IUserService 介面:

複製程式碼
package com.chanshuyi.service.impl;

import com.chanshuyi.service.IUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * Created by chanshuyi on 2016/1/19.
 */
@Service("userService")
public class UserServiceImpl implements IUserService {

    private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

    @Override
    public boolean login(String username, String password) {
        logger.info("使用者登入:[username:{}, password:{}]", username, password);
        if (username != null && password != null && username.equals(password)) {
            logger.info("使用者校驗通過。[username:{}]", username);
            return true;
        }
        logger.info("使用者校驗失敗![username:{}]", username);
        return false;
    }
}
複製程式碼

建立 Spring 配置檔案,配置註解掃描 com.chanshuyi.service.impl 包,並引入 spring-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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<!-- **************************** 註解掃描 **************************** -->
<context:component-scan base-package="com.chanshuyi.service.impl"/>
<!-- **************************** /註解掃描 **************************** -->

<!-- **************************** 匯入其他XML檔案 **************************** -->
<import resource="spring-provider.xml"/>
<!-- **************************** /匯入其他XML檔案 **************************** -->
</beans>
複製程式碼

注意!這裡不要寫成 com.chanshuyi.service.impl.*  否則無法成功掃描!

建立 spring-provider.xml 檔案,它是 dubbo 的主要配置檔案。

複製程式碼
<?xml version="1.0" encoding="UTF-8"?>
<!-- 新增 DUBBO SCHEMA -->
<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="dubbodemo-provider"/>
    <!-- 連線到哪個本地註冊中心 -->
    <dubbo:registry id="dubbodemo" address="zookeeper://localhost:2181"/>
    <!-- 用dubbo協議在20880埠暴露服務 -->
    <dubbo:protocol name="dubbo" port="28080"/>
    <!-- 宣告需要暴露的服務介面 -->
    <dubbo:service registry="dubbodemo" timeout="3000" interface="com.chanshuyi.service.IUserService" ref="userService"/>
</beans>
複製程式碼

可以看到這裡有幾個關鍵引數:application、registry、protocol、service。application 指當前應用名稱,主要用來給 zookeeper 註冊中心計算應用間依賴關係。registry 用來宣告一個註冊中心,這裡聲明瞭一個id 為 registry 的註冊中心,地址是本地伺服器的 2181 埠(這裡要與 zookeeper 配置檔案的 clientPort 屬性值一致)。protocol 指該應用用 dubbo 協議在 28080 埠暴露服務,其他應用可以通過這個介面呼叫服務。service 用來宣告需要暴露的服務介面,這裡暴露了IUserService 介面,並將介面註冊到 id 為 dubbodemo 的註冊中心,它引用了 Spring 中名為 userService 的類,超時時間為 3 秒。到這裡 provider 提供者的配置基本上完成,但我們還需要寫一個啟動類將 provider 啟動起來提供服務。

建立 com.chanshuyi.util.BeanFactoryUtil.java,是載入 Spring 的工具類:

複製程式碼
package com.chanshuyi.util;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanFactoryUtil {
    private static ApplicationContext ctx_producer = null;

    public final static String ApplicationContextRoot = "";
    public final static String ApplicationContextPath = ApplicationContextRoot + "applicationContext.xml";

    public static void init() {
        if (ctx_producer == null) {
            synchronized (BeanFactoryUtil.class) {
                if(ctx_producer == null){
                    String[] configLocations = new String[]{ApplicationContextPath};
                    ctx_producer = new ClassPathXmlApplicationContext(configLocations);
                }
            }
        }
    }

    public static ApplicationContext getContext() {
        init();
        return ctx_producer;
    }
}
複製程式碼

建立 com.chanshuyi.util.SystemDetails.java,用於輸出系統資訊:

複製程式碼
package com.chanshuyi.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class SystemDetails {
    /**
     * 輸出系統基本資訊
     */
    public static void outputDetails() {
        timeZone();
        currentTime();
        os();
    }

    /**
     * 輸出系統時區
     */
    private static void timeZone() {
        Calendar cal = Calendar.getInstance();
        TimeZone timeZone = cal.getTimeZone();
        System.out.println("系統時區:" + timeZone.getDisplayName());
    }

    /**
     * 輸出系統時間
     */
    private static void currentTime() {
        String fromFormat = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat format = new SimpleDateFormat(fromFormat);
        Date myDate = new Date();
        System.out.println("系統時間:" + format.format(myDate));
    }

    /**
     * 輸出系統基本配置
     */
    private static void os() {
        String osName = System.getProperty("os.name"); //作業系統名稱
        System.out.println("當前系統:" + osName);
        String osArch = System.getProperty("os.arch"); //作業系統構架
        System.out.println("當前系統架構" + osArch);
        String osVersion = System.getProperty("os.version"); //作業系統版本
        System.out.println("當前系統版本:" + osVersion);
    }
}
複製程式碼

建立 com.chanshuyi.Launcher.java,用於啟動 provider 服務,是啟動入口:

複製程式碼
package com.chanshuyi;

import com.chanshuyi.util.BeanFactoryUtil;
import com.chanshuyi.util.SystemDetails;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Launcher {

    private static Log logger = LogFactory.getLog(Launcher.class);

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("=======================");
        System.out.println("        Core包啟動          ");
        SystemDetails.outputDetails();
        System.out.println("=======================");

        getLocalip();
        // 初始化spring
        logger.info("開始初始化core服務");
        BeanFactoryUtil.init();

        try{
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 取得本機ip地址 注意:Spring RmiServiceExporter取得本機ip的方法:InetAddress.getLocalHost()
     */
    private static void getLocalip() {
        try {
            System.out.println("服務暴露的ip: "
                    + java.net.InetAddress.getLocalHost().getHostAddress());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
複製程式碼

到這裡 provider 模組配置結束。我們執行 Launcher.main() 方法啟動服務,並開啟 zookeeper 註冊中心(點選這裡下載,雙擊 bin/zkServer.cmd 執行即可),啟動 provider 服務。

接下來我們編寫 consumer 程式碼。

在 consumer 的 pom.xml 中匯入 Spring、dubbo、interface 模組依賴

複製程式碼
<!-- **************************** Properties 配置 **************************** -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>3.8.1</junit.version>
        <springframework.version>4.1.6.RELEASE</springframework.version>
        <commonsLogging.version>1.2</commonsLogging.version>
    </properties>
    <!-- **************************** /Properties 配置 **************************** -->

    <dependencies>
        <!-- **************************** Spring 依賴 **************************** -->
        <!-- 新增Spring-core包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 新增spring-tx包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- Spring ORM 相關-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 新增spring-jdbc包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!--新增spring-web包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 新增spring-context包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        
            
           

相關推薦

[轉載感覺非常詳細]DUBBO配置方式

原文連結:http://www.cnblogs.com/chanshuyi/p/5144288.html DUBBO 是一個分散式服務框架,致力於提供高效能和透明化的 RPC 遠端服務呼叫方案,是阿里巴巴 SOA 服務化治理方案的核心框架,每天為 2,000+ 個服務提供 3,000,000,000+ 次訪

Dubbo配置檔案

依賴的jar 理論上Dubbo可以只依賴JDK,不依賴於任何三方庫執行,只需配置使用JDK相關實現策略。 預設依賴(系統預設) 通過mvn dependency:tree > dep.log命令(Eclipse或Linux命令列)分析,Dubbo預設依賴以下三

dubbo 配置檔案

<dubbo:service/> 服務配置,用於暴露一個服務,定義服務的元資訊,一個服務可以用多個協議暴露,一個服務也可以註冊到多個註冊中心。eg、<dubbo:service ref="demoService" interface="com.unj.dub

Ribbon的幾種配置方式

文章目錄 Ribbon的自定義配置(java程式碼方式)生效條件 Ribbon的注意事項 0、Ribbon的自定義配置優先順序: 1、自定義配置時,@Configuration和@ComponentScan包不應重疊 2、使用R

無意中找到的一篇關於面試的文章感覺的很好!

“身邊總是存在各種各樣的可能,而自身又具備這樣的能力,就忍不住想試一試。” ---《挪威的森林》 經歷過Honeywell(霍尼維爾)、CA(冠群)、Nortelnetworks(北電網路)、HP(惠普)、RocketSoftware(凌翔創意)和Qilinsoft(麒麟遠創)的面試,也參加過微軟亞洲研究院的

Spring中的JDBCTemplate使用(非常詳細配置過程)

Spring中的JDBCTemplate使用 資料庫準備: 建立資料庫 建立表: Java程式碼: 1、建立web 工程  springJdbcTemplate 2、新增Spring能力 在此需要將jdbc包也同時加入 3、配置上mysql的連線驅動(拷

一份MyBatis-Generator非常詳細配置檔案

今天在簡書中看到一篇非常詳細的MyBatis-Generator配置檔案,帶有非常詳細的註釋說明 在使用MBG工具時可充當參考文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE gener

CentOS7安裝mysql5.7.19的手順步驟(非常詳細

CentOS7安裝mysql5.7.19手順 1.首先確認系統是否已經安裝了mysql或者mariaDB rpm -qa | grep mysql rpm -qa | grep mariaDB 2.如果有相關安裝包,則立即解除安裝 rpm -e --nodeps 安裝包名稱

全網最詳細的Ceph14.2.5叢集部署及配置檔案快來看看吧! -- <2>

部署Ceph叢集 Ceph版本選擇 Ceph版本來源介紹 Ceph 社群最新版本是 14,而 Ceph 12 是市面用的最廣的穩定版本。 第一個 Ceph 版本是 0.1 ,要回溯到 2008 年 1 月。多年來,版本號方案一直沒變,直到 2015 年 4 月 0.94.1 ( Hammer 的第一個修正版)

Linux隨手記 - Linux LVM邏輯卷配置過程 [轉載]

就是 ebo post spa part 查詢 swa google ron 許多Linux使用者安裝操作系統時都會遇到這樣的困境:如何精確評估和分配各個硬盤分區的容量,如果當初評估不準確,一旦系統分區不夠用時可能不得不備份、刪除相關數據,甚至被迫重新規劃分區並重裝操作系統

轉載】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.

轉載:Torch7在Ubuntu下的安裝與配置教程(torch入門使用)

原文;https://www.aliyun.com/jiaocheng/147256.html   摘要:Torch7的本系列教程的主要目的是介紹Torch的入門使用。今天首先分享一下Torch7的安裝。(在Ubuntu14.04安裝torch7)為什麼選擇TorchTo

spring配置檔案--真的蠻詳細

  spring配置檔案詳解--真的蠻詳細 轉自: http://book.51cto.com/art/201004/193743.htm 此處詳細的為我們講解了spring2.5的實現原理,感覺非常有用

Nginx實戰之1.1-1.6 Nginx介紹安裝及配置檔案

1.1 Nginx介紹 HTTP協議發展簡史 加粗  https://coding.net/u/aminglinux/p/nginx/git/blob/master/http/version.md  1991年釋出0.9版,只有GET方法,僅支援html,一個連線一個請求 &n

轉載】SSH伺服器端/etc/ssh/sshd_conf配置檔案

[[email protected] ~]$cat /etc/ssh/sshd_config #Port 22                        

Dubbo配置篇):常用配置總結(配置檔案

1.暴露服務,定義服務資訊 服務配置,用於暴露一個服務,定義服務的元資訊,一個服務可以用多個協議暴露,一個服務也可以註冊到多個註冊中心。 <dubbo:service id="sendSmsSOAService" interface="com.sms.api.service.Sen

java環境變數 的配置(全網最詳細教程)

筆者這學期開始學習java課程,學習java開發首先需要配置java執行環境變數。雖然上課老師也講了如何配置java環境變數,可是筆者的同學還是有好多都不會配置,所以筆者最近配置了特別多次java環境變數。如下筆者詳細解釋從JDK安裝到環境變數的裝配。 目錄

轉載:SpringBoot非官方教程 | 第二篇:Spring Boot配置檔案

springboot採納了建立生產就緒Spring應用程式的觀點。 Spring Boot優先於配置的慣例,旨在讓您儘快啟動和執行。在一般情況下,我們不需要做太多的配置就能夠讓spring boot正常執行。在一些特殊的情況下,我們需要做修改一些配置,或者需要

linux系統下top命令的詳細用法、引數、以及模式配置

用過linux系統的人都知道top命令,它是Linux下一個最常用的效能分析工具,能夠實時顯示系統中各個程序的資源佔用狀況,類似於Windows的工作管理員。 top顯示系統當前的程序和其他狀況,是一個動態顯示過程,即可以通過使用者按鍵來不斷重新整理當前狀態。如果在前臺執行該命令,它

配置nginx方向代理實現URL隱形轉發 (附帶nginx配置檔案)

配置nginx方向代理,實現URL隱形轉發 (附帶nginx配置檔案詳解) 免費領取滿減阿里雲紅包 專案名稱:【域名解析–隱形URL轉發】–centos 7.3 環境: 阿里雲伺服器之上有多個tomcat; tomcat的網站基於ip+埠開發+專案名名稱。 要求