bjsxt學習筆記:Dubbo的最基礎使用

来源:https://www.cnblogs.com/xl-fu/archive/2019/11/09/11827940.html
-Advertisement-
Play Games

一、Dubbo誕生背景(摘自Dubbo官網-入門-背景) 二、Dubbo架構圖(摘自Dubbo官網-入門-架構) 三、Dubbo核心依賴(jar包):dubbo、zkclient 四、Dubbo項目搭建的方式:配置文件式、註解式 五、Dubbo項目配置文件的核心配置: (一)配置文件式 1. 服務提 ...


一、Dubbo誕生背景(摘自Dubbo官網-入門-背景

二、Dubbo架構圖(摘自Dubbo官網-入門-架構

三、Dubbo核心依賴(jar包):dubbo、zkclient

四、Dubbo項目搭建的方式:配置文件式、註解式

五、Dubbo項目配置文件的核心配置:

  (一)配置文件式

    1. 服務提供方(下示例):①應用名②協議(建議dubbo協議)③註冊中心④暴露的具體服務介面⑤註冊暴露的具體服務介面的實現類bean對象

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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="provide-xml"/>
    <!--配置協議(用dubbo協議在20880埠(dubbo協議預設埠)暴露服務)-->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!--配置註冊中心,以暴露服務地址-->
    <dubbo:registry address="zookeeper://192.168.110.11:2181"/>
    <!--配置暴露服務的介面-->
    <dubbo:service interface="com.bjsxt.dubbo.service.ITPService_xml" ref="dataServiceImpl"/>
    <!--註冊暴露的服務介面的實現類的bean對象-->
    <bean id="dataServiceImpl" class="com.bjsxt.dubbo.service.impl.ITPServiceImpl_xml"/>
</beans>

    2. 服務消費方(下示例):①應用名②註冊中心③要調用的提供方所暴露的具體服務介面

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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="consumer-xml"></dubbo:application>
    <!--配置註冊中心,暴露發現服務地址-->
    <dubbo:registry address="zookeeper://192.168.110.11:2181"/>
    <!--聲明所要調用的服務提供方暴露的服務介面(前提:已經將該介面複製到消費方的業務層中)-->
    <dubbo:reference interface="com.bjsxt.dubbo.service.ITPService_xml" id="iTPService"/>
</beans>

  (二)註解式

    1. 服務提供方(下示例):①應用名②協議③註冊中心④dubbo註解掃描

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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="provide-annotation"/>
    <!--配置協議(用dubbo協議在20880埠(dubbo協議預設埠)暴露服務)-->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!--配置註冊中心,以暴露服務地址-->
    <dubbo:registry address="zookeeper://192.168.110.11:2181"/>
    <!--配置dubbo註解掃描(註解式:利用dubbo的註解@Service來代替配置式的另外兩個配置)-->
    <dubbo:annotation package="com.bjsxt.dubbo.service.impl"/>
</beans>

    2. 服務消費方(下示例):①應用名②註冊中心③dubbo註解掃描④聲明調用暴露的具體服務介面的業務層實現類bean對象

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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="consumer-annotation"></dubbo:application>
    <!--配置註冊中心,暴露發現服務地址-->
    <dubbo:registry address="zookeeper://192.168.110.11:2181"/>
    <!--配置dubbo註解掃描-->
    <dubbo:annotation package="com.bjsxt.dubbo.service.impl"/>
    <!--配置服務消費者調用提供方暴露的服務介面的業務實現類bean對像-->
    <bean id="iTServiceConsumerImpl_SSM" class="com.bjsxt.dubbo.service.impl.ITServiceConsumerImpl_SSM"/>
</beans>

六、示例-簡單實現Dubbo項目:

  (〇)本人測試項目的環境搭建:

    ①maven下Java的quickstart模板②沒有用SSM框架③註冊中心選用zookeeper,安裝在Linux虛擬機中

    ④沒有面向對象三層架構中的持久層,只有數據類pojo/entity(測試數據自己在服務方暴露的服務介面的實現類的測試方法中自設定)

  (一)配置文件式

    1. 項目代碼:

      (1)服務提供方:

        ①數據類pojo/entity

package com.bjsxt.dubbo.pojo;

import lombok.Data;
import java.io.Serializable;

@Data
public class TestData implements Serializable {
    private Integer uid;
    private String uname;
}

        ②業務層service

          i. 暴露的服務介面

package com.bjsxt.dubbo.service;

import com.bjsxt.dubbo.pojo.TestData;
import java.util.List;

public interface ITPService_xml {
    //查詢測試數據
    List<TestData> selectTestData();
}

            ii. 暴露的服務介面的實現類

package com.bjsxt.dubbo.service.impl;

import com.bjsxt.dubbo.pojo.TestData;
import com.bjsxt.dubbo.service.ITPService_xml;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
 * spring框架中的@Autowired註解、@Resource註解和@Service註解
 * @Autowired註解 省去了 在xml中<bean>配置的 <property> 和在對應<bean> 類中 屬性的set、get方法
 * @Resource註解  和@Autowired註解 極為相似
 * @Service註解   省去了 在xml中<bean>的配置 ! 實現 xml零配置
 * 詳情:再說~
 */
@Service
public class ITPServiceImpl_xml implements ITPService_xml {
    //查詢測試數據(省略持久層,自定義測試數據)
    @Override
    public List<TestData> selectTestData() {
        ArrayList<TestData> list=new ArrayList<>();
        TestData testData=new TestData();
        testData.setUid(0);
        testData.setUname("fuck");
        list.add(testData);
        return list;
    }
}

      (2)服務消費方:

        ①數據類pojo/entity:同上

        ②業務層service:將服務提供方暴露的服務介面的代碼複製過來,即可

    2. 啟動方式:

      (1)服務提供方:

        ①API載入配置文件(本人沒寫這種方式)(可以參考下麵的服務消費方的啟動方式,也可以看Dubbo官網給出的示例代碼):

import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class Provider {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"});
        context.start();
        System.in.read(); // 按任意鍵退出
    }
}

        ②利用dubbo服務運行容器的main方法:

          前提:將spring配置文件安放在META-INF目錄下的spring目錄中,否則dubbo服務運行容器找不到spring配置文件

package com.bjsxt.dubbo;

import com.alibaba.dubbo.container.Main;
public class AppTest {
    /**
     * 通過載入spring配置文件,以啟動dubbo的服務運行容器Container
     * (該容器是spring類型的容器,
     *      dubbo配置式啟動方法,除了直接載入spring配置文件,
     *      再就是下麵的通過dubbo中的Main類載入spring配置文件
     *          ——該方法須要將spring配置文件放在“META-INF”目錄下的“spring”目錄中)
     */
    public static void main(String[] args) {Main.main(args);}
}

【運行結果·圖】(前提:已經啟動zookeeper註冊中心,註冊中心啟動成功圖略)(註:運行後,須手動關閉)

      (2)服務消費方:API載入配置文件

package com.bjsxt.dubbo;

import com.bjsxt.dubbo.pojo.TestData;
import com.bjsxt.dubbo.service.ITPService_xml;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
/**
 * 這裡只是簡單的測試一下,不涉及web,服務提供方也不涉及持久層
 */
public class AppTest {
    @Test
    public void test(){
        /*載入spring配置文件*/
        ApplicationContext ac=new ClassPathXmlApplicationContext("spring-consumer.xml");
        /*通過配置文件反射獲取暴露的服務介面的業務層對象*/
        ITPService_xml itpService_xml = ac.getBean("iTPService", ITPService_xml.class);
        /*獲取服務返回值*/
        List<TestData> list=itpService_xml.selectTestData();
        /*輸出*/
        System.out.println(list);
    }
}

【運行結果·圖】

  (二)註解式

    1. 項目代碼:

      (1)服務提供方:

        ①數據類pojo/entity:同上

        ②業務層service:同上

      (2)服務消費方:

        ①數據類pojo/entity:同上

        ②業務層service:

          i. 將服務提供方暴露的服務介面的代碼複製過來

            ii. 創建調用服務介面的消費方介面,及其實現類

package com.bjsxt.dubbo.service;

import com.bjsxt.dubbo.pojo.TestData;
import java.util.List;

public interface ITServiceConsumer_SSM {
    //顯示測試數據
    List<TestData> show();
}
package com.bjsxt.dubbo.service.impl;

import com.alibaba.dubbo.config.annotation.Reference;
import com.bjsxt.dubbo.pojo.TestData;
import com.bjsxt.dubbo.service.ITService_SSM;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ITServiceConsumerImpl_SSM implements com.bjsxt.dubbo.service.ITServiceConsumer_SSM {
    @Reference
    private ITService_SSM itService_ssm;
    @Override
    public List<TestData> show() {
        return itService_ssm.selecte();
    }
}

    2. 啟動方式:

      (1)服務提供方:同上

      (2)服務消費方:同上

  (三)對比兩種方式的不同:

    1. 服務提供方

      (1)配置文件:①配置文件式:

                  i. 需要專門配置:暴露的服務介面、聲明暴露的服務介面的業務層實現類的bean對象

                 ii. 不需要配置:dubbo註解掃描

             ②註解式:

                  i. 需要專門配置:dubbo註解掃描

                 ii. 不需要配置:暴露的服務介面、聲明暴露的服務介面的業務層實現類的bean對象

         (2)註解:①配置文件式:業務層中,暴露的服務介面的實現類的註解@Service是spring框架的

           ②註解式:業務層中,暴露的服務介面的實現類的註解@Service是dubbo依賴的

    2. 服務消費方:

      (1)配置文件:①配置文件式:

                  i. 不需要配置:dubbo註解掃描

             ②註解式:

                  i. 需要專門配置:dubbo註解掃描

                 ii. 不需要配置:暴露的服務介面、聲明暴露的服務介面的業務層實現類的bean對象

         (2)註解:註解式:業務層中,暴露的服務介面的實現類里:①註解實現類的@Service是dubbo依賴的②聲明服務提供方暴露的服務介面的實現類對象的屬性的註解是dubbo依賴里的@Reference



 

七、個人總結:

  1. 配置文件:

    (1)服務提供方必須有的配置參數:提供方應用名、協議、註冊中心

    (2)服務消費方必須有的配置參數:消費方應用名、註冊中心

  2. 配置式區別於註解式之處

    (1)配置文件-服務提供方:須要具體配置每一個暴露的服務介面,以及該介面所對應的實現類bean對象;註解式則只需要配置dubbo掃描即可

    (2)配置文件-服務消費方:須要配置所要調用的服務介面(提供方暴露的);註解式則須要再多配置dubbo掃描、自身調用服務介面(提供方暴露的)的實現類

    (3)業務層-服務提供方:服務介面(暴露的)的實現類中,使用spring的@Service註解該實現類;註解式則須要用dubbo的@Service(com.alibaba.dubbo.config.annotation.Service;)來註解該實現類

    (4)業務層-服務消費方:

        ①配置式的消費方,可以在啟動時(消費方的啟動方式只有API載入配置文件這一種)通過反射設直接生成被調用的服務介面的對象(多態+反射),利用該對象完成操作

        ②註解式的消費方,是通過自身創建的某個介面的實現類,在這個實現類裡面去調用提供方暴露的服務介面

                i.須要用dubbo的@Service(com.alibaba.dubbo.config.annotation.Service;)來註解該實現類;

                  ii. 這個實現類裡面需要聲明被調用的服務介面(提供方暴露的)的對象,該對象須要用dubbo的@Reference(com.alibaba.dubbo.config.annotation.Reference;)來註解

                                                  (不可以用spring的@Resource來註解)

  3. 配置式相同於註解式之處:都須要將服務提供方暴露的服務介面的源文件複製到服務消費方的業務層中

  4. 啟動方式:

    (1)API載入xml配置文件:略(詳情見上面的示例)

    (2)dubbo服務運行容器啟動:

        ①只限於服務提供方(因為只有服務提供方有dubbo服務運行容器,可參考Dubbo架構圖)

        ②須要將配置文件放置在META-INF目錄下的spring目錄中(目錄名不可以拼錯!!!否則會找不到配置文件的)

        ③使用dubbo的Main類(com.alibaba.dubbo.container.Main;)的main方法啟動


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

-Advertisement-
Play Games
更多相關文章
  • 本文主要學習了在Java1.8中新增的Collector介面和Collectors工具類,以及使用它們在處理集合時的改進和優化。 ...
  • 模塊安裝 Windows 安裝scrapy 需要安裝依賴環境twisted,twisted又需要安裝C++的依賴環境 pip install scrapy 時 如果出現twisted錯誤 在https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下載對應的Twiste ...
  • me:5次 標準答案:5 次,因為從 0 開始,到 10 結束,步進為 2。 1. 下麵的迴圈會列印多少次"I Love FishC"? me:錯誤,迴圈應該使用的是一個數組,比如range() 標準答案:會報錯,上節課的課後習題我們提到了 in 是“成員資格運算符”,而不是像 C 語言那樣去使用 ...
  • 概述首先同步下項目概況:上篇文章分享了,路由中間件 - 日誌記錄,這篇文章咱們分享:路由中間件 - 捕獲異常。當系統發生異常時,提示 “系統異常,請聯繫管理員!”,併發送 panic 告警郵件。什麼是異常?在 Go 中異常就是 panic,它是在程式運行的時候拋出的,當 panic 拋出之後,如果在 ...
  • [TOC] 這篇博客及之後的系列,我會向大家介紹各種驗證碼的識別。包括普通圖形驗證碼,極驗滑動驗證碼,點觸驗證碼,微博宮格驗證碼。 一.普通圖形驗證碼 之前的博客已向大家介紹了簡單的圖形驗證碼的處理過程,但是會和實際的有所差別,這是因為驗證碼內的多餘線條與圖案干擾了圖片的識別。因此,對於這種情況,需 ...
  • 前言 Java文件的運行過程: 1,javac.exe:編譯器 2,java.exe:解釋器 微軟shell下運行實例: C:\Users\Administrator>cd D:\文檔\JAVALIAnxi\ C:\Users\Administrator>d: D:\文檔\JAVALIAnxi>ja ...
  • 把所有的節點用一根直線串起來 連續存儲[數組] 什麼叫做數組:元素類型相同,大小相等 重點看代碼吧,需要註意的都在註釋里,多敲幾遍,當然了,有些功能還沒有實現,以後再實現 ...
  • 概述首先同步下項目概況:上篇文章分享了,路由中間件 - Jaeger 鏈路追蹤(理論篇)。這篇文章咱們分享:路由中間件 - Jaeger 鏈路追蹤(實戰篇)。說實話,這篇文章確實讓大家久等了,主要是裡面有一些技術點都是剛剛研究的,沒有存貨。先看下咱們要實現的東西:API 調用了 5 個服務,其中 4 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...