分散式Dubbo快速入門

来源:https://www.cnblogs.com/SimpleWu/archive/2018/10/10/9769797.html
-Advertisement-
Play Games

[TOC] Dubbo入門 Editor:SimpleWu Dubbo是 阿裡巴巴公司開源的一個高性能優秀的服務框架使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和 Spring框架無縫集成。 背景 隨著互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架 ...


目錄

Dubbo入門

Editor:SimpleWu

Dubbo是 阿裡巴巴公司開源的一個高性能優秀的服務框架使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和 Spring框架無縫集成。

背景

隨著互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。

單一應用架構

當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。此時,用於簡化增刪改查工作量的數據訪問框架(ORM)是關鍵。

垂直應用架構

當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。

分散式服務架構

當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提高業務復用及整合的分散式服務框架(RPC)是關鍵。

流動計算架構

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

zookeeper安裝

官方網站

http://zookeeper.apache.org/

下載地址

http://mirrors.hust.edu.cn/apache/zookeeper/

下載好我們解壓出來直接啟動bin目錄下zkServer.bat是不行的,我們暫時將zoo_sample.cfg改成zoo.cfg然後就可以正常啟動了,啟動後我們可以看到預設的埠2181到時候我們的Dubbo就調用這個埠

發佈Dubbo服務

Dubbo下載地址

https://github.com/apache/incubator-dubbo

下載後我們參照裡面的Demo先來搞一個provider。(dubbo-provider)

1.打開eclipse新建一個maven工程(先配置個阿裡雲鏡像,否則本地沒有超級慢)
<!--  配置阿裡雲  -->
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
 </mirror>
2.POM.XML中添加依賴
<dependencies>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.10</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.46</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
    </dependency>
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.0.35.Final</version>
    </dependency>
</dependencies>

3.添加服務介面,實現服務

package com.miya.dubbo.service;
/**
 * 服務提供者介面
 * @author SimpleWu
 *
 */
public interface MyProviderService {
    public String sayHello(String name);
}

實現介面

package com.miya.dubbo.service.impl;
import com.miya.dubbo.service.MyProviderService;
/**
 * 服務提供者介面實現類
 * @author SimpleWu
 *
 */
public class MyProviderServiceImpl implements MyProviderService {

    @Override
    public String sayHello(String name) {
        return "服務1 : MyProviderServiceImpl 。。 sayHello ";
    }
}

4.在resources資源文件夾中添加dubbo-provider.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 提供方應用名稱,用於計算依賴關係 -->
    <dubbo:application name="demo-provider" />
    
    <!-- 使用zookeeper註冊中心暴露服務地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    
    <!-- 使用dubbo協議,在20880埠暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880"/>
    
    <!-- service實現類作為本地的一個bean -->
    <bean id="myProviderService" class="com.miya.dubbo.service.impl.MyProviderServiceImpl"/>
    
    <!-- 聲明需要暴露的服務介面 -->
    <dubbo:service interface="com.miya.dubbo.service.MyProviderService" ref="myProviderService"/>
</beans>
5.創建測試類發佈服務

發佈服務之前需要先啟動zookeeper,啟動後圖示:

創建測試類發佈服務

public static void main(String[] args){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "dubbo-provider.xml" });
        context.start();
        System.out.println("服務提供者向zookeeper中心註冊服務成功 暴露的埠為:20880");
        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

發佈後圖示:

如果看到我們的服務介面後就說明服務發佈成功!

Dubbo Admin管理

1.首先在Dubbo目錄裡面找到dubbo-admin將他打成WAR包不能帶項目路徑

我們需要將WAR包發佈到Tomcat裡面最好獨立運行,我們將Tomcat wepapps下的ROOT全部刪掉將WAR包解壓到裡面,然後啟動Tomcat(必須先開啟我們的zookeeper),我們直接訪問localhost:8080會彈出:

預設的賬號root密碼root登陸

我們可以看到這個頁面

我們可以在這裡管理我們的服務

目前我們點擊服務是沒有查詢到服務的,我們將我們之前的那個服務運行發佈上去可以看到

我們可以點擊服務名進去管理我們的服務

在這裡可以對應的去操作我們的服務,註意我們的服務就是在20880埠暴露的,這裡我們的服務也是20880說明我們的服務成功發佈。

消費Dubbo服務

創建一個maven項目(dubbo-consumer)開啟消費者:

1.POM.XML導入依賴
<dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.46</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.0.35.Final</version>
        </dependency>
</dependencies>
2.創建消費者介面
package com.miya.dubbo.service;
/**
 * 服務提供者介面
 * @author SimpleWu
 *
 */
public interface MyProviderService {
    public String sayHello(String name);
}
3.在resources下創建消費者配置文件(dubbo-consumer.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 消費方應用名稱,用於計算依賴關係,不是匹配條件,不要與提供方名稱一樣  -->
    <dubbo:application name="demo-consumer"/>

    <!-- 使用zookeeper註冊中心暴露服務地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

    <!-- 生成遠程服務代理,可以與本地bean一樣使用  check屬性,啟動時候是否檢查 一般設置成false 啟動時候不檢查 -->
    <dubbo:reference id="myProviderService" check="false" interface="com.miya.dubbo.service.MyProviderService"/>

</beans>
4.創建消費者測試類
package com.miya.dubbo.test;

import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.miya.dubbo.service.MyProviderService;

public class ConsumerTest {
    public static void main(String[] args) {
        //讀取消費者配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo-consumer.xml"});
        context.start();
        //獲取消費實例
        MyProviderService demoProviderService=(MyProviderService) context.getBean("myProviderService");
        String result=demoProviderService.sayHello("Miya");
        System.out.println("遠程調用的結果:"+result);
        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
        context.close();
    }
}
5.開始消費

打開zookeeper-->Tomcat發佈Dubbo Admin管理中心-->啟動消費者測試程式

我們可以看到消費者已經有了,圖示:

抽取與依賴版本管理

抽取

在前面兩個項目中我們會發現兩個項目中有兩個相同的介面(MyProviderServiceImpl.java),這樣是不好的,我們現在參照官方demo來創建一個maven工程(dubbo-api)

我們將介面我們將這個介面放到api這個項目中去,然後將dubbo-consumer,dubbo-provider這兩個工程中的介面刪掉,這個時候我們這兩個項目會報錯因為找不到這個介面,我們可以將這兩個項目添加依賴:

<dependency>
    <groupId>com.miya</groupId>
    <artifactId>dubbo-api</artifactId>
</dependency>

我們只要依賴dubbo-api就可以獲取到了嗎?

依賴版本統一管理

我們在dubbo-consumer,dubbo-provider這兩個工程中會發現POM.xml中的版本號,如果我們需要修改版本要一個一個去修改有兩個工程不是要改兩次?那誇張以點,一萬不是得改半條命?

這個時候我們還是創建一個maven工程(dubbo-parent),這個工程Packaging我們選擇POM,這個項目負責版本統一。首先我們抽取相同的依賴,然後給他們定義統一的版本管理方式。

<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.miya</groupId>
    <artifactId>dubbo-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <!-- 依賴版本管理 -->
    <properties>
        <dubbo-api.version>0.0.1-SNAPSHOT</dubbo-api.version>
        <dubbo.version>2.6.0</dubbo.version>
        <zkclient.version>0.10</zkclient.version>
        <curator-framework.version>4.0.1</curator-framework.version>
        <fastjson.version>1.2.46</fastjson.version>
        <log4j.version>1.2.17</log4j.version>
        <slf4j-api.version>1.7.25</slf4j-api.version>
        <commons-lang3.version>3.4</commons-lang3.version>
        <netty-all.version>4.0.35.Final</netty-all.version>
    </properties>

    <!--依賴管理 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.miya</groupId>
                <artifactId>dubbo-api</artifactId>
                <version>${dubbo-api.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
            </dependency>
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>${zkclient.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-framework</artifactId>
                <version>${curator-framework.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>${slf4j-api.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>${commons-lang3.version}</version>
            </dependency>
            <dependency>
                <groupId>io.netty</groupId>
                <artifactId>netty-all</artifactId>
                <version>${netty-all.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • springboot多數據源配置,代碼如下 配置文件 application.properties 測試代碼如下 在運行的時候會出現如下異常問題,運行失敗,報出java.lang.IllegalArgumentException: jdbcUrl is required with driverCla ...
  • 1.Comparable介面 這個介面顧名思義就是用於排序的,如果要對某些對象進行排序,那麼該對象所在的類必須實現 Comparabld介面。Comparable介面只有一個方法CompareTo(),這個方法可以看做是指定的排序規則。 內置類已經實現了CompareTo方法,例如long 小於返回 ...
  • 關於出現 idclass mapping 運行錯誤 @IdClass 註釋通常用於定義包含複合鍵id的Class。即多個屬性的關鍵複合。 @IdClass(CountrylanguageEntityPK.class) 則CountrylanguageEntityPK如下所示: 使用註解 @IdCla ...
  • 題目: Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would sta ...
  • 8、redis集群怎麼做 1、Redis集群提供了以下兩個好處1、將數據自動切分(split)到多個節點2、當集群中的某一個節點故障時,redis還可以繼續處理客戶端的請求。2、集群的方案: redis-cluster集群,採用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接 ...
  • 主要內容來自中文版的同名教程 "Go語言之旅" 其目的為總結要點 包,函數和變數 包 import 語法,多個用括弧換行擴起,包之間不需要間隔符,用引號引起 go import ( "fmt" "math/rand" ) // 官方認為分組導入比多個導入更好 // 用 引用包內對象,僅有首字母大寫的 ...
  • 引言 - 一切才剛剛開始 structc 是 C 結構基礎庫. 簡單有態度. structc - https://github.com/wangzhione/structc 之前推過幾次 structc, 沒什麼效果. 這次乘著最近加班不多, 來詳細解說哈 structc 的思考初衷. 0.0 整體 ...
  • 示例: 什麼是對象  《JAVA編程思想》對於對象的定義是:將問題空間中的元素以及它們在方案空間的表示物稱作“對象”。  1. 問題空間:實際解決的問題模型;  2. 方案空間: 電腦(機器模型)。  實際的問題在電腦(機器模型)中的表示稱為對象。在上面示 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...